본문 바로가기

Coding/git

git revert - 커밋 변경, reset/revert 복구하기

* git revert

git에서 commit 후 commit에 포함시키지 말아야 할 파일을 발견했을때,

즉 커밋한 내용에 실수가 있어서, 수정을 하고 싶을때 commit을 삭제하기 위해 revert를 쓰는 대참사의 경우가 있다.

하지만 이는 매우매우 위험한 행동이다... revert는 절대 함부로 쓰면 안된다

 

git revert HEAD

git revert <commit id>는 해당 commit id로 파일을 되돌리는 명령어이기 때문에, 그 이후의 수정사항들이 모두 사라져버린다.

즉, commit을 한 뒤 revert를 사용하면 commit 이전의 상태로 되돌아간다.

나는 commit의 일부 내용을 없애거나 수정하고 싶었던 것인데, 로컬에서 내가 작업하고 수정한 모든 코드와 수정본들, 즉 commit한 파일들도 로컬에서 다 사라져버리는 이전 상태로 되돌린다.

 

git log

log 명령어를 실행하면 이력과 commit 정보 등을 확인할 수 있다.

ex)

$ git log
commit 0d4a808c26908cd5fe4b6294a00150342d1a58be
Author: yourname <yourname@yourmail.com>
Date:   Mon Jul 16 23:19:26 2012 +0900

    pull의 설명을 추가

commit 9a54fd4dd22dbe22dd966581bc78e83f16cee1d7
Author: yourname <yourname@yourmail.com>
Date:   Mon Jul 16 23:19:01 2012 +0900

    commit의 설명 추가

commit 326fc9f70d022afdd31b0072dbbae003783d77ed
Author: yourname <yourname@yourmail.com>
Date:   Mon Jul 16 23:17:56 2012 +0900

    add의 설명을 추가

commit 48eec1ddf73a7fb508ef664efd6b3d873631742f
Author: yourname <yourname@yourmail.com>
Date:   Mon Jul 16 23:16:14 2012 +0900

    first commit

 

* revert한 상황 되돌리기

revert한 상황을 되돌리는 방법은 git reflog에 있다.

# git reflog
3d0a896 HEAD@{0}: commit (amend): 모든 걸 삭제한 악마의 커밋
e829698 HEAD@{1}: commit: 되돌리고 싶은 커밋
[...]

 

따라서 아래의 코드를 실행시켜 주면 revert한 이전의 상태로 되돌아가, 커밋까지 완료한 상태가 된다.

git reset --hard HEAD@{1}​

 

[revert 실행 후 -> reset으로 revert 이전 상태로 되돌리기 -> 복구된 상태의 전체 과정]

# git reflog
3d0a896 HEAD@{0}: commit (amend): 모든 걸 삭제한 악마의 커밋
e829698 HEAD@{1}: commit: 되돌리고 싶은 커밋
[...]

# git reset --hard HEAD@{1}

# git reflog
e829698 HEAD@{0}: reset: moving to HEAD@{1} : 복구하는 커밋
3d0a896 HEAD@{1}: commit (amend): 모든 걸 삭제한 악마의 커밋
e829698 HEAD@{2}: commit: 되돌리고 싶은 커밋
[...]

 

수정사항에는 문제가 없지만 commit만 되돌리고 싶다면 git reset을 사용해야 한다.

# git reset --soft <돌아가고 싶은 commit id>  
git add는 되어 있는 상태로 돌아간다.  

# git reset --mixed <돌아가고 싶은 commit id>  
git add 이전으로 돌아간다.  

 

 

 

출처: [git] reset/revert 복구하기, 누구나 쉽게 이해할 수 있는 Git 입문