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

[Git_23] 커밋 되돌리기 - 리버트(revert)

by 위시랜 2022. 12. 21.

커밋 되돌리기 - revert
커밋 되돌리기 - revert

앞서 확인한 리셋(reset)은 없었던 일처럼 커밋 이력을 삭제하며 되돌렸습니다.

이는 혼자 개발을 한다고 하면 괜찮을 수 있겠지만,

여러 명이 함께 프로젝트를 진행한다고 했을 때는 커밋 이력이 없어질 경우 황당해질 수 있습니다.

 

그래서 리버트(revert)를 사용해 되돌리는 게 나을 수 있습니다.

하지만 리버트(revert)는 취소할 커밋 지점을 지정하면

지정한 지점의 직전 커밋 정보로 새로운 커밋을 생성한다는 것으로 이해하고 있을 것입니다.

 

마찬가지로 앞서 구성해 뒀던 커밋 이력을 바탕으로 리버트(revert)를 실습해 보겠습니다.


리버트(revert) 명령 실습하기

reset(리셋)을 사용해 세 번째 커밋 지점으로 되돌린 결과와 같은 결과를

revert를 사용해 만들기 위해서

reset과 같이 $ git revert HEAD~2라고 실행하면 절대 안 됩니다.

 

$ git revert HEAD~2라는 명령의 의미는

세 번째(HEAD~2) 커밋을 취소하겠다는 의미로

이는 결국 두 번째 커밋 정보로 새로운 커밋을 실행하게 됩니다.

 

그렇기 때문에 다음과 같이 충돌이 나서 정상적으로 실행되지 않는 결과를 만나게 될 확률이 높습니다.

커밋 되돌리기 - revert 실행 화면
커밋 되돌리기 - revert 실행 화면

revert(리버트)는 새로운 커밋 정보를 만들기 때문에 세번째 커밋 정보를 최신 커밋으로 만들어야 합니다.

 

충돌이나 다른 오류 없이

그러한 결과를 만들기 위해서는

최신 커밋부터 순차적으로 취소해 가야 합니다.

 

다시 말해, revert를 사용해

세번째 커밋 정보로 되돌리고자 한다면,

 

다섯 번째 커밋을 취소(revert)해서

네 번째 커밋 정보를 최신 커밋으로 만든 다음,

네 번째 커밋을 취소(revert)해서

세 번째 커밋 정보를 최신 커밋으로 만들어야

별다른 문제없이 원하는 결과를 얻을 수 있습니다.

 

다섯 번째 커밋을 취소해 보겠습니다.

$ git revert HEAD 라고 실행합니다.

(현재 HEAD가 다섯 번째 커밋을 가리키기 때문입니다.)

 

git revert HEAD 명령
git revert HEAD 명령

 

실행하면 revert는 새로운 커밋을 생성하는 것이기 때문에

커밋 메시지를 입력하라고 편집기가 실행됩니다.

 

git revert 실행 후 커밋 메시지 입력 화면
git revert 실행 후 커밋 메시지 입력 화면

 

“commit 5”라는 커밋 메시지에 해당하는 커밋 지점을

Revert 한다는 의미로 기본적으로 메시지를 넣어주고 있습니다.

메시지를 수정해도 되는데, 저는 그냥 저장하고 나오겠습니다.

 

ESC키를 누르고, 콜론(:)을 입력하고 wq 입력 후 엔터를 누르면 편집기를 종료하고 나올 수 있습니다.

그러면, 다음과 같이 정상적으로 revert 되는 것을 확인할 수 있습니다.

 

git revert HEAD 실행 완료 화면
git revert HEAD 실행 완료 화면

 

$ git log --oneline으로 커밋 이력을 확인해 봅니다.

Git 이력 확인
Git 이력 확인

“Revert “commit 5”라는 커밋 메시지로 커밋 지점이 추가되었음을 알 수 있습니다.

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

git revert HEAD 실행에 대한 개념도
git revert HEAD 실행에 대한 개념도

 

우리는 세 번째 커밋으로 되돌리고자 하는 것이기 때문에,

이제 네번째 커밋(커밋 ID: 51ae390)으로 한번 더 revert 하도록 하겠습니다.

 

$ git revert <커밋ID> 형식으로 실행해 보겠습니다.

$ git revert 51ae390 라고 실행 후

커밋 메시지 입력 창에서 “Revert “commit 4””라는 메시지 입력 후 실행된 결과입니다.

 

git revert의 다른 실행 방법
git revert의 다른 실행 방법

 

정상적으로 실행된 결과를 확인할 수 있으며,

다음과 같이 이력 확인결과 새롭게 커밋 정보가 생성된 것을 확인할 수 있습니다.

 

Git 이력 확인
Git 이력 확인

 

실행 결과를 다시 그림으로 표현해 보면 다음과 같습니다.

git revert &lt;커밋ID&gt; 실행에 대한 개념도
git revert <커밋ID> 실행에 대한 개념도

 

fileb.html 파일을 확인해 보면,

세 번째 커밋 직후의 내용만을 유지하고 있습니다.

<!-- fileb.html -->
<h1>파일B를 생성합니다.</h1>

 

소스트리에서 확인해 본 결과도 다음과 같습니다.

소스트리(Sourcetree)에서 확인한 커밋 이력
소스트리(Sourcetree)에서 확인한 커밋 이력

 

소스트리를 통해 마지막 revert한 커밋 지점의 fileb.html 파일의 변경 사항을 확인해 보면 다음과 같습니다.

소스트리(Sourcetree)에서 확인한 fileb.html 파일 변경 내용
소스트리(Sourcetree)에서 확인한 fileb.html 파일 변경 내용

위 수정 사항을 보면, reset 한 결과와 다른 결과를 볼 수 있습니다.
fileb.html 은 두 줄이 삭제되고,

한 줄이 추가되는 과정을 거쳐 세 번째 커밋한 내용과 같아진 결과를 만들었습니다.


소스트리에서 커밋 되돌리기(revert)

소스트리에서도 리버트(revert)를 실행해 커밋을 되돌릴 수 있습니다.
reset과 마찬가지로 히스토리 목록에서

되돌리고자 하는 커밋 지점을 선택하면 파란색으로 블락이 됩니다.

 

이렇게 되돌리고자 하는 커밋 지점에 마우스를 가져가서

오른쪽 버튼을 클릭하면 아래와 같은 팝업 메뉴를 확인할 수 있습니다.

 

소스트리(Sourcetree)에서 커밋 되돌리기(revert)
소스트리(Sourcetree)에서 커밋 되돌리기(revert)

해당 팝업 메뉴에서 이번엔 “커밋 되돌리기…” 메뉴를 클릭합니다.

다시 얘기하지만 리버트(revert)는 선택한 지점을 취소하고 이전으로 돌리겠다는 의미입니다.

 

“commit 5”를 취소한다는 것은

commit 4를 마지막 커밋으로 하겠다는 의미와 같습니다.

 

커밋 되돌리기…” 메뉴를 클릭하면 다음과 같이 한번 더 되돌릴 것인지 물어봅니다.

[예]를 클릭해 진행해 보겠습니다.

 

커밋 되돌리기 확인 팝업
커밋 되돌리기 확인 팝업

 

리버트(되돌리기)가 실행되고 새로운 커밋이 생성됨을 확인할 수 있습니다.

 

소스트리(Sourcetree)에서 커밋 되돌리기(revert) 결과
소스트리(Sourcetree)에서 커밋 되돌리기(revert) 결과

 

리버트(revert)를 이용해 커밋을 되돌리는 방법을 살펴봤습니다.


리버트를 실행하면 새 커밋이 추가되기 때문에 커밋 이력이 복잡해 진다는 단점이 있습니다.


어떤 면에서는 리셋으로 간단하게 이전 상태로 돌리는 것이 나을 수 있습니다.
하지만 여러 명이 협업을 한다면 커밋을 삭제하는 것은 매우 조심해야 할 부분입니다.

리셋(reset)과 리버트(revert)는 버전관리의 역할에 반드시 필요한 기능입니다.
이를 통해 코드 변경 이력을 저장하고 필요한 시점에 해당 코드 상태로 쉽게 이동할 수 있습니다.

 

감사합니다.

 

댓글