git commit을 할 때 amend 옵션이 있습니다. 이 옵션은 무엇을 하는 것일까요?

 


 제 test 브랜치에는 modify 1.txt 2 ... 어쩌고의 commit message가 있는 커밋이 하나 있습니다. 해시는 39b1a2a8입니다. "1.txt" 라는 파일만 변경되었는데요.

 

 

 4, 5가 추가되었습니다. 아차. 그런데 제가 6을 추가하는 것을 깜빡했나 보군요. 1.txt의 맨 끝에 6을 추가합니다. 그리고 Amend 옵션을 붙여서 커밋해 보겠습니다.

 

 

 Amend는 현재 branch의 lastest commit을 변경합니다. 덮어 씌운다고 보면 되겠습니다. Amend를 체크하고 커밋을 해 보겠습니다. 이것을 LAST'라고 하겠습니다.

 

 

 커밋 메세지를 다시 수정하고, Amend commit을 눌러보겠습니다.

 

 

 이제 다시 커밋 로그를 볼까요?  그러면, a2d2462e라는 커밋이 있음을 알 수 있는데요. 커밋의 해시 값이 39b1a2a8이였는데, a2d2 어쩌고로 바뀌었습니다.

 

 

 1.txt의 변경 내역을 보면, 4, 5, 6이 추가되었음을 볼 수 있어요. 어떻게 되었는가? 도식화 해서 그려봅시다.

 

 


 기존에 1.txt에 4, 5를 append 하는 커밋이 test의 lastest 커밋이였습니다.

 

 

 그런데, lastest 커밋에서 빠트린 내용이 있어서 "1.txt"에 6을 append를 하고 amend를 시켰습니다. 그러면, 6을 append 한 것까지 덮어 씌워져 버립니다. lastest commit이 4, 5를 뒤에 append 하는 것이였고, 추가로 6을 append 한 것이였기 때문입니다.

 

 

 그런데, 커밋 메세지가 마음에 들지 않는다고 제가 커밋 메세지까지 수정해서 다시 amend를 시켜 버렸습니다.

 

 

 그러면 last'가 다시 last''으로 대체됩니다. 아예 다른 커밋이 되어 버립니다. hash값이 바뀐 것만 봐도 알 수 있습니다. 그런데, 원격 테스트 브랜치에서는 lastest commit이 대체되기 전 last였습니다. 바로 push 해 버리면 충돌이 날 수 밖에 없습니다. 이제, 다른 개발자가 test 브랜치의 1.txt에, 3과 4 사이에 8을 추가했다고 해 봅시다.

 


 다른 개발자가 8이라는 기능을 추가한 경우, 무작정 force push하면 위험할 겁니다. 어떻게 해야 할까요? 저는 1.txt에 6, 7, 8이 append 된 것도 같이 반영시키고 싶습니다. test branch를 pull 해 보겠습니다.

 

 

 충돌이 났다고 뜨네요. 왜냐하면, 제 test 브랜치에도 1.txt에 추가적인 수정사항이 있었고, 원격에도 1.txt에 대해 추가 수정사항이 있었기 때문입니다.

 

 

 하아. 이런 상황은 꽤 자주 벌어집니다. 일단 <<<< HEAD는 제 로컬에서의 변경 사항입니다. 일단 뒤에 5, 6, 7은 들고 갑니다. 다음에 3과 4 사이에 8이 와야 하므로 merge를 하려면 1 2 3 8 4 5 6 7 이렇게 되어야 할 겁니다.

 

 

 1.txt를 이렇게 바꾼 다음에, git add 명령어를 이용해서 1.txt가 modified 되었다는 정보를 추가해 주겠습니다.

 

 

 요래 입력한 다음에 intellij나 pycharm 같은 ide에서 commit & push를 하겠습니다.

 

 

 remote test1 branch에 잘 들어갔음을 볼 수 있습니다.