15장에서 미리 언급했던 대화형 리베이스는, 단순히 브랜치를 다른 지점으로 옮기는 것을 넘어 커밋 자체를 합치고 순서를 바꾸고 메시지를 고칠 수 있는 Git에서 가장 강력한 히스토리 편집 도구다. 이 장은 그 편집 절차를 단계별로 다룬다.
개요
| |
이 명령을 실행하면 편집기(02장에서 설정한 core.editor)가 열리고, 대상 커밋들이 오래된 순서대로 나열된 목록(todo list)이 나타난다.
| |
각 줄 맨 앞의 단어(pick 등)를 원하는 명령으로 바꾸고 저장하면, Git이 그 지시에 따라 커밋들을 하나씩 재적용한다.
기본 개념
이 목록에서 주의할 점은 커밋이 위에서 아래로, 즉 오래된 것부터 최신 순으로 나열된다는 것이다 — git log(09장)의 기본 출력(최신이 위)과 정반대다. “오타 수정” 커밋을 그 직전 커밋(“로그인 폼 UI 추가”)에 합치고 싶다면, 목록에서 아래 커밋(시간상 나중)의 명령을 squash(또는 fixup)로 바꾼다 — squash/fixup은 항상 “바로 위 줄(=시간상 이전 커밋)에 합친다"는 의미이기 때문이다.
| |
종류/세부
자주 쓰는 조합
| 상황 | 조작 |
|---|---|
| 실수로 남긴 “오타 수정”, “console.log 제거” 같은 자잘한 커밋을 정리 | 해당 줄을 fixup으로 바꿔 관련 커밋에 흡수 |
| 커밋 메시지의 오타나 부족한 설명을 고치고 싶음 | 해당 줄을 reword로 바꾸면, 저장 후 그 커밋의 메시지만 다시 편집하는 창이 열림 |
| 커밋 순서를 바꾸고 싶음 | 목록에서 해당 줄을 원하는 위치로 잘라 옮김(단, 서로 의존하는 커밋의 순서를 바꾸면 충돌·빌드 실패 위험) |
| 특정 커밋에서 파일을 하나 더 추가하거나 코드를 고치고 싶음 | 해당 줄을 edit으로 바꾸면, 그 커밋에서 리베이스가 멈추고 수정 후 git rebase --continue로 이어감 |
| 필요 없어진 실험적 커밋을 아예 없애고 싶음 | 해당 줄을 drop으로 바꾸거나, 줄 자체를 삭제 |
자동 fixup(--autosquash)
커밋을 만들 때부터 나중에 합칠 대상을 미리 표시해두면, 대화형 목록을 손으로 재배열하지 않고도 자동으로 정리할 수 있다.
| |
이 조합은 코드 리뷰 중 “이 부분 놓쳤어요” 같은 피드백을 받을 때마다 즉시 --fixup 커밋을 만들어두고, 나중에 병합 직전 한 번에 정리하는 워크플로에 유용하다.
주의사항·함정
여기서도 “공유된 커밋을 리베이스하지 않는다"는 15장의 황금률이 그대로 적용된다: 대화형 리베이스는 결국 일반 리베이스와 마찬가지로 커밋 해시를 재작성한다. 아직 push하지 않은 로컬 커밋, 또는 자신만 쓰는 개인 기능 브랜치에서만 안전하게 쓸 수 있다.
squash/fixup 순서를 반대로 착각하기 쉽다: 위에서 설명한 “squash는 바로 위 줄에 합쳐진다"는 규칙을 반대로 기억하면, 의도와 다른 커밋에 변경이 흡수된다. 헷갈린다면 목록을 저장하기 전에 각 줄이 어떤 커밋을 가리키는지 커밋 메시지로 한 번 더 확인하는 편이 안전하다.
충돌이 나면 커밋별로 여러 번 해결해야 할 수 있다: 15장에서 다룬 것과 동일하게, 재정리 대상 커밋 여러 개에서 각각 충돌이 날 수 있다. git rebase --continue로 하나씩 넘어가며 해결하고, 복잡하다고 판단되면 git rebase --abort로 시작 전 상태로 되돌릴 수 있다는 안전망을 기억해둔다.
![Featured image of post [Git] 27. git rebase -i — 인터랙티브 리베이스](/post/git/git-rebase-interactive-mode/wordcloud_hu_cd04b280a9a76282.webp)
![[Git] 25. git restore와 git checkout -- <file>](/post/git/git-restore-checkout-file-discard-changes/wordcloud_hu_cd1210130e27a947.webp)
![[Git] 26. git cherry-pick](/post/git/git-cherry-pick-command/wordcloud_hu_2a527478bbed902.webp)
![[Git] 27. git rebase -i — 인터랙티브 리베이스](/post/git/git-rebase-interactive-mode/wordcloud_hu_31933fe2155d80d4.webp)
![[Git] 28. git reflog — 실수 복구](/post/git/git-reflog-command-recover-lost-commits/wordcloud_hu_67933a4c82ea14b7.webp)
![[Git] 29. git stash — 임시 저장](/post/git/git-stash-command-temporary-storage/wordcloud_hu_57c9490aefdb3cf2.webp)
![[Git] 08. git commit — 커밋 작성 규칙](/post/git/git-commit-command-writing-good-commits/wordcloud_hu_b27461e0d97eff2a.webp)
![[Git] 13. git merge — 병합과 충돌 해결](/post/git/git-merge-command-and-conflict-resolution/wordcloud_hu_fd1543b374ae452a.webp)
![[Git] 15. git rebase — 히스토리 재배치](/post/git/git-rebase-command-rewriting-history/wordcloud_hu_326a73b9e72fabfc.webp)
![[Git] 16. merge vs rebase 선택 기준](/post/git/merge-vs-rebase-choosing-criteria/wordcloud_hu_2d0667c2865989d3.webp)
![[Git] 07. git diff — 변경 비교](/post/git/git-diff-command-compare-changes/wordcloud_hu_3b0ce1ca4361f1f6.webp)