누락된 파일을 새로 추가하거나 기존의 파일을 업데이트 해야할 때
--amend옵션 지정
git add <수정파일>git commit --amend이전 커밋으로 되돌린 새로운 커밋을 만들고 싶을 때
revert명령어를 사용하여 과거의 이력으로 새로운 커밋을 생성한다.
reset 명령어로 커밋을 삭제할 수도 있지만, 커밋 이력 자체를 지우기보단 작업내용이 삭제된 새로운 커밋을 만든다.
git revert HEADgit revert -m HEADreset 명령을 사용하면 더 이상 필요 없어진 커밋들을 버릴 수 있다.
명령어 실행 시 어떤 모드로 실행할 지 지정하여 "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.javagit commit --amendgit rebase --continue1,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] "브랜치명"