📢 어렵고 정석적인 개념 설명보다는 저같은 초보자도 이해하기 쉽게 정리하는 것을 원칙으로 포스팅하고 있습니다. 😄

[Git] Git의 commit을 기준으로 과거로 돌아가기

개념

Git을 이용해 버전 관리를 하다보면, 지금 코드가 실행이 되지 않아 예전 코드로 돌아가고 싶을 때 혹은 다시 원래의 상태로 돌아가고 싶을 때가 생길 것이다. 이를 위해 Git에서는 과거로 돌아갈 수 있는 기능을 제공한다.

 

방법

reset을 이용하여 아예 없던 일로 하기

git reset --hard 커밋의 해시

전 글에서 git log를 이용해 각 commit의 해시를 확인할 수 있다고 했다. 

reset을 이용하면 지금까지의 커밋을 모두 삭제하고, 그 때의 커밋으로 돌아갈 수 있다. (뒤에 커밋의 해시를 따로 작성하지 않을 시 가장 최근의 커밋으로 돌아간다.)

즉, 지금까지 했던 커밋들을 모두 초기화시키기 때문에 실무 협업에서는 다소 위험한 명령어이기도 하다.

 

revert를 이용하여 특정 커밋만 취소하기

git revert 커밋의 해시

git reset은 아무래도 전체를 초기화하기 때문에 다소 위험 부담이 크다. 그리고, 지금까지의 커밋을 모두 버리기에는 코드가 아깝고 특정 커밋만 취소하고 싶을 때도 있을 수 있다. 이럴 때 필요한 게 revert 명령어이다. 예를 들어, A라는 파일을 삭제하는 커밋을 했는데 나중에 A라는 파일이 필요하게 된다면 A라는 파일을 삭제한 커밋을 revert 시키면 된다. 

 

하지만, revert 명령어를 사용할 때 주의할 점이 있다. 바로 커밋의 충돌이다.

A라는 파일을 만들었다는 커밋과, A라는 파일을 수정한 커밋이 연이어 있다고 하자. 근데, A 파일을 만들었다는 커밋을 revert 해버리면 A 파일을 수정한 커밋이 'A가 뭐였지?'하고 충돌이 생긴다. 이 경우 Git이 제공하는 hint에 따라서 먼저 충돌을 처리한 후 "git revert --continue" 해주면 된다.

 

reset VS revert

reset
revert

reset은 커밋을 그냥 뒤로 돌리는 것이다. 따라서 앞에 어떤 커밋을 했건 모두 초기화된다는 부담이 있다.

revert는 특정 커밋을 취소하는 것인데, 이 취소하는 것 자체도 하나의 커밋으로 치는 것이다. (사실상 revert도 커밋의 하나라고 생각하면 된다.)