Git, CocoaPods, Xcode, Shell/Git
[Git] git rebase interactive, git rebase -i, squash (커밋 합치기, 스쿼시, 중간에 커밋 넣기, 커밋 순서 바꾸기, conflict 해결 방법)
jake-kim
2023. 4. 29. 23:36
Git rebase interactive
- 기존의 커밋을 수정, 삭제, 이동, 생성이 가능
사용 방법
- git rebase -i 옵션 또는 git rebase --interactive로 사용
- 커밋아이디 그 다음 부터 현재 커밋까지 모든 커밋을 가져옴
git rebaes -i 커밋아이디
- 커밋아이디를 사용해도 되지만 *HEAD를 사용해서 편리하게 사용도 가능
- *HEAD: 현재 작업 중인 브랜치의 가장 최신 커밋
- 기본적으로 git rebase -i 명령어 실행 시 HEAD는 현재 브랜치에서 가장 최신 커밋을 가리킴
- HEAD~3은 최신 커밋으로부터 HEAD포함하여 3번째까지 가져옴
- 입력하면 5가지 옵션 사용이 가능
pick - 커밋 순서를 재정렬하거나 해당 커밋을 수정 없이 그대로 사용한다는 의미
reword - 커밋 메시지 수정
edit - 커밋 수정
squash - 이전 커밋과 merge하여 단일 커밋으로 변경
fixup - squash와 비슷하지만 기존 커밋 메시지를 무시
drop - 커밋을 삭제
- 5가지 옵션을 중 원하는 동작을 선택하고 continue를 통해 작업을 완료
git rebase --continue
사용해보기
- 초기 상태
git log --graph
(위가 최신이고 아래로 갈수록 예전 커밋)
- git rebase -i를 사용하여 add 3과 add 2 커밋 합치기
- git rebase -i {add2 이전 커밋 id}
- 주의할점 - 수정하려는 커밋의 이전 커밋 id를 입력해야 수정하려는 커밋을 컨트롤 가능
% git rebase -i 9a5dcb653b900996555997b913f14eeabf4fe64a
주의) git log --graph에서 최신 커밋은 맨 위였지만 git rebase -i해서 나온 커밋의 최신은 반대 (맨 밑이 최신)
참고)
pick - 커밋 순서를 재정렬하거나 해당 커밋을 수정 없이 그대로 사용한다는 의미
reword - 커밋 메시지 수정
edit - 커밋 수정
squash - 이전 커밋과 merge하여 단일 커밋으로 변경
fixup - squash와 비슷하지만 기존 커밋 메시지를 무시
drop - 커밋을 삭제
- 2와 3을 합쳐야하므로 add 3 커밋을 squash하면 이전 커밋인 add 2와 합쳐지게 됨
- i를 눌러 insert모드에 들어간 후 s (squash) 입력
- 기대결과: add 3과 add 2 합침
- 입력 후 > esc > :wq 입력하면 아래처럼 커밋 메시지 수정할 수 있는 vim 모드 등장
- add 2와 add 3만 수정하면 완료 (#으로 시작하는 문구는 단순히 설명 문구이며 무시됨)
- 이대로 바로 저장하기위해서 :wq 입력
- git log --graph로 확인
- 합쳐진 것을 확인
- vim에서 pick을 이용하여 단순히 위치만 바꿔주기만 하면 순서도 변경 가능
- add 2를 최신 커밋으로 이동하려면?
git rebase -i HEAD~3
- 여기서 pick f966424 add 2를 add 4아래로 이동
- 아래처럼 수정 후 :wq 입력
- conflict 발생
rebase interactive 중 conflict 해결 방법
- 위처럼 conflict이 난 경우 아래 단계를 통해 해결이 가능
- 1) conflict 발생한 파일 수정
- 2) 수정된 파일을 스테이징 영역에 추가 git add .
- 3) 다음 커밋으로 이동 git rebase --continue
- 4) 만약 conflict가 여전히 남아 있다면 다시 2, 3번을 반복
- (rebase interactive를 다시 포기하고 원복하고 싶다면 git rebase --abort)
- conlict를 해결하기 위해서 원본 파일 확인
- vscode로 test.txt 열면 컨플릭 쉽게 확인이 가능
- 현재 add 1 커밋에 위치한 상태이고 (현재 HEAD인 상태), 그리고 b0454a1은 가장 최신 커밋 add 4 상태
- add 1커밋은 1만 위치하면 되므로 1만 놓고 저장
- 수정된 내용을 stage에 올리기
git add .
- 컨티뉴 - 다음 커밋으로 이동
git rebase continue
conflict이 없다면 완료)
- rebase가 종료되었는지 확인 git status
% git status
On branch main
nothing to commit, working tree clean
(최종 파일 - add 4를 지웠기 때문에 add 4커밋도 지워짐)
- 그래프로 확인
git log --graph
(만약 위에서 add 4를 지우지 않았으면 add 4커밋도 생성되어 있을것)
* 전체 코드: https://github.com/JK0369/ExRebase
* 참고