안녕하세요. 이번 시간에는 git revert에 대해서 간단하게 알아보겠습니다.

 


 먼저, 현재 제 git graph입니다.

 

 7 line add 커밋을 HEAD가 가리키고 있습니다. 이 커밋이 가장 최신입니다. 5 line add, 6 line add, 7 line add 순으로 커밋이 쌓인 셈입니다. 각각 HEAD~2, HEAD~1, HEAD를 의미합니다. git revert는 되돌리기를 하면서 기록을 커밋에 남깁니다. 이 점이 중요합니다. git revert HEAD~3..HEAD~1을 입력해 보겠습니다.

 

 요렇게 범위를 주면, HEAD~3 커밋으로부터 HEAD~1의 커밋 상태가 되기 까지 변경사항을 revert 합니다. HEAD는 7 line add를 가리킵니다. HEAD~1은 6 line add, HEAD~2는 5 line add를 가리킵니다. Revert "5 lines add", 964597ea 입장에서, HEAD~1 커밋까지 가려면 변경사항을 어떻게 쌓아야 할까요? HEAD~2, HEAD~1이 쌓여야 합니다. 즉 5 line add와 6 line add가 쌓여야 합니다. 고로, 5번 줄이 추가된 변경사항과, 6번 줄이 추가된 변경사항을 되돌립니다.

 

 여기까지 별로 어렵지 않죠? 그런데 진행하다 보니 충돌이 났다고 그러네요. 어느 단계에서 충돌이 났을까요?

 

 Revert "6 line add"라고 뜨네요. commit c2ed6b를 되돌리는 과정에서 충돌이 났다고 하는군요? 이럴 때에는, c2ed6b가 어떻게 변경되었는지 보는 것이 중요합니다.

 

 

 6이 추가되었다는군요. 그러므로, 6만 제거합니다.

 

 요래 제거한 다음에 git add .을 입력한 다음에 commit을 하시면, 아래와 같은 커밋이 생성되었음을 볼 수 있습니다.

 

 6이 추가된 커밋을 되돌리는 커밋은 6을 제거하는 것입니다. 왠만하면 이 쌍을 지켜주는 것이 좋습니다.

 


 그런데 아직 revert가 끝난 것이 아닙니다. 고로, git revert --continue를 입력하겠습니다. 그랬더니, 또 충돌이 난다고 하네요. 보나마나, "5 line add" 커밋에서 충돌이 나는 것입니다.

 

 

 5 line add 커밋을 보니까, 2.txt에 5가 추가되었습니다. 고로, 이것만 제거해 주면 됩니다.

 

 그러면 5 line add 커밋을 revert 했다는 기록도 잘 남게 됩니다. 사실 한번에 5와 6을 제거하는 식으로 할 수도 있었겠지만, 추적하기가 쉽지 않습니다. 굳이 그렇게 하려면 revert를 쓰지 말고, 하나의 커밋을 만들어놓습니다. 어느 커밋 해쉬를 돌렸는지 상세하게 적어주는 식으로 대응하는 게 좋지 않을까 싶습니다.

 

 이제, git graph를 보겠습니다. 그러면 6 line add 커밋을 Revert했다는 기록과 5 line add 커밋을 Revert 했다는 커밋이 들어오게 됩니다. 되돌렸다는 커밋이 제 git graph에 남아 있다는 것을 보시면 됩니다.