먼저 HEAD가 무엇인지 명확히하자 무엇인지, 분리되었을 때의 의미를 .
HEAD는 현재 체크 아웃 된 커밋의 심볼 이름입니다. HEAD가 분리되지 않은 경우 ( "정상" 1 상황 : 분기가 체크 아웃 된 경우) HEAD는 실제로 분기의 "ref"를 가리키고 분기는 커밋을 가리 킵니다. 따라서 HEAD는 지점에 "연결"됩니다. 새 커밋을 만들면 HEAD가 가리키는 분기가 새 커밋을 가리 키도록 업데이트됩니다. HEAD는 지점을 가리 키기 때문에 자동으로 수행됩니다.
git symbolic-ref HEAD
수확량 refs/heads/master
"마스터"라는 지점이 체크 아웃되었습니다.
git rev-parse refs/heads/master
수율 17a02998078923f2d62811326d130de991d1a95a
커밋은 마스터 브랜치의 현재 팁 또는 "헤드"입니다.
git rev-parse HEAD
또한 수율 17a02998078923f2d62811326d130de991d1a95a
이것은 "심볼 심판"이라는 의미입니다. 다른 참조를 통해 객체를 가리 킵니다.
(심볼 ref는 원래 심볼릭 링크로 구현되었지만 나중에 심 링크가없는 플랫폼에서 사용할 수 있도록 추가 해석을 통해 일반 파일로 변경되었습니다.)
우리는이 HEAD
→ refs/heads/master
→17a02998078923f2d62811326d130de991d1a95a
HEAD가 분리되면 분기를 통해 간접적으로 가리키는 대신 커밋을 직접 가리 킵니다. 분리 된 HEAD를 명명되지 않은 분기에있는 것으로 생각할 수 있습니다.
git symbolic-ref HEAD
실패 fatal: ref HEAD is not a symbolic ref
git rev-parse HEAD
yields 17a02998078923f2d62811326d130de991d1a95a
상징적 인 참조가 아니기 때문에 커밋 자체를 직접 가리켜 야합니다.
우리는 HEAD
→17a02998078923f2d62811326d130de991d1a95a
분리 된 HEAD로 기억해야 할 중요한 점은 커밋이 참조되지 않은 경우 (참조가 도달 할 수없는 경우) 다른 커밋을 체크 아웃 할 때 "매달리게"됩니다. 결국, 이러한 댕글 링 커밋은 가비지 수집 프로세스를 통해 정리됩니다 (기본적으로 2 주 이상 유지되며 HEAD의 reflog에서 참조하여 더 오래 유지 될 수 있음).
1
HEAD가 분리 된 상태에서 "정상적인"작업을하는 것은 완벽합니다. 리플 로그에서 기록을 삭제하지 않기 위해하는 일을 추적해야합니다.
인터랙티브 리베이스의 중간 단계는 분리 된 HEAD (부분적으로 활성 브랜치 reflog의 오염을 피하기 위해)로 수행됩니다. 전체 리베이스 작업을 마치면 리베이스 작업의 누적 결과로 원래 분기를 업데이트하고 HEAD를 원래 분기에 다시 연결합니다. 제 생각에는 리베이스 프로세스를 완전히 완료 한 적이 없습니다. 그러면 rebase 작업으로 가장 최근에 처리 된 커밋을 가리키는 분리 된 HEAD가 남게됩니다.
상황을 복구하려면 분리 된 HEAD가 현재 가리키는 커밋을 가리키는 분기를 작성해야합니다.
git branch temp
git checkout temp
(이 두 명령은로 축약 될 수 있습니다 git checkout -b temp
)
그러면 HEAD가 새 temp
분기에 다시 연결됩니다 .
다음으로, 현재 커밋 (및 히스토리)과 정상 작동하는 분기를 비교해야합니다.
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(아마도 로그 옵션을 시험 해보고 싶을 것입니다 : add -p
, --pretty=…
전체 로그 메시지를 보려면 떠나십시오 .)
새 temp
지점이 좋아 보인다면이 master
를 가리 키도록 업데이트 (예 :) 할 수 있습니다.
git branch -f master temp
git checkout master
(이 두 명령은로 축약 될 수 있습니다 git checkout -B master temp
)
그런 다음 임시 분기를 삭제할 수 있습니다.
git branch -d temp
마지막으로, 당신은 아마 다시 설립 된 역사를 추진하고 싶을 것입니다 :
git push origin master
--force
원격 브랜치를 새 커밋으로 "빨리 전달"할 수없는 경우 (예 : 기존 커밋을 삭제하거나 다시 쓰거나, 약간의 히스토리를 다시 쓰지 못함) 푸시하려면이 명령의 끝에 추가해야 할 수도 있습니다.
리베이스 작업 도중에 있다면 정리해야합니다. 디렉토리를 찾아 리베이스가 진행 중인지 확인할 수 있습니다 .git/rebase-merge/
. 해당 디렉토리를 삭제하여 진행중인 리베이스를 수동으로 정리할 수 있습니다 (예 : 활성 리베이스 작업의 목적과 컨텍스트를 더 이상 기억하지 않는 경우). 일반적으로을 사용 git rebase --abort
하지만 피할 수있는 추가 재설정을 수행합니다 (HEAD를 원래 분기로 다시 이동하고 원래 커밋으로 다시 설정하여 위에서 수행 한 작업 중 일부를 취소합니다).