reset (리셋) - 커밋 취소하기
reset 명령어는 옵션을 함께 사용해야 하며, 사용할 수 있는 옵션은 3가지가 있습니다.
- --soft : 스테이지 영역을 포함한 상태로 복원합니다.
- --mixed : 기본 옵션 값은 mixed입니다. reset 명령어를 사용할 때 옵션을 지정하지 않으면 기본값인 mixed로 지정됩니다.
- --hard : 실제 파일이 삭제된 이전 상태로 복원합니다.
soft 옵션과 mixed 옵션 차이는 크게 스테이지 영역과 관련이 있습니다.
hard 옵션은 워킹 디렉터리와 관련이 있습니다.
각 옵션의 차이점과 동작에 대해 실습을 통해 확인해 보고 있습니다.
마지막으로 --hard 옵션에 대해 확인해 보겠습니다.
마찬가지로 커밋 이력은 다시 맞추도록 하겠습니다.
다시 네 번째, 다섯 번째 커밋을 앞서 와 마찬가지로 실행해 다음과 같이 이력을 확인합니다.
이번에도 커밋 해시값(아이디)가 변경되었음을 확인할 수 있습니다.
일단 hard 옵션을 사용해 실행하고 그 결과를 확인해 보겠습니다.
$ git reset --hard HEAD~2를 실행한 결과 입니다.
마찬가지로 HEAD~2 대신에 커밋 아이디인 14ba2c2 를 입력해도 같은 결과가 될 것입니다.
hard 옵션으로 실행 후에도 뭔가 메시지를 보여줍니다.
HEAD is now at 14ba2c2 commit 3, make fileb
상기와 같이 HEAD가 현재 14ba2c2(세번째 커밋 해시값) 라고 알려줍니다.
그리고 해당 커밋 메시지도 함께 출력해 주고 있습니다.
$ git log --oneline으로 커밋 이력을 확인한 결과가 위의 노란색 박스로 표시한 부분입니다.
$ git status로 상태를 확인해 보면 스테이지 및 워킹 디렉터리가 깨끗하게 정리된 상태입니다.
소스트리로 확인한 결과도 다른 옵션 결과와 차이가 있습니다.
가장 큰 차이는 워킹 디렉터리도 스테이지 영역도 아무런 변경 사항 없이 깨끗하다는 것입니다.
리셋을 통해 현재 커밋 이력은 다른 옵션과 마찬가지로 다음과 같다고 할 수 있습니다.
앞서 네 번째, 다섯 번째 커밋 이력은 없어지고,
세 번째 커밋까지만 남아 있고,
당연히 현재 HEAD는 마지막 커밋인 세번째 커밋을 가리킵니다.
그런데 hard 옵션의 경우 주목할 점은,
세번째 커밋 지점으로 돌아간 이후,
워킹 디렉터리나 스테이지 영역이 깨끗하다는 것입니다.
$ git diff HEAD 명령을 통해
현재 HEAD가 가리키는 세 번째 커밋의 내용과 비교를 해봐도 당연히 아무런 결과가 없습니다.
fileb.html 파일 내용을 확인해 봐도 soft와 mixed 옵션과 다릅니다.
세번째 커밋 직후의 내용만을 유지하고 있습니다.
<!-- fileb.html -->
<h1>파일B를 생성합니다.</h1>
이를 통해 우리가 알 수 있는 것은
--hard 옵션을 사용할 경우 다음과 같이 동작한다는 것을 확인할 수 있습니다.
hard 옵션은 지정한 커밋 위치로 되돌립니다.
되돌아간 커밋 지점 이후로 변경된 사항도 모두 남기지 않는다는 것입니다.
지금까지 터미널에서 reset(리셋)을 실행한 후 그 결과를 확인해 봤습니다.
소스트리(Sourcetree)에서 리셋(reset)하기
소스트리를 이용하면 reset(리셋) 명령도 편리하게 할 수 있습니다.
아래와 같이 왼쪽 메뉴 중에
“History” 메뉴를 선택하고 나오는 오른쪽 화면에서 커밋 이력을 확인할 수 있었습니다.
여기서 되돌리고자 하는 커밋 지점을 선택하면 파란색으로 블록 처리가 됩니다.
이렇게 되돌리고자 하는 커밋 지점에 마우스를 가져가서
오른쪽 버튼을 클릭하면 아래와 같은 팝업 메뉴를 확인할 수 있습니다.
다음과 같은 팝업 메뉴에서 [이 커밋까지 현재 브랜치를 초기화]를 클릭합니다.
그러면 다음과 같은 옵션 선택 메뉴를 확인할 수 있습니다.
기본값이 Mixed 가 선택되어 있습니다.
“사용 중인 모드:” 의 선택 입력창을 클릭해보면 다음과 같이 옵션을 변경할 수 있습니다.
그런데, Hard 옵션을 선택 후 [확인]을 클릭하면 다음과 같은 경고창을 만나게 됩니다.
워킹 디렉터리와 스테이지 영역에서의 모든 변경사항이 삭제되는데 정말 실행하는 것이 맞냐? 라고 한번 더 확인합니다.
이는 Hard 옵션은 강력하기 때문에 주의를 다시 한번 상기시켜주는 것이 당연하겠습니다.
이후 결과는 앞서 터미널에서 확인한 결과와 동일하게 동작하게 됨을 알 수 있습니다.
지금까지 커밋한 것을 취소하는 방법 중에 리셋(reset)에 대해 알아보았습니다.
다음엔 리버트(revert) 명령에 대해 학습하도록 하겠습니다.
감사합니다.
상기 배너는 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'코딩해보니 > Git' 카테고리의 다른 글
[Git_24] 커밋 수정하기 --amend 옵션 사용하기 (0) | 2022.12.23 |
---|---|
[Git_23] 커밋 되돌리기 - 리버트(revert) (0) | 2022.12.21 |
[Git_21] 커밋 취소하기 : reset --mixed (0) | 2022.12.19 |
[Git_20] 커밋 취소하기 : reset --soft (0) | 2022.12.15 |
[Git_19] 커밋 취소하기 - reset 방법 3가지 (0) | 2022.12.14 |
댓글