누락된 파일을 새로 추가하거나 기존의 파일을 업데이트 해야할 때
--amend
옵션 지정
git add <수정파일>
git commit --amend
이전 커밋으로 되돌린 새로운 커밋을 만들고 싶을 때
revert
명령어를 사용하여 과거의 이력으로 새로운 커밋을 생성한다.
reset 명령어로 커밋을 삭제할 수도 있지만, 커밋 이력 자체를 지우기보단 작업내용이 삭제된 새로운 커밋을 만든다.
git revert HEAD
git revert -m HEAD
reset 명령을 사용하면 더 이상 필요 없어진 커밋들을 버릴 수 있다.
명령어 실행 시 어떤 모드로 실행할 지 지정하여 "HEAD"위치와 인덱스, 작업 트리 내용을 함께 되돌릴지 여부를 선택할 수 있다.
hard
로 변경하여도 복원이 가능하다.
git reset --hard HEAD~~
: 최근 2개의 커밋 삭제git reset --hard ORIG_HEAD
모드명 | HEAD 위치 | 인덱스 | 작업 트리 |
---|---|---|---|
soft | 변경 O | 변경 X | 변경 X |
mixed(default) | 변경 O | 변경 O | 변경 X |
hard | 변경 O | 변경 O | 변경 O |
cherry-pick
을 이용하여 다른 브랜치의 커밋을 복사하여 현재 브랜치로 가져올 수 있다.
git cherry-pick <커밋id>
rebase 명령어에 "i"옵션을 지정하면 커밋을 다시 쓰거나 다른 커밋과 바꿔 넣을 수 있으며 특정 위치의 커밋을 삭제하거나 여러 커밋을 하나로 통합하는 작업을 할 수 있다.
git rebase -i HEAD~~
HEAD~HEAD~~
까지 과거의 커밋을 통합한다.git rebase -i HEAD~~
git add update.java
git commit --amend
git rebase --continue
1,5번과 같이 히스토리를 건드리는 작업을 권장하지 않는다.
2,3,4번은 종종 필요할 것 같다.
결론적으로 checkout commit의 주 목적은 특정 커밋에서 새로운 브랜치를 만들때 사용한다.
reset | checkout |
---|---|
HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 한다. | HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 한다. |
HEAD도 결국 간접적으로 다른 커밋을 가리키게되는 효과가 생긴다. | 브랜치를 통하지 않고, 커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 한다. |
HEAD->브랜치->커밋
상태를 attached HEAD라고 한다.Detached HEAD 상태는 브랜치에 연결되어 있지 않아 관리가 불가능하다. 그래프에 보이지 않고, 브랜치를 이동하면 사라진다. 그저, 찾을 방법이 있다는 것이다.
reflog
를 사용하여 브랜치를 만들면 된다. 그러면 커밋을 살릴 수 있다.
1,2,3,4번 커밋 history가 있다. 현재 head는 4번 커밋을 향해있다.
git에서 가리키는 referenced commit이 변경된 내역이다.
reflog를 기록하는 것은 대표적으로 HEAD와 branch이다.
HEAD의 업데이트 기록을 출력한다.
내용은 저장소 디렉토리의 .git/logs/refs/heads/.
혹은 .git/logs/HEAD
에 기록
git reflog
(동일한 명령 : git reflog show HEAD
)git reflog [show] "브랜치명"