본문 바로가기
코딩해보니/Git

[Git_18] 커밋의 취소하기(reset)와 되돌리기(revert) 차이점

by 위시랜 2022. 12. 13.

커밋 취소하기(reset)와 되돌리기(revert)
커밋 취소하기(reset)와 되돌리기(revert)

커밋한 이후에도 커밋을 되돌려야 할 경우가 있을 수 있습니다.

엄밀히 얘기하면 커밋을 취소하는 것과 되돌리는 것은 Git에서는 다른 의미입니다.

 

지금은 학습을 위해 간단하게 filea.html, fileb.html과 같이

임의로 생성해서 실습을 해보고 있습니다만,

실제 개발을 하는 경우에는 수많은 코드를 작성하고 테스트하는 과정을 가지게 됩니다.

 

실무에서도 개발자의 손에서 개발이 완료되면

커밋을 하고 테스트 환경에 배포해서 테스트를 거치게 되고,

이 과정에서 수정 사항이 수 없이 발생합니다.

 

이러한 과정속에 심각한 경우에는

아예 예전으로 돌리고 다시 시작하는 경우가 있을 수 있습니다.

이런 경우도 종종 발생합니다.

 

버전 관리는 이런 때에 더욱 빛을 발합니다.

Git을 사용하면 언제든지 원하는 시점으로 전체 코드를 되돌릴 수 있습니다.

개발은 오랜 기간 작업을 하는 경우가 많습니다.

오늘 오전에 했던 작업은

기억을 할 수 있어서 자신의 기억만으로도 되돌릴 수 있을지 모르겠으나,

어제, 아니 일주일 전으로 되돌리고 싶을 때는

이러한 버전관리를 이용하지 않는다면 거의 불가능에 가깝습니다.

 

Git에서 커밋한 것을 되돌리는 방법은

크게 reset(리셋)revert(리버트) 두 가지가 있습니다.

리셋(reset)은 커밋한 것을 취소하는 것으로 이력 자체를 없애는 방법입니다.

리버트(revert)는 커밋 이력은 남겨 놓으면서 되돌리는 방법입니다.


reset(리셋)과 revert(리버트)

reset(리셋)과 revert(리버트)는

개념에 차이가 크기 때문에 잘 이해할 필요가 있습니다.

reset(리셋)은 돌아가고 싶은 커밋 지점을 지정해서 되돌릴 수 있으며, 되돌아갈 지점을 선택하게 됩니다.

돌아간 이후에는 돌아간 커밋 지점 이후의 이력은 삭제합니다.

 

예를 들어, 다음과 같이 커밋을 다섯 번에 걸쳐 진행한 프로젝트가 있습니다.

커밋을 다섯번한 프로젝트
커밋을 다섯번한 프로젝트

이 프로젝트에서 세번째 커밋 지점으로 reset을 통해 되돌릴 수 있습니다.

세번째 커밋으로 되돌리기
세번째 커밋으로 되돌리기

이렇게 reset을 통해 이전으로 되돌리면,

네 번째, 다섯 번째 커밋 이력은 없어지고 다음과 같은 결과가 됩니다.

세번째 커밋으로 되돌린 결과
세번째 커밋으로 되돌린 결과

reset(리셋) 명령어는 다시 네 번째, 다섯 번째 커밋으로 돌아갈 순 없습니다.

그래서 리셋을 할 때는 신중하게 판단해야 합니다.

 

반면에 revert(리버트)는 되돌아갈 곳을 선택하는 것이 아니라,

되돌릴 커밋 지점을 선택하는 것입니다.

이게 헷갈릴 수 있는 부분입니다.

$ git revert HEAD 라는 명령어를 실행했다고 합시다.

이 의미는 현재 HEAD 포인터가 가리키는 커밋을 되돌리겠다는 의미이며,

즉, 5번의 커밋 이력이 있다면, 네번째 커밋으로 되돌리는 것입니다.

 

다시 한번 보겠습니다.

앞서와 같은 예로 다음과 같이 커밋을 다섯 번에 걸쳐 진행한 프로젝트가 있습니다.

커밋을 다섯번한 프로젝트
커밋을 다섯번한 프로젝트

이 프로젝트의 현재 HEAD는 당연히 마지막 커밋 지점이 됩니다.

커밋을 다섯번한 프로젝트에서 현재 HEAD 위치
커밋을 다섯번한 프로젝트에서 현재 HEAD 위치

여기서 $ git revert HEAD 라고 실행하는 것은 다섯 번째 커밋을 취소하겠다는 것입니다.

따라서, $git revert HEAD라고 실행할 경우

HEAD가 가리키는 다섯 번 재 커밋의 직전 커밋인 네 번째 커밋 정보로

새롭게 커밋을 생성하면서 여섯 번째 커밋이 만들어 지게 됩니다.

그림으로 표현하면 다음과 같습니다.

revert한 결과 네번째 커밋 정보로 새로운 커밋을 생성
revert한 결과 네번째 커밋 정보로 새로운 커밋을 생성

네번째 커밋으로 되돌리고 싶다고 $ git revert HEAD~1이라고 한다면,

다음과 같이 동작하게 되면서, 원치 않는 커밋 정보가 만들어지게 됩니다.

HEAD~1으로 revert한 결과
HEAD~1으로 revert한 결과

이렇게 리버트는 새로운 커밋을 생성하는데,

이는 리셋과 리버트의 차이점은 커밋 정보를 삭제하느냐 하지 않느냐라고 할 수 있습니다.

 

여기까지 리셋(reset)과 리버트(revert)의 차이점을 알아봤습니다.

다음은 리셋과 리버트를 실습을 통해 자세히 확인해 보겠습니다.

댓글