[Git 정리] 병합 취소하기

dev2820·2021년 9월 5일
14

git정리

목록 보기
6/8

"브랜치 병합" 글에서 merge 도중 --abort를 통해 병합을 취소할 수 있다는 것을 알게되었습니다.

이번 글에선 병합이 완료된 경우 병합을 취소하는 방법을 정리합니다.

reset을 이용한 병합 취소

병합이 일어난 직후엔 git엔 ORIG_HEAD라는 새로운 참조 commit을 가집니다. 혹여나 실수로 병합을 한 경우에 즉시 병합을 취소할 수 있도록 하기 위함입니다.

reset으로 병합 취소
[reset을 통한 병합 취소]

$ git reset --merge ORIG_HEAD

# 위와 같은 효과를 냅니다.
$ git reset --hard ORIG_HEAD

위 명령은 바로 직전 병합을 취소하는 명령입니다. fast-forward 병합이나 완전병합에서도 똑같이 먹힙니다.

revert: 없던 일로 만들기 2

revert 명령은 기존의 커밋과 정확히 반대되는 커밋을 만듭니다.

예를 들어 A.txt에 2번 줄을 추가하는 커밋이 있다면 revert는 A.txt에 2번 줄을 빼는 커밋을 만듭니다.

# git revert [무력화할 commit]
# commit 605f5e3 test2 <-- test2 commit을 revert 해 봅시다.
$ git revert 605f5e3

# 1c4d874 (HEAD -> main) Revert "test2"

이전 commit들 중 605f5e3를 revert 시켰더니 HEAD에 새로운 commit 1c4d874이 생겼습니다.

사실 기존의 commit들을 reset으로 삭제하거나 변경하는 것보다는 revert로 기존 commit을 무력화시키는 것이 history 관리 측에서 더 좋습니다. 혼자 하는 프로젝트가 아니라 팀원들이 함께하는 프로젝트라면 더더욱 master 브랜치의 commit은 되도록 건드리지 않고 revert로 무력화만 시키는 것을 추천해 드립니다. 공유할 브랜치의 history를 바꿔버리면 팀원들에게 혼란만 일으킵니다.

revert를 이용한 병합 취소

병합 commit이 있다면(완전 병합으로 병합된 경우) revert를 이용해 쉽게 병합을 취소할 수 있습니다. 이때 --mainline 옵션으로 어느 브랜치를 남길지 결정할 수 있습니다.

$ git log --oneline --graph

위 명령은 commit들을 그래프로 보여줘 어느 commit이 merge commit인지 알 수 있게 해줍니다.

merge를 revert하는 경우
[merge를 revert하는 경우]

혹은 git log --merges로 merge commit만 모아볼 수도 있습니다.

git log --merges

이제 merge를 revert 해봅시다.

# git revert --mainline [남길 line] [병합 commit]
git revert --mainline 1 cb70c2d

위 그림에서 직선인 왼쪽 그래프가 1번 라인, 오른쪽 그래프가 2번 라인이 됩니다. revert 하면서 1번 라인을 남길지 2번 라인을 남길지 결정하면 됩니다.

merge를 revert하는 경우 2
[merge를 revert하는 경우 2]
revert도 마찬가지로 충돌이 일어날 수 있습니다. 당황할 것 없이 merge 할 때처럼 충돌을 해결하고 git revert --continue 해주시면 됩니다.

혹은 revert를 중단하고 싶다면 git revert --abort 해주시면 됩니다.

연속된 commit을 revert 하기

연속된 commit들을 revert 하려 한다면 한 번에 revert 해줄 수 있습니다.

# git revert --no-commit [from commit]..[to commit]
$ git revert --no-commit 605f5e3..402b4bf

위 명령은 여러 연속된 commit을 revert 하지만 하나의 commit만 생성되므로 history를 더 깔끔하게 관리할 수 있습니다.

마치며

다음 글에선 원격저장소의 연결을 관리하는 명령들에 대해 알아보겠습니다.

profile
공부,번역하고 정리하는 곳

0개의 댓글