본문 바로가기
Git

[Git] git revert, git reset 으로 커밋 되돌리기 (5)

by 아마도개발자 2023. 11. 29.

 

git revert는 존재하는 어떤 커밋으로 되돌아갈 때 사용. 혹은 결과물에 문제가 생겨 정상적으로 작동하는 시점의 커밋으로 되돌아갈 때 사용한다.

 

revert와 reset 모두 이전의 커밋으로 되돌아간다는 목적은 같지만, 사용 용도와 기능에는 차이가 있다. 

 

 

 

 

git reset

git reset은 특정 시점의 커밋으로 되돌아간 뒤, 그 이후의 커밋들을 모두 삭제한다. 즉 돌아간 커밋의 시점으로 완전히 reset을 하는 것이다.

 

 

여기 4개의 커밋이 있다. 그런데 4번째 commit을 추가한 뒤, commit으로 추가된 내용에서 버그가 발견되어 빠르게 이전 커밋으로 돌아가야할 경우가 생겼다고 가정하자. 이럴 때 사용할 수 있는 것이 reset이다. 물론 reset을 사용할 경우 4번째 커밋이 사라지게 될 것이다. 그렇기 때문에 reset을 주로 쓰는 경우는

 

1. 나 혼자 로컬에서 작업을 진행 중 일때 (원격 브랜치로 커밋이 올라가지 않았을 때)

2. 나만 사용하는 브랜치에서 작업을 할 때

 

두 가지 경우에서만 사용하는 것이 좋다.

 

위 이미지 상태에서 아래 커맨드를 입력해보자.(HEAD^ 는 HEAD의 바로 이전을 의미한다)

git reset HEAD^

 

 

이렇게 4번째 커밋이 완전히 사라지고 3번 째 커밋으로 head가 돌아온 것을 확인할 수 있다.만약 직전 커밋으로 돌아가는 것이 아니라 그 이전의 커밋으로 돌아가는 것을 원한다면

 

git reset HEAD~2         # git reset HEAD~{숫자}
git reset cf89fe2        # git reset {커밋ID}

 

명령어를 통해 내가 원하는 시점의 커밋으로 돌아갈 수 있다. 또한, reset에는 다양한 옵션이 존재한다. 대표적인 명령어로는 soft, hard, mixed가 있고, 자주사용되는 옵션이기 때문에 필수로 알고 넘어가자.

 

우선 hard명령어부터 살펴보자. 다시 4번 째 커밋을 추가하고, reset으로 두 번째 커밋으로 돌아가 보자.

 

$git reset e28595b847e58aff273109e1814001ea6324a738 --hard

 

reset hard 실행 결과

 

git reset --hard를 통해 커밋을 되돌아가면 돌아간 커밋 이후의 모든 내용과 상태를 삭제한다. Working Directory에 있는 파일과 커밋 모두 삭제되는 것을 주의하여야 한다.

 

다시 4번째 커밋까지 채워준 뒤, soft옵션을 실습해보자. 이번에는 soft옵션을 사용하여 두 번째 옵션으로 돌아간다.

 

$git reset e28595b847e58aff273109e1814001ea6324a738 --soft

 

reset soft 실행 결과

 

hard와는 몇 가지 차이점이 발생했다. 우선, Working Directory의 파일이 삭제되지 않았다. soft옵션을 사용하여 reset을 하면 Working Directory의 내용은 삭제되지 않는다. 또, VS code의 Uncommitted Changes를 보면 hard 옵션을 사용했을 때와 차이가 있는 것을 알 수 있다. 이것을 git status로 bash에서 확인해보면

 

 

이렇게 두 번째 커밋 이후의 파일들이 Staging Area에 올라가있는 것을 볼 수있다. 즉 git add => (현재 시점) => git commit인 상태라고 볼 수 있다.

 

마지막으로 mixed는 reset에 아무런 옵션을 붙이지 않았을 때도 실행되는 default 옵션이다. 마찬가지로 2번 커밋으로 돌아가 보면

 

위와 같이 이력은 되돌려지고, 스테이지는 초기화된다. 즉, (현재 시점) => git add => git commit 의 상태가 되는 것이다.

 

git revert

 

git revert는 특정 시점의 커밋으로 돌아가지만, 커밋 내역은 그대로 남겨둔다.

위에서 다뤘던 reset의 문제는 커밋 내역을 강제로 조작한다는 것이다. 이를 방지하기 위해 git revert를 사용하면 커밋을 삭제하는 것이 아닌 revert커밋을  커밋 내역에 쌓는 방식으로 사용하여 문제를 해결할 수 있다.

 

사용방법은 reset과 흡사하다.

 

$git revert e28595 # git revert <커밋ID>

 

git revert 실행 결과

 

결과 화면을 보면 5 번째 커밋으로 revert커밋이 생긴 것을 알 수 있다. 또, 두 번째 커밋에서 추가했었던 example2.md파일이 Working Directory에서 사라진 것을 확인할 수 있다.

 

 

마지막으로 revertreset의 차이를 정리하자면

 

1. 커밋 내역의 유지 여부

2. 로컬 작업 내용인지 or 이미 원격 레포지토리에 push된 내용인지 구분

 

2가지 유의사항을 생각한 뒤에 자신에게 맞는 명령어를 사용하면 될 것이다.

물론, 되돌리기 커밋으로 history유지가 가능한 revert를 사용하는 것이 안정성 측면에서 좋을 것이라고 생각된다.