버전 관리 시스템을 사용할 때, 이전 커밋 메세지를 수정하는 것은 흔한 일이다. 서브버전(svn)은 리비전 번호를 사용하여 간단하게 커밋 메세지를 수정할 수 있지만, git은 서브버전만큼 간단하지는 않다. 특히, 윈도우 환경에서 git을 사용한다면 텍스트 에디터 구동 문제를 해결해야 한다.
git에서 바로 이전의 커밋 메세지를 수정하는 것은 간단하다. 텍스트 에디터가 구동 여부에 따라
git commit --amend
또는
git commmit --amend -m "..."
명령을 사용하여 커밋 메세지를 수정할 수 있다. 그러나, 훨씬 이전의 커밋 메세지를 수정하고자 한다면 rebase 명령을 사용해야 하며, 대화식 진행을 해야 하기 때문에 텍스트 에디터가 지정되어 있지 않다면 매우 곤란하다. 윈도우 환경에서 텍스트 에디터를 지정하는 방법은 다음을 참고하라: http://celdee.tistory.com/807 또, msysgit 1.9.5 이하 버전은 rebase 명령에서 텍스트 에디터가 제대로 동작하지 않기 때문에, 반드시 git for Windows 2.5.3 이상 버전을 사용해야 한다.
먼저, git log 명령을 사용하여 어느 커밋을 수정할지 살펴보고, rebase 명령을 사용하여 수정하고자 하는 커밋을 선택한다.
git rebase -i HEAD~N
head에서부터 몇 번째 커밋인지에 따라 N에 적절한 숫자를 입력하면 된다. 모든 것이 제대로 되었다면, 텍스트 에디터에 해당 커밋 목록이 다음 형식으로 출력된다:
pick d02a9caw1 commit message 1
pick ca00982bc commit message 2
pick c1892ab2e commit message 3
...
...
첫 컬럼은 커밋을 어떻게 처리할지 나타내는 명령이고, 두번째는 커밋의 해시, 마지막 컬럼은 커밋 메세지다. 여기서, 수정하고자 하는 커밋의 pick 명령을 reword 명령으로 수정하고 커밋 목록을 저장한 뒤 텍스트 에디터를 종료한다. 이후, git은 커밋 목록을 처리하면서 해당 커밋의 수정한 명령을 실행하는데, reword는 커밋의 메세지를 수정한다. 단순히 해당 리비전만 수정하는 서브버전과 달리, git은 커밋 목록의 커밋들을 역순으로 다시 처리하며 수정하기 때문에, 커밋 메세지 수정 방법이 서브버전에 비해 복잡하다.
이미 리모트 저장소에 반영한 커밋의 로그를 수정하는 것은 쉽지 않다. 로컬 저장소의 로그를 수정한 뒤 리모트 저장소에 push 작업을 진행한다면, 로그만 수정되는 것이 아니라 새로운 커밋이 추가되어 다른 가지가 생성된다. 원하는 결과를 얻으려면 리모트 저장소를 삭제하고, 수정된 로컬 저장소 전체를 다시 push 해야 한다.