GitNotes.7-4.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 7.4: merge 작업 되돌리기

원격 저장소에 아직 push 되지 않은 merge 작업 되돌리기

만약 merge 작업을 수행하긴 하였지만 원격 저장소에 아직 push 를 하지 않은 상태라면 아래에 소개된 일반적인 커밋 되돌리기와 유사한 과정을 통해 merge 작업을 되돌릴 수 있다.

reset 을 이용한 방법은 merge 커밋 자체와 해당 커밋 이후 브랜치에 추가된 모든 커밋들을 되돌리기에 가장 간단한 방법이다. 그러나, 이렇게 reset 을 하려면 되돌아갈 대상 커밋의 SHA 해시값을 알아야 하는데, git log 의 결과는 merge 한 두 브랜치 모두의 커밋 목록을 보여주기에 되돌아가고자 하는 정확한 커밋을 알아내기가 어려울 수 있다. 만약 잘못된 커밋을 지정하여 reset 을 수행한다면 (예: 되돌아가고자 하는 브랜치가 아닌 merge 의 대상이 되었던 브랜치의 커밋을 지정한다던가) 이전에 커밋하였던 작업 내역이 유실될 수 있다.

git reset --hard <작업 중이던 브랜치의 마지막 커밋>

혹은, 만약 되돌리고자 하는 merge 커밋 자체가 가장 최근에 추가된 커밋이라면:

git reset HEAD~

revert 를 이용하는 방법은 이미 커밋된 어떠한 작업도 무효화하지 않는다는 점에서 더욱 안전한 방법이나, 이후에 해당 브랜치와의 merge 를 다시 수행하고 싶다면 revert 한 커밋을 다시 revert 해야 한다는 점에서 추가적인 작업이 더 필요한 방법이기도 하다 (아래 섹션을 참고하라).

원격 저장소에 push 완료된 merge 작업 되돌리기

아래와 같이 'add-gremlins' 라는 새로운 feature 를 추가하는 상황을 고려해보자

git merge feature/add-gremlins ... # merge conflict 을 해결한다 ... git commit # merge 작업을 커밋한다 ... git push ... 501b75d..17a51fd master -> master

역주: gremlin 을 사전에서 찾아보면 다음과 같이 정의되어 있습니다 - 그렘린(기계에 고장을 일으키는 것으로 여겨지는 가상의 존재)

이 작업 이후에, merge 를 수행한 feature 가 다른 개발자들의 시스템 상에서 문제를 일으키는 것으로 밝혀진 경우, 실제 문제를 수정하기에는 시간이 걸리므로 아래와 같이 우선적으로 merge 작업 자체를 되돌릴 수 있다.

git revert -m 1 17a51fd ... git push ... 17a51fd..e443799 master -> master

이 시점에서는 시스템에 문제를 일으켰던 feature 가 원격 저장소에서 제외되어 다른 개발자들의 시스템이 다시 정상 동작하기 시작할 것이다. 이제 add-gremlins feature 의 문제를 해결한 후 다시 merge 를 수행하기 위해서는, 위 revert 작업을 되돌릴 필요가 있다.

git checkout feature/add-gremlins ... # 문제 해결을 위한 커밋을 이 시점에 추가한다. git checkout master ... git revert e443799 ... git merge feature/add-gremlins ... # 문제 수정으로 인해 새로이 발생한 merge conflict 을 해결한다 ... git commit # merge 작업을 커밋한다 ... git push

이 과정을 마치면 해당 feature 가 성공적으로 다시 추가되었을 것이다. 그러나, 이러한 버그들이 주로 merge conflict 으로 인해 발생하는 경우가 많다는 점을 고려하면, 아래와 같이 feature 브랜치에서 master 를 merge 한 후 문제를 해결하는 작업 순서를 따르는 것이 더 유용할 때가 있다.

git checkout feature/add-gremlins ... # master 브랜치를 merge 한 후 바로 이전 revert 작업을 revert 한다. # 이 작업을 통해 이전에 master 에 문제가 생겼던 상태와 동일한 상태를 만들수 있다. git merge master ... git revert e443799 ... # 이제 발생한 문제를 해결한다 (여러 커밋이 이 시점에서 추가될 수 있다) git checkout master ... # revert 작업을 revert 하는 것은 위에서 수행 하였기에 이 시점에서는 필요하지 않다 git merge feature/add-gremlins ... # 문제 수정으로 인해 새로이 발생한 merge conflict 을 해결한다 git commit #commit the merge ... git push

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts