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

[Git_20] 커밋 취소하기 : reset --soft

by 위시랜 2022. 12. 15.

커밋 취소하기 : reset --soft
커밋 취소하기 : reset --soft

reset (리셋) - 커밋 취소하기

reset 명령어는 옵션을 함께 사용해야 하며,

사용할 수 있는 옵션은 3가지가 있습니다.

  • --soft : 스테이지 영역을 포함한 상태로 복원합니다.
  • --mixed : 기본 옵션 값은 mixed입니다. reset 명령어를 사용할 때 옵션을 지정하지 않으면 기본값인 mixed로 지정됩니다.
  • --hard : 실제 파일이 삭제된 이전 상태로 복원합니다.

soft 옵션과 mixed 옵션 차이는 크게 스테이지 영역과 관련이 있습니다.

hard 옵션은 워킹 디렉터리와 관련이 있습니다.

 

각 옵션의 차이점과 동작에 대해 실습을 통해 확인해 보겠습니다.

먼저, --soft 옵션에 대해 확인해 보겠습니다.


reset --soft

soft 옵션은 가장 낮은 단계의 리셋 동작인데, 일단 실행해 보겠습니다.

$ git reset --soft HEAD~2를 실행한 결과입니다.

git reset --soft 실행 화면
git reset --soft 실행 화면

HEAD~2 대신에 커밋 아이디인 14ba2c2 를 입력해도 같은 결과가 될 것입니다.

$ git log --oneline으로 커밋 이력을 확인한 결과가 위의 노란색 박스로 표시한 부분입니다.

 

$ git status로 상태를 확인해 보면 fileb.html 파일이 스테이지에 등록되어 있습니다.

소스트리로 확인한 결과도 마찬가지입니다.

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

리셋을 통해 현재 커밋 이력은 다음과 같다고 할 수 있습니다.

reset 후 커밋 이력 도식화
reset 후 커밋 이력 도식화

앞서 네 번째, 다섯 번째 커밋 이력은 없어지고,

세 번째 커밋까지만 남아 있고,

당연히 현재 HEAD는 마지막 커밋인 세번째 커밋을 가리킵니다.

 

여기서 주목할 점은,

세번째 커밋 지점으로 돌아갔지만,

스테이지에 fileb.html이 올라가 있습니다.

Git 상태 확인
Git 상태 확인

$ git diff HEAD 명령을 통해

현재 HEAD가 가리키는 세번째 커밋의 fileb.html과

스테이지에 올라가 있는 내용과 비교해 보면 다음과 같습니다.

 

$ git diff HEAD는 최신 커밋과 변경 내용을 비교해 보는 것으로

워킹 디렉터리와 마지막 커밋을 비교해 보는 것입니다.

 

$ git diff라고만 할 경우에는

스테이지에 등록된 파일과 워킹 디렉터리의 파일 내용을 비교합니다.

git diff HEAD 실행 결과 화면
git diff HEAD 실행 결과 화면

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

소스트리(Sourcetree)에서 확인한 diff 내용
소스트리(Sourcetree)에서 확인한 diff 내용

어.. 좀 의아한 결과입니다. 이상한 점을 찾았나요?

세 번째 커밋 지점으로 돌렸으나,

스테이지에 fileb.html이 올라가 있고,

그리고 워킹 디렉터리에 있는 fileb.html 파일은

다섯 번째 커밋할 당시의 내용을 유지하고 있습니다.

* reset 후 파일 fileb.html 내용

<!-- reset 후 파일 fileb.html 내용 -->
<h1>파일B를 생성합니다.</h1>
<h2>파일B를 첫 커밋 후 첫번째 수정합니다.</h2>
<h2>파일B를 두 번째 커밋 후 첫번째 수정합니다.</h2>

원래 커밋을 취소한 의도라면

세 번째 커밋한 당시의 fileb.html 파일 내용은 다음과 같아야 합니다.

* reset을 통해 기대했던 파일 fileb.html 내용

<!-- reset을 통해 기대했던 fileb.html 내용 -->
<h1>파일B를 생성합니다.</h1>

이를 통해 우리가 알 수 있는 것은

--soft 옵션을 사용할 경우 다음과 같이 동작한다는 것을 확인할 수 있습니다.

reset --soft 명령의 동작 개념도
reset --soft 명령의 동작 개념도

soft 옵션은 지정한 커밋 위치로 되돌리지만,

되돌아가면서 스테이지 영역에

돌아가는 커밋 위치 이후로 변경된 사항을 올려서

커밋을 실행하기 직전의 단계로 되돌립니다.


세 번째 커밋으로 두 단계 이전으로 돌아갔음에도

이후 네 번째 수정사항과 다섯 번째 수정사항이

모두 하나의 변경사항처럼 올라감으로 인해 헷갈릴 수 있습니다.


커밋 이력을 합치는 효과

헷갈릴 수 있지만,

이러한 동작을 잘 이해하고 있다면, 커밋을 합치는 결과로 만들어 갈 수 있습니다.

 

현재 스테이지 영역에는

네 번째, 다섯 번째 커밋한 내용이 올라가 있습니다.

 

여기서 바로 커밋을 추가로 실행한다면,

네번째 커밋이 다시 생기면서

내용은 이전의 다섯 번째 커밋 당시의 내용까지

합쳐진 내용으로 커밋하는 결과를 얻을 수 있습니다.


다음 실습을 위해

다시 이전과 같이 다섯 번째 커밋 상태를 만들어 놓겠습니다.

최초 다섯 번의 커밋 이력
최초 다섯 번의 커밋 이력

네번째, 다섯 번째 커밋을

새로 실행한 후에는 커밋 해시값(아이디)이 변경되는 것을 알 수 있습니다.

 

이렇듯 소스 코드 내용이 변경되지 않았더라도

새로 커밋을 하면 변경된 시간 정보 등이 적용되어

해시 값을 생성하기 때문에 해시 값은 변경되어집니다.

 

이제 네 번째, 다섯 번째 커밋 해시 값만 변경되어

다시 원래 커밋 상태로 돌아왔습니다.

다시 실습을 위해 처음 다섯 번의 커밋 이력이 있는 상태로 되돌리기
다시 실습을 위해 처음 다섯 번의 커밋 이력이 있는 상태로 되돌리기

 

여기까지

reset --soft 명령에 대해 실습을 통해 알아봤습니다.

 

다음에는 reset --mixed 명령에 대해 알아보겠습니다.

 

감사합니다.

댓글