sitelink1 | https://dev.to/neshaz/when-to-use-git-re...ckout-18je |
---|---|
sitelink2 | |
sitelink3 |
1. Revert
커밋해온 모든 변경 사항들을 rollback 시킨다.
위의 그림처럼, 이전의 커밋 히스토리는 그대로 유지되나, 이것을 되돌리는 새로운 커밋이 그 이후에 추가된다.
2. Reset
working tree를 특정 reset할 커밋까지 되돌리고, 그 이후의 커밋들은 히스토리에서 모두 삭제된다.
위 사진의 동작은, 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 옵션을 사용해주면 된다.