Original article: Git Undo Merge – How to Revert the Last Merge Commit in Git

브랜치는 이미 프로덕션에 있는 코드를 함부로 변경하지 않으면서 작업할 수 있도록 해주는 깃의 필수적인 부분입니다.

다른 브랜치에서 작업을 마친 후 main 브랜치에 병합(merge, 이하 머지)하여 방금 통합한 기능이나 버그 수정을 반영하고자 할 것입니다.

만약 작업을 더 해야 했다는 사실을 머지 완료 후 알아차렸다면, 혹은 실수로 머지를 했다면 어떻게 해야할까요?

깃에서는 거의 모든 것을 되돌릴 수 있습니다. 이 글에서는 마지막으로 커밋한 상태로 되돌릴 수 있도록 머지를 실행 취소하는 방법을 보여드리겠습니다.

깃에서 머지 커밋을 실행 취소하는 방법

깃의 reset command to undo a merge.

우선, 커밋 hash (혹은 id)를 확인해야 이전의 커밋으로 돌아갈 수 있습니다.

hash를 확인하기 위해서는 git log 혹은 git reflog를 실행하세요. 더 읽기 쉬운 git reflog가 더 나은 옵션이 될 수 있습니다.

ss1-2

되돌리려는 커밋의 hash를 얻었다면, git reset --hard commit-before-the-merge를 실행하세요:

ss-2-5

명령을 실행하면 코드 에디터에서 몇 가지 항목이 제거되는 것을 보게 될 것입니다.

마지막 커밋의 hash가 명확하지 않다면, git reset --hard HEAD~1을 실행하여 머지 이전 커밋으로 돌아갈 수 있습니다:

ss-3-3

유의해야 할 점은 --hard 플래그를 사용하여 머지 실행 취소할 경우, 커밋되지 않은 모든 변경 내용이 되돌려진다는 것입니다.

깃에서 머지를 되돌리는 더 좋은 방법

깃에서는 커밋되지 않은 변경 사항을 되돌리는 위의 방법을 보완하여 더 안전한 --merge 플래그를 제공합니다.

--merge 를 사용하여 머지를 실행 취소하려면 git reflog 를 실행하여 커밋의 hash를 확인한 다음 git reset --merge previous-commit을 실행하세요:

ss4-1

--merge 플래그와 더불어 HEAD 키워드를 사용한 git reset --merge HEAD~1 명령어도 쓸 수 있습니다:

ss5

참고: --merge 플래그를 쓸 때 해당 명령에 대한 응답을 받지 못하더라도 걱정하지마세요. 작동은 제대로 합니다.

마치며

지금까지 깃을 더 효율적으로 사용할 수 있도록 실수로 혹은 원치 않은 머지를 실행 취소하는 방법을 배웠습니다.

--hard 플래그는 커밋되지 않은 변경 사항을 제거하고, --merge 플래그는 커밋되지 않은 변경 사항을 유지한다는 것이 머지 되돌리기의 요점입니다.

읽어주셔서 감사합니다!