Git Revert vs Reset

Jeongkuk Seo
sjk5766
Published in
6 min readJan 13, 2019

본 포스팅에선 Git의 이력 되돌리기 명령어인 Reset과 Revert 차이점, 그리고 Reset의 3가지 옵션에 대해 설명하겠습니다.

Revert vs Reset

Git으로 commit을 하면 commit 이력이 남습니다. 이 때 Revert로 되돌리면 commit 이력을 유지한 채로 파일내용을 되돌릴 수 있으며, Reset으로 되돌릴 경우 commit 이력을 삭제한 채 파일내용을 되돌립니다. 예를 위해 네 번의 commit 작업을 수행한 repo를 준비했습니다.

이 상태에서 전 단계로 돌리기 위해 revert 명령어를 적용해보겠습니다.

전 단계로 돌리기 위해 git revert HEAD 명령어를 사용했습니다. 4번째 commit에서 파일에 추가한 “four data” 데이터는 되돌려 졌으며 (사라짐) git log 명령어 결과를 보면 이전 이력을 유지한채 파일을 복원한 새로운 커밋을 추가했습니다.

그렇다면 동일한 상황에서 git reset 명령어로 두 단계를 돌려보겠습니다.

두 단계 전으로 돌리기 위해 HEAD~2 를 사용했습니다. 3단계 전으로 돌리고 싶다면 HEAD~3 을 입력하면 됩니다. 확인 결과 git reset 명령어는 되돌리기 전의 이력을 삭제하는 것을 알 수 있습니다. 혹시 이 상태에서 reset 명령어를 입력하기 전 시점으로 돌아가고 싶다면 아래와 같이 입력합니다.

ORIG_HEAD는 reset 명령어를 입력할 때, 그 전 상태를 가리키는 포인터입니다. 이제 revert와 reset에 대한 차이점은 이해하였고, reset에 대해 좀 더 살펴보겠습니다.

Git Reset의 3가지 옵션

사실 이 부분을 이해하기 어려웠는데요, 계속해서 reset을 하다보니 이해했습니다. soft, mixed, hard 라는 3가지 옵션이 있으며, 옵션을 주지 않고 reset을 사용할 경우 Default 옵션은 mixed 입니다. 예시를 들며 설명하기 전에 결과 먼저 이야기하겠습니다.

  • soft 옵션에서는 되돌릴 때, staged와 modified 상태에 있는 파일을 유지합니다.
  • mixed 옵션에서는 되돌릴 때, modified 상태에 있는 파일만 유지합니다.
  • hard 옵션에서는 되돌릴 때, staged와 modified 상태에 있는 파일을 삭제합니다.

혹시 staged와 modified 상태를 모르시는 분들은 꼭 아래 링크를 읽으셔야 이해할 수 있습니다.

위 링크를 읽고 modified 상태는 working directory 영역, staged 상태는 staging 영역이 이해가시나요? 그럼 아래 내용을 더 읽어보셔도 됩니다.

우선 revert vs reset 에서 설명한 4개의 commit이 반영 된 초기 상태에서 git status 명령어를 입력하겠습니다.

[sjk5766@localhost git_3_state]$ git status
# On branch master
nothing to commit (working directory clean)
[sjk5766@localhost git_3_state]$ cat first.txt
first data
second data
thrid data
four data

초기 상태이므로 commit 할게 없다는 메시지를 확인할 수 있습니다. first.txt 파일을 살펴보면 4번의 각 commit 마다 data를 입력했습니다. 현 상태에서 first.txt 파일을 수정하고, new.txt라는 파일을 만들어 추가하겠습니다.

Changes to be commited 부분에 new.txt가 보이며 이는 commit 될 준비가 되었다는 의미로 staged 상태에 있습니다. Changed but not updated 부분은 first.txt 파일이 변경되었으나 commit될 준비가 되어있지 않으며, modified 상태에 있습니다.이 상태에서 reset 명령어의 soft 옵션을 사용해 한 단계 전 commit으로 이동하겠습니다.

reset 명령어가 되돌리는 명령어이기 때문에 되돌아가는 내용에 대해 굳이 설명하지 않겠습니다. 제가 하고싶은 이야기는 soft 옵션에서는 staging 영역과 working directory 영역이 유지가 된다는 이야기를 하고 싶었습니다. 그렇다면 동일한 조건에서 mixed와 hard 옵션에서 되돌리면 어떻게 되는지 확인해보겠습니다.

맨 위의 빨간 줄은, reset 명령 전으로 돌리는 명령입니다. soft 명령을 입력했을 당시와 동일한 환경으로 돌아갔다고 인지하시면 됩니다. 두 번째 빨간 화살표는 reset 명령어에 옵션이 없으므로 mixed 모드로 수행 된 것을 알 수 있습니다. 결과를 보면 staged 상태에 있는 new.txt가 untracked file로 빠진 것을 알 수 있습니다. 결과를 말하면 mixed 모드에서는 되돌리는 기능을 수행하고, staging 상태를 비워버립니다. 따라서 staged 상태에 있던 new.txt가 untracked file로 빠진 것을 알 수 있습니다.

마지막으로 hard 옵션은 어떨까요? 결과를 말하면 staging 영역에 있는 파일을 유지하거나 (soft), 비우거나 (mixed) 하지 않고 삭제해버립니다. 또한 working directory 영역에 있는 파일의 변경사항도 삭제합니다. 따라서 hard옵션을 줄 때는 매우 주의해서 사용해야 합니다.

위 화면에서 hard 옵션을 주면 되돌리면서 staging , working 디렉토리 영역에 있는 파일을 지워버리기 때문에 nothing to commit 메시지를 볼 수 있습니다.

--

--