깃을 이용해 개발을 하다보면 커밋을 취소하고 싶을 때가 종종 있다.
그럴 때 GUI툴을 이용해 간편하게 할 수도 있지만..ㅎ 깃 커맨드로 어떻게 하는지 알아보도록 하려한다.
커밋 취소에 알아보기 전에 깃에서 HEAD가 뭔지 알아보려한다.
깃 에서 HEAD는 현재 브랜치를 가리키고 있는 포인터이고 커밋 중 가장 마지막 커밋을 가리키고 있다.
현재 HEAD가 가리키고 있는 커밋을 보면 main 브랜치를 가리키고 있는 것을 볼 수 있다.
이제 HEAD가 뭔지도 알았으니 커밋 취소의 과정을 알아보자!
git-reset.txt
라는 파일을 생성했다.git-reset.txt
파일은 Untracked 상태이기 때문에 이를 깃이 관리하게 하자이러고 git status
명령어를 입력해보면 세 트리가 모두 같기 때문에 아래와 같이 나온다.
현재 브랜치 main
커밋할 사항 없음, 작업 폴더 깨끗함
git status
명령어를 입력해본다.Working Directory와 Staging Area의 내용이 다르기 때문에 커밋할 변경 사항을 추가하지 않았습니다
라는 문구가 뜨는 것을 확인할 수 있다.
git add
명령어를 이용해 이를 Staging Area에 올려주자.
이후 git status
명령어를 이용해 현재 상태를 확인해보면 파일 이름이 녹색으로 표시되면서 HEAD의 내용과 다른 파일들의 목록이 표시된다.
git commit
명령어를 이용해 변경사항을 커밋하자.다시 git status
명령어를 입력하면 세 트리 모두 같기 때문에 커밋할 사항이 없다고 나온다.
이제 어느 정도 HEAD, Staging Area, Working Directory를 이해했다고 볼 수 있을 것 같다! 위 과정을 한 번만 더 진행해서 아래와 같은 이력이 남도록 해보자.
그러면 이제 git reset
이 어떤 일을 하는지 알아보자.
git reset에는 세 가지 옵션이 있는데 --soft, --mixed, --hard 옵션이 있다. git reset --help
명령어를 통해 확인해보면 --merge, --keep 등의 옵션이 더 있고 default 값은 --mixed로 설정되어 있는 것을 확인할 수 있다!
먼저 HEAD를 version 2 로 이동시켜보자. (git reset --soft 5c34667
)
그러면 Working Directory, Staging Area, HEAD의 내용은 아래와 같다!
실제로 vi 편집기를 통해 파일 내용을 확인해봐도 version 2의 내용이 아닌 version 3의 내용이 남아있는 것을 확인할 수 있다.
여기까지의 실행이 git reset --soft
옵션의 사용과 같다.
이후 Staging Area의 내용을 업데이트하고 git commit
명령을 수행하면 git commit --amend
명령과 같은 결과를 수행한다.
이 글을 읽는 사람들은 이제 감이 올 것 같다. --mixed 옵션은 staging area의 내용까지 바꾸는 것이다.
즉 --mixed 옵션은 HEAD가 가리키는 대상을 지정한 커밋으로 되돌리고 Staging Area까지 비워버린다! git commit
과 git add
명령어를 되돌리는 것이다.
마지막으로 --hard 옵션이다. 이 옵션은 Working Directory까지 되돌려버린다.
즉 --hard 옵션은 HEAD, Staging Area, Working Directory까지 모두 되돌리는 옵션이다. 그렇기 때문에 주의해서 사용해야한다. 현재 작업 내용을 모두 날려버릴 수 있으니 말이다..
추가적으로 위와 같은 상황에서는 version 3를 아직 깃이 커밋으로 보관하고 있으니 git reflog
명령어를 통해 복원할 수 있다.
개발을 하다보면 commit을 취소하고 싶을 때가 있는데, git reset
명령어를 통해 취소할 수 있다.
git reset에는 세 가지 옵션 (--soft, --mixed, --hard)이 존재한다.
이번 글을 통해 HEAD, Staging Area(Index), Working Directory와 git reset의 동작원리를 이해할 수 있었습니다~!