or 현재 main 작업공간에 feature 브랜치를 잘못 당겨왔다. 그 결과 Merge 한 내용의 커밋 기록이 남았고, 이전 작업 상태로 돌리고 싶다.
🔥 커밋 취소하기:
git reset
git log 를 살펴본다.
$ git log --oneline
1938ys9 (HEAD -> main) Add newFile
lks313s Update Readme.md
df319eg Initial commit
가장 최근에 df319eg > lks313s > 1938ys9 순서대로 커밋했고, 마지막에 한 1938ys9 커밋을 취소하고 싶다.
git reset --hard <COMMIT_ID>
의 COMMIT_ID 에 되돌아가고자 하는 이전 커밋 아이디 (lks313s) 를 넣어 HEAD 가 다시 이전 커밋을 가리키도록 한다.
$ git reset --hard lks313s
git reset HEAD^
를 사용하여 최신커밋을 취소하고, 커밋되었던 파일을 unstaged 시킨다. (working tree에 남는다.) 커밋 여러 개를 되돌릴 경우, git reset HEAD~취소수량
을 입력한다. 주로 직전 커밋을 취소하고 싶은 경우 사용하는 것이 좋다.
$ git reset HEAD^ // 커밋 하나만 뒤로 돌린다.
$ git reset HEAD~1 // 취소 수량에 1만 넣었으므로 바로 위와 동일
$ git log --oneline
lks313s (HEAD -> main) Update Readme.md
df319eg Initial commit
$ git status
On branch main
nothing to commit, working tree clean
🔥 working tree 에서 수정한 파일 되돌리기:
git restore
$ git checkout -- <file> // 예전에 쓰던 방법
$ git restore <file> // 새로운 깃버전에서 출시
$ git reset HEAD <file> // 예전에 쓰던 방법
$ git restore --staged <file> // 새로운 깃버전에서 출시
git reset 은 HEAD 위치를 바꿔버리므로, 로컬 저장소의 깃 상태를 이전 상태로 강제 변경한다. 하지만 커밋을 원격 저장소에 push 한 상태라면, 로컬에서 커밋을 취소했을때 원격의 최신 상태와 어긋나버리게 된다. 이 경우, git revert
로 특정 커밋의 내용을 되돌릴 수 있다.
🔥 커밋 되돌리기:
git revert
$ git log --oneline
1938ys9 (HEAD -> main) Add newFile
lks313s Update Readme.md
df319eg Initial commit
$ git revert 1938ys9
커밋 메세지 작성을 위해 에디터 환경변수의 에디터가 실행된다.
Revert "Add newFile"
This reverts commit 1938ysbac01f0ef6bee04ae4f40c3dd8e5bf1d552.
$ git log --oneline
9wksl8l (HEAD -> main) Revert "Add newFile"
1938ys9 (origin/main) Add newFile
lks313s Update Readme.md
df319eg Initial commit
or 커밋메세지 잘못 썼다.
🔥 커밋 덮어쓰기:
git commit --amend -m <COMMIT_MESSAGE>
amend 옵션은 스테이징에 추가된 내용을 반영할 뿐 아니라, 커밋메세지도 업데이트 변경한다. 따라서 변경 내용이 없어도, 커밋메세지만 바꾸고 싶을때 사용할 수 있다.
[ 참고자료 ]