$ git reset [커밋아이디 or HEAD~[n]]
바로 전 add 취소는 옵션 없이 git reset
만으로 가능하고, add를 취소하면 파일이 unstage 상태로 변경됩니다.
$ git reset --soft [커밋아이디 or HEAD~[n]]
커밋 이력만 되돌리고 파일 내용은 유지합니다. 즉, add는 되어있는 staged 상태로 돌아갑니다.
$ git reset --mixed [커밋아이디 or HEAD~[n]]
커밋, 인덱스 삭제. 파일의 변경만은 남깁니다. 즉, add 이전인 unstage 상태로 돌아갑니다.
git reset에서 옵션을 지정하지 않을 때의 기본값은 이것입니다.
$ git reset --hard [커밋아이디 or HEAD~[n]]
커밋 이력, 파일 내용을 전부 되돌립니다. (모든 이력 삭제)
변경 자체를 수중(워킹 트리)에 남길 필요조차 없을 만큼 불필요한 커밋이었을 때만 사용합니다.
이 명령을 사용하면 자신의 local의 내용을 remote에 강제로 덮어쓰기를 하는 것이기 때문에 주의해야 합니다. 되돌아간 commit 이후의 모든 commit 정보가 사라집니다.
특히, 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 팀원과 상의 후 진행하는 것이 좋습니다.
1. 워킹 디렉터리에서 commit 되돌립니다.
$ git reset HEAD^
가장 최근의 commit을 취소하고 워킹 디렉터리를 되돌립니다. (기본 옵션: --mixed)
$ git log oneline
로그를 확인합니다.
$ git reset [커밋아이디 or HEAD~[n]]
원하는 시점으로 워킹 디렉터리를 되돌립니다.
2. 되돌려진 상태에서 다시 commit을 합니다.
$ git commit -m "Commit messages"
3. 원격 저장소에 강제로 push 합니다.
$ git push origin [branch name] -f