[git] 이전 commit으로 돌아가기
medium에 게시한 글입니다.
[git] 이전 commit으로 돌아가기
대참사 복구
최근 git flow에 익숙해질 겸 개인프로젝트에서 develop/feature
식으로 branch를 나누어서 개발을 진행했다. 프로젝트를 마무리 하고 마지막 feature를 merge 하기만 하면 되는 상황이었다.
평소에 merge를 했던 방식은
- feature에서 develop 으로 pull request
- develop에서 merge
- 하나의 develop이 완성되면 master로 pull request
- master에서 merge
이었다.
그런데 마지막 merge여서 그랬는지 빠르게 마무리하고 싶은 마음에 그냥 커맨드라인에서 바로 merge를 진행하려고 했다.
$ git checkout master
$ git merge develop
그런데 … vscode에서 change apply 기능을 잘못 건드리는 바람에 master가 난장판이 됐다. 그래서 master를 이전 커밋 상태로 되돌리고 다시 develop을 merge 하기로 결정했다.
“이전 commit 으로 되돌아가기"를 해본 적이 없어서 열심히 구글링 해서 깔끔하게 마무리 했고 정리할 겸 글을 쓴다.
우선 바로 이전 commit으로 되돌아 가는 방법이 있고 commit id를 이용해 원하는 버전으로 되돌아 가는 방법이 있다.
바로 이전 commit으로 돌아가기(rollback)
바로 이전 커밋으로 갈 경우 두 가지 방법으로 나뉜다.
// 1번 - 가장 최근 commit 취소, 하지만 로컬에 있는 File은 그대로
$ git reset --soft HEAD~1
// 2번 - 가장 최근 commit 취소, 로컬에 있는 파일도 이전 커밋 상태로 reset
$ git reset --hard HEAD~1
1번 방법은 파일은 건드리지 않고 커밋만 취소하는 것이다. 때문에 여기서 git add
를 하고 커밋을 하게 되면 다시 현재상태로 되돌아 온다.
2번 방법은 파일까지 이전 버전으로 되돌리는 것이다.
특정 commit Id를 이용해 rollback
내가 사용한 방법은 이것이다. 대참사를 유발하는 커밋을 두 개나 했기 때문에 그냥 원하는 커밋아이디를 이용해 rollback을 했다 .
$ git reset --hard
commit id를 이용할 때도 위와 마찬가지로 --hard
를 넣는 것과 그렇게 않는 것으로 나뉜다.
이렇게 rollback을 한 이후 다시 pull request 를 던지고 머지를 해서 정상적으로 프로젝트를 마무리 했다!
git reset 옵션중에--hard
뿐만 아니라--soft
도 있다.
아까--hard
를 넣지 않았다면git add
와git commit
을 통해 되돌아 올 수 있다고 했다.--soft
를 한 경우는git add
없이git commit
만으로 되돌아 올 수 있다. 즉 git의 index가 최신 상태로 유지돼있는 것이다.