Git

GIT - reset & revert

마닐라 2021. 9. 23. 23:00

reset을 더 잘 이해하기 위해서 checkout과 비교를 해보면 좋다.

checkout은 HEAD를 직접적으로 가리키도록 바꾼다.

reset은 HEAD가 브랜치를 가리키고 있을 때 그 브랜치가 가리키고 있는 버전을 바꾼다.

만약 HEAD가 아무 브랜치를 가리키고 있지 않을 때는 checkout처럼 HEAD를 바꾼다.

 

git reset / checkout 그림

그림에서 보듯이 reset과 checkout은 엄연히 차이점이 존재하지만 두 명령어 모두 working directory는 B 인 상태로 같다는 공통점이 있다.

reset은 master가 가리키고 있는 버전을 바꿨고 checkout은 HEAD만 바꿨다.

reset명령어를 실행하면 C를 더이상 아무도 바라보고 있지 않기 때문에 log로 확인해보면 눈에 보이지 않는다.

delete와 같은 효과를 볼 수 있다.

checkout은 C는 master가 여전히 가리키고 있기 때문에 log로 확인해보면 눈에 보인다.

checkout과는 달리 reset은 삭제의 의미를 갖는다는 것을 알 수 있다.

 

git reset / checkout 그림

 

브랜치의 이름으로 reset / checkout 명령어를 실행했을 때는 reset 같은 경우 브랜치가 가리키고 있는 버전이 B이므로 git reset master 라고 실행했을 때 기존 결과와 똑같다.

그렇지만 git checkout의 경우 HEAD를 바꾸는 명령어 이므로 HEAD가 master를 가리키게 된다.

 

 

로그상에서 보이진 않지만 아이디를 기억해논 상태에서 git reset C를 하게되면 다시 위와 같이 C가 복원이 된다.

그리고 git checkout C를 하게 되면 아무 변화가 일어나지 않는게 아니라 HEAD가 직접적으로 커밋을 가리키게 된다.

HEAD가 어떤 브랜치를 가리키는게 아니라 커밋을 직접적으로 가리키는 경우를 Detached HEAD라고 부른다.

Detached HEAD는 여러가지 복잡성과 위험성이 있다고 한다.

 

git checkout [commit name] 명령어

 

Detached HEAD 상태로 바뀌었고 work 2의 내용을 가져오게 된다.

 

git reset [commit name] 명령어1

 

checkout과 달리 reset은 work 3 라는 버전이 삭제되는 효과가 나타난다.

 

git reset [commit name] 명령어2

 

눈에 보이지 않는 커밋 ID로 reset을 시도 하면 work 3의 내용이 복원이 된다.

난처한 상황이 생겼을 때에도 유용하게 사용할 수 있는 명령어다.

git은 버전을 웬만하면 지우지 않는다.

 

reset에는 --soft 와 --mixed 와 --hard 옵션이 있다.

3가지 옵션의 차이는 그림 상으로 명확하게 확인할 수 있다.

 

git reset --option 명령어

 

모두 HEAD->master 를 B로 가리키게 되는 것은 동일하다.

차이점은 위와 같은데 hard 옵션의 경우 working directory에 있는 내용을 모두 날려버리므로 권장하는 옵션은 아니다.

기본값은 mixed이다. 

 

이제 reset 과 revert를 비교해볼거다.

B라는 곳에서 문제가 생겼다고 가정하고 둘의 차이점을 살펴본다.

reset의 경우 git reset --hard A 라고 작성하면 B가 취소된 효과가 난다. HEAD -> master가 A를 가리킨다.

실패한 버전도 그대로 남기면서 새로운 버전을 만들어 A로 되돌리고 싶을 때가 있는데 그 때 사용하는게 revert이다.

git revert B를 사용한다. git reset A은 A라는 버전이 되는 것이고 git revert B는 B를 취소하는 것이다.

B에서 작업한 내용을 취소한 새로운 버전의 커밋이 생성되고 그 내용은 A에 있는 내용과 같다.

 

git reset / revert의 차이

 

뒤늦게 문제가 되는 버전을 발견했을 때 revert를 수행하면 충돌이 일어날 수 있다.

 

git revert 충돌 상황

 

git revert B 라고 하면 base인 A를 기반으로 수행하려고 하는데, D에서 success라는 내용이 추가되어있기 때문에 충돌이 일어난다. revert에서 충돌이 일어나는 상황은 보통 이런 상황에서 일어난다.

 

 

'Git' 카테고리의 다른 글

GIT - cherry-pick & rebase  (0) 2021.09.22
GIT - branch & conflict  (0) 2021.09.21
GIT - backup  (0) 2021.09.20
GIT - Version Control  (0) 2021.09.19