IT

분리 된 HEAD 상태에서 git commit은 어떻게 분리 되었습니까?

lottoking 2020. 7. 9. 07:53
반응형

분리 된 HEAD 상태에서 git commit은 어떻게 분리 되었습니까?


이것은 일어난 일입니다.

지점 A가 있습니다. 지점 AI에서 많은 변경 사항이 적용되었습니다. 코드가 마음에 들지 갑자기 지점 A에서 이전 커밋을 확인했습니다. 그런 다음 더 많은 변경을 수행하고 지점 A에서 커밋했습니다. 이제이 커밋을 어디서나 사용할 수 없습니다. 이 코드를 잃어 잃어 발생하고 있습니까?


이전 커밋은 여전히 ​​reflog에 있습니다.

git reflog

커밋 목록이 표시되고 "잃어버린 버린"이 있어야합니다. 새로운 지점으로 만들 수 있습니다. 예를 들어 SHA-1이 ba5a739 인 경우 이전 커밋에서 "new-branch"라는 새 분기를 다음과 같이 만들 수 있습니다.

git branch new-branch ba5a739

데이터베이스가 제거되면 "손실"커밋이 삭제됩니다.


커밋은 이미 지적했듯이 여전히 reflog에서 사용할 수 있습니다. 다른 답변 외에도 다음은 새 분기를 병합하지 않고 분리 된 HEAD 커밋을 현재 분기로 직접 인계하는 방법입니다 .

  1. 분리 된 HEAD 상태에서 수행 한 커밋의 SHA-1 해시를

    git reflog
    
  2. 그런 다음 모든 커밋 해시를 가장 오래된 것부터 가장 오래된 것까지 순서대로 실행하십시오.

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    예를 들어, "처음 7 자"짧은 해시 형식으로 주어진 것이 하나 뿐인 경우 :

    git cherry-pick a21d053
    

이제 명령에서 언급 한 분리 된 HEAD 커밋 해시 당 하나의 커밋이 현재 분기에 새 커밋을 만듭니다. 또한 원래 커밋 메시지를 대신합니다.


다음 명령을 사용하여 강화 된 (매달린) 커밋을 사용하여 수 있습니다.

git fsck --lost-found

현재 헤드가 커밋 커밋 인 경우 감소 된 표시되지 않습니다.

git-fsck (1) 매뉴얼 페이지 에서 자세한 정보를 사용할 수 있습니다.

그런 다음 폐쇄 수있는 커밋에 분기를 만들 수 있습니다.

git branch new-branch ba5a739

작업 디렉토리의 상태에 대한 Git 용어는“ 분리 된 HEAD ”입니다. 여기 저축 하는 또 다른 곳이 있습니다.git reflog

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

git-1.7.5.1이 도움이됩니다.

$ git checkout master
경고 : 당신은 연결되지 않은 1 커밋을두고 있습니다.
당신의 지점 중 하나 :

  0b40dd6 분리 된 HEAD에 대한 커밋

새 지점을 유지하여 좋은 시간이 될 수 있습니다.
그렇게 광고 :

 분기 분기 new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

지점 '마스터'로 전환

당신은 그것을 잃지 사고 고, Git은 여전히 ​​사본을 유지합니다 (그러나 현재 지점장에 의해 도달 할 수 없습니다). git reflog명령을 사용하여 누락 된 커밋을 사용할 수 있습니다 . reflog는 브랜치 헤드의 히스토리 위치를 추적하고이를 사용하여 브랜치 헤드가 이전에 가리키고 바로 사용할 수 있습니다.


분리 된 헤드를 다시 git repo에 연결 다음 단계를 수행하십시오.

  1. git checkout "your branch with path but without remote name"

예를 들어, 원격 이름이 출발지이고 지점 이름이 bugfix/somebranch사용 된 경우git checkout bugfix/somebranch

  1. git reflog 분리 된 분기의 커밋 목록에서 커밋 SHA를 가져옵니다.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

모든 설정 !!


Sourcetree에서 git reflog가 작동하지 않는다는 것을 GUI를 사용하여 수행하는 방법을 알아 맙니 다.

먼저 Command History (보기 : Show Command Output)에서 메시지를 찾아 "잃어버린"커밋을 찾습니다. 잃어버린 커밋 후 "Switching Branch"행사에 있기를 바라며 커밋 ID가 1234567 인 커밋 주석을 볼 수 있습니다.

커밋 ID를 다음 단계로 이동합니다.

상단에 "Branch"버튼을 특정 커밋을 수있는 "New Branch"대화 상자가 나타납니다. 그 커밋이있는 새 브랜치를 찾을 수 있습니다!

이것은 나를 위해 잃어버린 일을 되찾았습니다!

참고 URL : https://stackoverflow.com/questions/9984223/what-happens-to-git-commits-created-in-a-detached-head-state

반응형