reset (리셋) - 커밋 취소하기
reset 명령어는 옵션을 함께 사용해야 하며,
사용할 수 있는 옵션은 3가지가 있습니다.
- --soft : 스테이지 영역을 포함한 상태로 복원합니다.
- --mixed : 기본 옵션 값은 mixed입니다. reset 명령어를 사용할 때 옵션을 지정하지 않으면 기본값인 mixed로 지정됩니다.
- --hard : 실제 파일이 삭제된 이전 상태로 복원합니다.
soft 옵션과 mixed 옵션 차이는 크게 스테이지 영역과 관련이 있습니다.
hard 옵션은 워킹 디렉터리와 관련이 있습니다.
각 옵션의 차이점과 동작에 대해 실습을 통해 확인해 보겠습니다.
먼저, --soft 옵션에 대해 확인해 보겠습니다.
reset --soft
soft 옵션은 가장 낮은 단계의 리셋 동작인데, 일단 실행해 보겠습니다.
$ git reset --soft HEAD~2를 실행한 결과입니다.
HEAD~2 대신에 커밋 아이디인 14ba2c2 를 입력해도 같은 결과가 될 것입니다.
$ git log --oneline으로 커밋 이력을 확인한 결과가 위의 노란색 박스로 표시한 부분입니다.
$ git status로 상태를 확인해 보면 fileb.html 파일이 스테이지에 등록되어 있습니다.
소스트리로 확인한 결과도 마찬가지입니다.
리셋을 통해 현재 커밋 이력은 다음과 같다고 할 수 있습니다.
앞서 네 번째, 다섯 번째 커밋 이력은 없어지고,
세 번째 커밋까지만 남아 있고,
당연히 현재 HEAD는 마지막 커밋인 세번째 커밋을 가리킵니다.
여기서 주목할 점은,
세번째 커밋 지점으로 돌아갔지만,
스테이지에 fileb.html이 올라가 있습니다.
$ git diff HEAD 명령을 통해
현재 HEAD가 가리키는 세번째 커밋의 fileb.html과
스테이지에 올라가 있는 내용과 비교해 보면 다음과 같습니다.
$ git diff HEAD는 최신 커밋과 변경 내용을 비교해 보는 것으로
워킹 디렉터리와 마지막 커밋을 비교해 보는 것입니다.
$ git 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 옵션을 사용할 경우 다음과 같이 동작한다는 것을 확인할 수 있습니다.
soft 옵션은 지정한 커밋 위치로 되돌리지만,
되돌아가면서 스테이지 영역에
돌아가는 커밋 위치 이후로 변경된 사항을 올려서
커밋을 실행하기 직전의 단계로 되돌립니다.
세 번째 커밋으로 두 단계 이전으로 돌아갔음에도
이후 네 번째 수정사항과 다섯 번째 수정사항이
모두 하나의 변경사항처럼 올라감으로 인해 헷갈릴 수 있습니다.
커밋 이력을 합치는 효과
헷갈릴 수 있지만,
이러한 동작을 잘 이해하고 있다면, 커밋을 합치는 결과로 만들어 갈 수 있습니다.
현재 스테이지 영역에는
네 번째, 다섯 번째 커밋한 내용이 올라가 있습니다.
여기서 바로 커밋을 추가로 실행한다면,
네번째 커밋이 다시 생기면서
내용은 이전의 다섯 번째 커밋 당시의 내용까지
합쳐진 내용으로 커밋하는 결과를 얻을 수 있습니다.
다음 실습을 위해
다시 이전과 같이 다섯 번째 커밋 상태를 만들어 놓겠습니다.
네번째, 다섯 번째 커밋을
새로 실행한 후에는 커밋 해시값(아이디)이 변경되는 것을 알 수 있습니다.
이렇듯 소스 코드 내용이 변경되지 않았더라도
새로 커밋을 하면 변경된 시간 정보 등이 적용되어
해시 값을 생성하기 때문에 해시 값은 변경되어집니다.
이제 네 번째, 다섯 번째 커밋 해시 값만 변경되어
다시 원래 커밋 상태로 돌아왔습니다.
여기까지
reset --soft 명령에 대해 실습을 통해 알아봤습니다.
다음에는 reset --mixed 명령에 대해 알아보겠습니다.
감사합니다.
'코딩해보니 > Git' 카테고리의 다른 글
[Git_22] 커밋 취소하기 : reset --hard & 소스트리에서 리셋하기 (0) | 2022.12.20 |
---|---|
[Git_21] 커밋 취소하기 : reset --mixed (0) | 2022.12.19 |
[Git_19] 커밋 취소하기 - reset 방법 3가지 (0) | 2022.12.14 |
[Git_18] 커밋의 취소하기(reset)와 되돌리기(revert) 차이점 (0) | 2022.12.13 |
[Git_17] 스테이지에 등록한(올린) 파일을 취소(삭제)하기(내리기) (0) | 2022.12.09 |
댓글