git 커밋을 취소하자!

JeongYong Park·2023년 3월 10일
1

깃을 이용해 개발을 하다보면 커밋을 취소하고 싶을 때가 종종 있다.
그럴 때 GUI툴을 이용해 간편하게 할 수도 있지만..ㅎ 깃 커맨드로 어떻게 하는지 알아보도록 하려한다.

커밋 취소에 알아보기 전에 깃에서 HEAD가 뭔지 알아보려한다.
깃 에서 HEAD는 현재 브랜치를 가리키고 있는 포인터이고 커밋 중 가장 마지막 커밋을 가리키고 있다.

현재 HEAD가 가리키고 있는 커밋을 보면 main 브랜치를 가리키고 있는 것을 볼 수 있다.

이제 HEAD가 뭔지도 알았으니 커밋 취소의 과정을 알아보자!

이해를 위한 사전준비!

Working directory, Staging area(index), HEAD의 이해

  1. 먼저 임의의 파일 git-reset.txt 라는 파일을 생성했다.

  1. 현재 git-reset.txt 파일은 Untracked 상태이기 때문에 이를 깃이 관리하게 하자

  1. git commit 명령어를 통해 Staging Area의 내용을 스냅샷으로 저장하고 이를 가리키는 커밋 객체를 생성한다. 그리고 main 브랜치가 그 커밋 객체를 가리키도록 한다.

이러고 git status 명령어를 입력해보면 세 트리가 모두 같기 때문에 아래와 같이 나온다.

현재 브랜치 main
커밋할 사항 없음, 작업 폴더 깨끗함
  1. 이제 git-reset.txt 파일의 내용을 vi 편집기를 통해 변경하고 git status 명령어를 입력해본다.

Working Directory와 Staging Area의 내용이 다르기 때문에 커밋할 변경 사항을 추가하지 않았습니다라는 문구가 뜨는 것을 확인할 수 있다.

git add 명령어를 이용해 이를 Staging Area에 올려주자.

이후 git status 명령어를 이용해 현재 상태를 확인해보면 파일 이름이 녹색으로 표시되면서 HEAD의 내용과 다른 파일들의 목록이 표시된다.

  1. git commit 명령어를 이용해 변경사항을 커밋하자.

다시 git status 명령어를 입력하면 세 트리 모두 같기 때문에 커밋할 사항이 없다고 나온다.

이제 어느 정도 HEAD, Staging Area, Working Directory를 이해했다고 볼 수 있을 것 같다! 위 과정을 한 번만 더 진행해서 아래와 같은 이력이 남도록 해보자.

git reset 이해하기

그러면 이제 git reset이 어떤 일을 하는지 알아보자.
git reset에는 세 가지 옵션이 있는데 --soft, --mixed, --hard 옵션이 있다. git reset --help 명령어를 통해 확인해보면 --merge, --keep 등의 옵션이 더 있고 default 값은 --mixed로 설정되어 있는 것을 확인할 수 있다!

git reset --soft

먼저 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 명령과 같은 결과를 수행한다.

git reset --mixed

이 글을 읽는 사람들은 이제 감이 올 것 같다. --mixed 옵션은 staging area의 내용까지 바꾸는 것이다.

--mixed 옵션은 HEAD가 가리키는 대상을 지정한 커밋으로 되돌리고 Staging Area까지 비워버린다! git commitgit add 명령어를 되돌리는 것이다.

git reset --hard

마지막으로 --hard 옵션이다. 이 옵션은 Working Directory까지 되돌려버린다.

--hard 옵션은 HEAD, Staging Area, Working Directory까지 모두 되돌리는 옵션이다. 그렇기 때문에 주의해서 사용해야한다. 현재 작업 내용을 모두 날려버릴 수 있으니 말이다..

추가적으로 위와 같은 상황에서는 version 3를 아직 깃이 커밋으로 보관하고 있으니 git reflog 명령어를 통해 복원할 수 있다.

정리

개발을 하다보면 commit을 취소하고 싶을 때가 있는데, git reset 명령어를 통해 취소할 수 있다.
git reset에는 세 가지 옵션 (--soft, --mixed, --hard)이 존재한다.

  • --soft : HEAD의 내용만 되돌린다.
  • --mixed : Staging Area의 내용까지 되돌린다.
  • --hard : Workgin Directory의 내용까지 되돌린다. (주의해서 사용!)

이번 글을 통해 HEAD, Staging Area(Index), Working Directory와 git reset의 동작원리를 이해할 수 있었습니다~!

profile
다음 단계를 고민하려고 노력하는 사람입니다

0개의 댓글