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 커밋 날리기
- 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 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로 결과 확인
- rebase -i 하기전으로 돌아가고 싶은경우, 더욱 구체적인 git log를 봐야하기 때문에 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같은것을 시도한 후 다시 되돌리기가 용이