[Git/Github] reflog와 reset으로 실수로 잘못 변경한 rebase, merge, push를 이전 commit으로 되돌리는 방법



1. 기존 환경과 잘못 Merge 한 상황

  • feature/a branch : 생성 후, a1, a2, a3 3개의 커밋을 만들었습니다.
  • master branch : a1, a2, a3 커밋을 생성한 후에 master2, master3 커밋을 만들었습니다.

image

여기에 우리가 master에서 feature/a branch를 merge하였다고 가정해보겠습니다.

image

위와 같이 잘 merge가 되었으나 되돌리고 싶은 때가 있을 것 같습니다! 이 때는 어떻게 해야될까요?

2. 변경사항 되돌리기

기존 코드 상태로 되돌리고 싶다면 아래와 같이 git reflog 명령어를 활용하여 이전 hash 값을 확인한 후, 되돌아 가고 싶은 지점으로 git reset 을 진행하면 됩니다!

$ git reflog

9afda15 (HEAD -> feature/a) HEAD@{3}: checkout: moving from master to feature/a
130dffb (master) HEAD@{4}: checkout: moving from feature/a to master
9afda15 (HEAD -> feature/a) HEAD@{5}: checkout: moving from master to feature/a
130dffb (master) HEAD@{6}: checkout: moving from feature/a to master
9afda15 (HEAD -> feature/a) HEAD@{7}: rebase (finish): returning to refs/heads/feature/a
9afda15 (HEAD -> feature/a) HEAD@{8}: rebase (pick): a3
aa54364 HEAD@{9}: rebase (pick): a2
e717664 HEAD@{10}: rebase (pick): add a1
130dffb (master) HEAD@{11}: rebase (start): checkout master
de16694 HEAD@{12}: checkout: moving from master to feature/a
130dffb (master) HEAD@{13}: checkout: moving from master to master
130dffb (master) HEAD@{14}: reset: moving to 130dffb48d8c68b87787ca43bdbf244533ade7bc
e78c88a HEAD@{15}: commit: squash merge
130dffb (master) HEAD@{16}: checkout: moving from master to master
130dffb (master) HEAD@{17}: commit: master3
# 모든 변경사항을 버리고 이전 커밋으로 되돌아가기
$ git reset --hard [hash값]

# 예시
$ git reset --hard de16694

reset 의 종류는 아래와 같습니다.

  • hard : reset으로 돌아간 커밋 이후의 변경 이력은 모두 삭제합니다.
  • mixed : 변경 이력은 삭제하지만 변경 내용은 남아있습니다. stage 되어있지 않아서, add를 해야 commit 가능합니다.
  • soft : 변경 이력은 삭제하지만 변경 내용은 남아있습니다. stage 되어있어, add 하지 않고 바로 commit 가능합니다.

image

위와 같이 reset 명령어를 통하여 정상적으로 되돌릴 수 있습니다!