sitelink1 https://dev.to/neshaz/when-to-use-git-re...ckout-18je 
sitelink2  
sitelink3  

1. Revert

커밋해온 모든 변경 사항들을 rollback 시킨다.

 

git-revert.png

 

위의 그림처럼, 이전의 커밋 히스토리는 그대로 유지되나, 이것을 되돌리는 새로운 커밋이 그 이후에 추가된다.

 

 

2. Reset

working tree를 특정 reset할 커밋까지 되돌리고, 그 이후의 커밋들은 히스토리에서 모두 삭제된다.

 

git-reset.png

 

위 사진의 동작은, reset하기 전, hotfix 커밋을 2개 작성을 하였는데, 이 2개의 커밋을 없애고,

해당 브랜치의 첫번째 커밋으로 돌리고 싶으면, After Reset 처럼, 초록색 커밋의 Hash값으로 reset 커맨드를 실행한다.

 

이렇게 되면 이후 2개의 Orphans 커밋들은 히스토리에서 삭제된다.

 

1) syntax

git reset --hard <commitHash>

  > commitHash에 되돌리려는 커밋 해쉬값을 넣어 reset 커맨드를 실행한다. --hard 옵션을 통해 로컬의 모든 변경 사항을 지우게 된다.

 

2) 옵션별 상세

* --soft

예시> git reset --soft B

master 브랜치의 HEAD는 B 브랜치를 가리키게 되지만, 인덱스는 여전히 C에 대한 변경사항을 가지고 있다.

git status 명령을 실행하면, 여전히 C에 대한 변경사항이 로컬에서 적용되어있는 것을 확인 할 수 있다. (staging file로 적용되어 있음)

이 때 다시 git commit을 하면 C 변경사항을 커밋할 수 있게 된다.

 

* --mixed

예시> git reset --mixed B

master 브랜치의 HEAD는 B 브랜치를 가리키게 되지만, soft 옵션과 다르게 인덱스는 B commit에 맞게 변경되어 있다. (C commit의 변경사항을 담고 있지 않음)

하지만 working directory에는 여전히 C commit 내용에 대한 변경사항은 적용되어 있다.

따라서 git status 명령을 실행하면 C commit 변경 사항 내용이 Unstaged files로 적용되어 있는 것을 확인 할 수 있다.

이제 이 내용을 다시 커밋하여면, 해당 Unstaged files들을 모두 add 해주고 다시 커밋해주면 된다.
 

* --hard

예시> git reset --hard B

index도 B commit 내용을 가르키게 되고, working directory까지 C commit에 있던 변경사항들을 다 지워버린다.

따라서 C commit에 대한 변경 내용을 아예 확인 할 수 없는 상태가 된다.

그래서 이 옵션은 아예 커밋 변경사항을 히스토리까지 다 지워야 할때 --hard 옵션을 사용해주면 된다.