Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Git] git rebase interactive, git rebase -i, squash (커밋 합치기, 스쿼시, 중간에 커밋 넣기, 커밋 순서 바꾸기, conflict 해결 방법) 본문

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 log --graph (가장 위가 최신)

  • git rebase -i를 사용하여 add 3add 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

* 참고

https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History

Comments