인라인으로 의견을 드립니다.
2013년 5월 29일 수요일 오전 9시 44분 11초 UTC+9, ddumbugie 님의 말:
안녕하세요. 윤기현입니다.
git에서 커밋 메시지를 바꿀 수 있나요?
현재까지 제가 알고 있는 것입니다.
push하기 전에 amend 옵션으로 바꾸는 것은 가능하다.
그러나, push가 이뤄지고 나면 불가능하다.
커밋 메시지를 바꾸는 방법은 두 가지 정도가 있습니다.
- git commit --amend
- git rebase -i
rebase -i 는 rebase 를 interactive 하게 하는 것인데 리베이스중에 특정 commit 에 대해서 amend 할 수 있습니다.
commit 은 하나의 객체로서 커밋 메시지, 저자(author) 와 tree 객체에 대한 참조를 물고 있는 것이어서 이들 메시지를 수정하게 되면 또 다른 commit이 나오게 되므로 다른 커밋이 된다.
svn에서는 커밋 객체와 그 메시지를 별개의 프로퍼티여서 수정이 가능했지만, git에서는 쉽지 않다.
예를 들어 a-b-c-d-e (a가 root commit) 커밋 히스토리가 있다고 가정해봅시다. 여기서 c 의 커밋메시지를 git rebase -i 로 수정하면 말씀하신데로 d와 e의 SHA-1 값이 변경되어 이론적으로 완전히 다른 커밋이 됩니다. 그런데 SHA-1 ID 값만 바뀌고 나머지 내용들은 바뀌는게 없으므로 사실 SVN과 다를게 없습니다.
책에서 달라진다고 하는 이유는 (또 이 부분이 중요한 이유는) 커밋의 식별자인 SHA-1 값이 바뀌어서 더이상 해당 ID로 커밋을 찾는 것이 불가능해지기 때문입니다. 그래서
- 만약 위에서 c 라는 커밋을 바꿨다는 사실은 팀원들이 모두 알 수 있게 메일이나 구두로 알려주고
- 모두 repository 를 업데이트 한다면 (e.g. git pull, git remote update, 혹은 완전히 새로 받는)
딱히 문제될것은 없습니다. 사실, 소규모 팀이면서 빠르게 상호작용을 하는 팀이라면 이런일이 몇 번 일어난다고 큰 문제가 되지는 않습니다. (생각보다 간단하므로)
회사에 커밋 규칙이 있습니다.
이를 어기거나 정확하게 지키지 못한 경우에 나중에 폐해가 심각해집니다.
사람들은 규칙을 잘 지키다가도 한 사람이 어기기 시작하면 그래도 되는가 보다 하고 지키지 않게 됩니다.
아주 좋은 문화를 갖고 계십니다.
각 로컬 레파지토리에 commit-msg HOOK을 설치하도록 해놨는데, 깜빡 까먹어 버리면 문제가 됩니다.
이런 경우에 대한 방지책이 사후 대비방법이 있을까요?
위에 말씀드린데로
- 팀원들에게 remote 에 올라온 커밋 히스토리 (메시지)를 수정한다고 공지를 하고
- git rebase -i 를 이용해서 원하는 커밋을 수정 후 remote 에 push 하고
- 팀원들에게 완료되었으니 update 하고, 변경사항이 로컬에도 잘 반영되었는지 확인을 하고 작업하라
고 하시면 되겠습니다.
도움을 요청드립니다.