Git, CocoaPods, Xcode, Shell

[Git - terminal] git reset 사용방법 (#git reflog)

jake-kim 2023. 5. 10. 01:07

git reset 개념

  • 이미 commit된 파일을 되돌리는 기능
    • git reset --mixed {commit}: commit된 파일을 unstage 영역으로 올림(디폴트값)
    • git reset --soft {commit}: commit된 파일을 stage 영역으로 이동
    • git reset --hard {commit}: commit된 파일을 아예 날림
  • commit 해쉬값을 입력할 때, 어떤 해쉬값을 입력해야하는지 헷갈릴때가 있는데, HEAD가 이동될 commit으로 기억할것
  • 아래에서 HEAD^, HEAD~n라는 것도 나오는데, 이건 최근 개수가 아닌 HEAD를 이동시킨다는 의미로 이해할것

ex) 현재 아래(위가 최신)처럼 init file, add 1, add 2, add 3이 있을 때 add 3 커밋 날리기

git log --graph

  • add 3 커밋을 날리고 싶은경우, HEAD가 add 2 커밋으로 이동되어야하므로, add 2 커밋 해쉬값을 입력
    • add 2 부분의 커밋을 reset 대상으로 설정하고 수행
% git reset ac77075b5fe0a8f815aaba6247a53e2c16f45787
# Unstaged changes after reset:
# M	abc.txt
  • 결과 - "add 3" 커밋 날아감

  • git status로 확인 
    • --mixed로 적용되어 stage 영역에 리셋된 내용이 남아있음
% git status
# On branch main
# Changes not staged for commit:
#  (use "git add <file>..." to update what will be committed)
#  (use "git restore <file>..." to discard changes in working directory)
#	modified:   abc.txt
  • git diff로 변경된 파일 확인
% git diff              
# diff --git a/abc.txt b/abc.txt
# index 1191247..01e79c3 100644
# --- a/abc.txt
# +++ b/abc.txt
# @@ -1,2 +1,3 @@
#  1
#  2
# +3
  • 아래 예제를 계속 이어가기 위해 다시 add 3 커밋
% git commit -am "add 3"
# [main 7fd1f11] add 3
#  1 file changed, 1 insertion(+)

git reset HEAD

  • 현재 HEAD로 부터 기준을 새워서 몇번째까지 reset을 적용하고 싶은지 쉽게 사용이 가능
  • HEAD^는 HEAD의 위치를 HEAD바로 전으로 이동한다는 의미 (현재 커밋 취소)
    • git reset --mixed HEAD^: 최근 커밋 취소 & unstage 영역으로 이동 (디폴트값)
    • git reset --soft HEAD^: 최근 커밋 최소 & stage 영역에 있음
    • git reset --hard HEAD^: 최근 커밋 취소 & 날림
  • git reset HEAD~2: 최근 커밋으로부터 2개 이동한 (3번째 위치로 HEAD를 이동시킨다는 의미)
    • = 2개 커밋 취소 & unstage영역으로 이동

ex) git reset HEAD~n으로 여러개 초기화시키기

  • 초기 커밋 상태 

git log

  •  git reset HEAD~2 를 이용해 add 3, add 2 커밋을 초기화 시키고 HEAD를 add 1 커밋으로 위치시키기
# % git reset HEAD~2
# Unstaged changes after reset:
# M	abc.txt

결과)

git rebase -i와 git reset 사용해보기 (#git reflog)

  • 초기 상태

ex) interactive 중 하나인 git rebase -i에서 잘못 수정한 경우, rebase interactive하기 전으로 되돌리기

  • git rebase -i HEAD~3를 통해 HEAD를 "init file" 커밋으로 이동하고 rebase interactive 시작
    • 구체적인 git rebase -i 개념은 이전 포스팅 글 참고 
    • squash를 통해 add 1, add 2 커밋 합치기

  • git log로 결과 확인

git log

  • rebase -i 하기전으로 돌아가고 싶은경우, 더욱 구체적인 git log를 봐야하기 때문에 git reflog를 사용
    • git reflog는 최종 결과만 보여주는게 아닌 히스토리 커밋까지 모두 보여줌

git reflog

  • 로그중 HEAD@{3}부분을 보면 git rebase -i를 시도하여 checkout된것을 확인 가능
    • git rebase -i하기 전으로 돌아가야하므로 HEAD@{4}를 기준으로 reset을 이동될 수 있다고 예측이 가능
    • 되돌아갈 커밋 해쉬값 확인 "b7041b9"
  • git reset b7041b9 실행
% git reset b7041b9
  • 결과) 이전으로 이동된것을 확인

  • 디테일하게 보려면 git reflog 실행)
    • 이전에 작업했던 b7041b9도 여전히 확인 가능

정리

  • git reset {commit hash}: commit hash는 HEAD가 이동할 위치
    • git reset HEAD^: 최근 커밋에서 한 번 HEAD가 이동 (= 현재 커밋 삭제)
    • git reset HEAD~2: 최근 커밋에서 두 번 HEAD가 이동 (= 최근 2개 커밋 삭제)
  • git log: 커밋 결과값만 보임
  • git reflog: 모든 히스토리 커밋을 볼 수 있으므로 git rebase -i같은것을 시도한 후 다시 되돌리기가 용이