git reset과 git revert 둘 다 결과적으로는 되돌릴 때 사용하는 것이지만 둘 사이에는 차이가 있다. 이제부터 이 둘의 차이를 알아볼 예정이다.
git reset
은 좀 전의 commit 내역에 남기지 않고 좀 전의 commit을 취소하고 싶을 때 사용한다.
현재 commit 이력은 다음과 같다.
모두 a.txt를 가지고 있으며 각 commit의 a.txt 내용은 아래와 같다.
a : -1
b : 1
c : 0
각각의 옵션을 붙여 b로 돌아갔을 때 무슨 일이 발생할지 알아볼 것이다.
참고로, repository, staging area, working directory가 무엇인지는 여기에서 따로 기재하지 않을 예정이다.
git reset
에는 세 가지 옵션이 있다. --hard
, --mixed
, --soft
가 있는데 각각을 붙였을 때 어떤 일이 일어나는지 살펴보자.
git reset --hard를 사용하면 repository, staging area, working directory 모두 b의 상태로 돌아가게 된다.
git reset 6872413 --hard
- 일단 확실히 repository는 b의 상태로 돌아갔을 것이다.
cat a.txt
로 확인했을 때, -1을 출력하는 것을 볼 수 있고 working directory는 b의 상태로 돌아갔음을 알 수 있다.
(c의 상태였다면 0을 출력했을 것이다.)git status
로 확인했을 때, nothing to commit, working tree clean이라는 문구를 볼 수 있다. 즉, staging area 또한 b의 상태로 돌아갔음을 알 수 있다.
git reset 6872413 --mixed
- 일단 확실히 repository는 b의 상태로 돌아갔을 것이다.
cat a.txt
로 확인했을 때, 그대로 0을 출력하는 것으로 보아 working directory 또한 c의 상태에 머물러있음을 알 수 있다.git status
로 확인했을 때, a.txt가 modified가 되었으며 빨간색이므로 staging area는 b의 상태로 돌아갔음을 알 수 있다.
참고로 reset시 어떤 옵션도 주지 않게 되면 --mixed가 default다.
git reset 6872413 --soft
- 일단 확실히 repository는 b의 상태로 돌아갔을 것이다.
cat a.txt
로 확인했을 때, 그대로 0을 출력하는 것으로 보아 working directory 또한 c의 상태에 머물러있음을 알 수 있다.git status
로 확인했을 때, a.txt가 modified가 되었으며 초록색이므로 staging area는 c의 상태에 머물러있음을 알 수 있다.
reopsitory | staging area | working directory | |
---|---|---|---|
hard | b | b | b |
mixed | b | b | c |
soft | b | c | c |
git revert
는 결과적으로 봤을 때 이전 상태로 되돌리는 것을 의미하는 것은 맞지만, 되돌린 내역까지 기록으로 남게 된다.
git revert 4aadc32
이렇게 새로운 commit이 남게 되고,
결과적으로 봤을 때, c의 상태를 revert 하였으니 a.txt 파일에는 -1이 남게 된다.
학과에서 프로젝트를 할 때는 변경사항을 되돌릴 때 무조건 revert 것 같다(사실 아무것도 모르고 git desktop을 사용했기에... 뭔지도 모르고 일단 쓴게 저거다...). 실무에서는 git을 끼고 살아야 하니 열심히 따라가는 중이다!