Interactive rebase는 commit 편집기야
git rebase -i <base>는 <base>와 현재 HEAD 사이의 commit을 한 줄씩 보여주는 편집기를 열어. 줄을 고쳐 Git에 지시할 수 있어. 이 commit은 유지하고, 저 commit은 버리고, 둘의 순서를 바꾸고, 하나는 합치고, message를 고치고, 어느 지점에서는 멈춰 amend하라는 식이지. 저장하고 닫으면 Git이 그 script대로 commit을 새로 replay해. 결과는 같은 내용, 또는 네가 편집한 내용에 도달하는 다른 모양의 이력이야.
각 줄 앞의 동사가 명령이야. pick은 변경을 그대로 재생하고, reword는 변경은 유지한 채 message를 다시 써. edit는 그 commit에서 멈춰 git commit --amend하게 하고, 끝나면 git rebase --continue로 이어가. squash는 앞 commit에 합치며 message도 결합하고, fixup은 합치되 이 commit의 message는 버려. drop은 commit을 없애. 줄을 옮기면 commit 순서가 바뀌고 줄을 지우는 것도 drop과 같아.
가장 흔한 쓰임은 git rebase -i main으로 merge 전 feature branch를 정리하는 거야. WIP 보정을 원래 commit에 합치고, 버린 실험을 drop하고, 흐린 message를 reword해. commit 열 개를 논리 단위 세 개로 다시 구성할 수도 있어. 특정 옛 commit을 고치려면 git rebase -i <hash>~1에서 대상을 edit으로 바꾸고 수정한 뒤 git rebase --continue해.
안전과 관련해 둘을 기억해. Rebase는 이력을 다시 써. 새 parent와 새 hash의 commit을 만들기 때문에 이미 push했고 남이 쓴 이력이라면 조율이 필요해. Rebase는 되돌릴 수 있어. push 전에는 git reset --hard ORIG_HEAD로 돌아갈 수 있고 push 뒤에도 reflog가 rebase 전 tip을 90일 보관해. conflict에서는 Git이 크게 멈춰주고 reflog로 회복할 수 있어.