git reset HEAD [file명]
- 뒤에 파일명이 없으면 add한 파일 전체 취소
test.text파일을 add했다.
이 파일을 unstaged 상태로 변경해보겠다.
git reset HEAD
Staged 되었던 test.text파일이 Unstaged로 변경되었다.
git reset 명령어는 매우 위험한데, --hard 옵션과 사용하면 더욱 위험하다. 그러나 옵션 없이 사용하는 경우 워킹 디렉터리의 작업 파일은 변경되지 않는다.
git reset : 커밋 취소
git revert : 커밋 내용 되돌리기
git commit -amend : 커밋 덮어쓰기
commit 된 test.txt 파일을 커밋 취소해보았다.
소프트 리셋은 과거의 커밋으로 인해 발생한 변경 사항을 제거하지 않고 과거의 커밋으로 HEAD 포인터를 이동시킨다. 커밋 이력은 삭제하더라도 작업했던 변경내역은 유지하고자 할 때 유용하다.
git status 명령으로 확인해 보면 이전 커밋으로 발생한 변경사항에 여전히 접근 가능함을 확인할 수 있다. 이 파일들에 추가 수정사항을 반영하고 새로운 커밋으로 Git 리파지토리에 등록이 가능한 상태이다.
하드 리셋은 과거 이력으로 발생한 모든 수정사항을 깨끗하게 날려버린다. 이전 커밋의 변경사항을 유지할 필요가 없다면 하드 리셋을 사용하여 온전하게 이전의 커밋 상태로 돌아갈 수 있다.
현재 워킹 디렉토리와 스테이지 영역을 완벽하게 과거의 커밋 상태로 돌아가고자 한다면 reset --hard 를 사용한다.
git revert [돌아갈 커밋 해시]
해당 커밋 해시 이후의 커밋들이 삭제되는 것이 아닌, 해당 커밋 해시에 해당하는 내용만 삭제 된다. 그리고 삭제된 내용을 커밋으로 남긴다.
위 동작은 index.js파일을 추가하기 전으로 커밋을 되돌리는 것이다.
ec5be 커밋으로 발생한 변경사항을 제거하고, 삭제된 내용이 새로운 커밋으로 남았다.
git reset은 HEAD 위치를 바꿔서 로컬 저장소의 상태를 커밋 이전 상태로 강제로 변경해버린다. 이때 커밋을 협업중인 원격 저장소에 이미 push해버린 경우라면, 로컬 저장소와 원격 저장소의 상태가 달라지는 사태가 발생한다. force push할 수 없는 경우 git reset이 아닌 git revert로 특정 커밋의 내용을 되돌리는 방법을 사용해야한다.
revert는 특정 커밋을 되돌리는 작업도 하나의 커밋으로 간주해 커밋 히스토리에 추가한다.
한글 문서의 '저장' 기능처럼 커밋 위에 새로운 내용을 덮어 저장하는 기능이다.
amend는 마지막 커밋에 + 추가할 사항이 있는 경우 사용한다. 수정할 내용을 스테이징 영역에 등록하고 명령어를 실행하면 마지막 커밋에 덮어씌운다.
git log가 위와 같을 때 변경사항을 스테이징 영역에 add시키고, git commit --amend를 실행하면 변경사항이 마지막 커밋에 덮어씌워진다.
변경 메시지를 입력하면 최근 커밋의 메세지가 변경된다. 커밋 메세지를 잘못 적었을 경우 해당 명령어를 사용한다.
1. 원하는 시점으로 commit 되돌리기 (git reset)
2. 되돌려진 상태에서 다시 commit (git commit)
3. 원격 저장소에 강제로 push (git push -f origin [branch name])
자신의 로컬 상태를 remote에 강제로 덮어쓰기를 하는 것이기 때문에 주의 해야한다. 되돌아간 커밋 이후의 모든 커밋이 삭제된다.
Ref.
https://gitabout.com/8
https://www.zerocho.com/category/Git/post/581b7122809622001722fc0b