분리 된 HEAD 상태에서 작성된 git commit은 어떻게됩니까?


137

이것이 일어난 일입니다.

지점 A가 있습니다. 지점 AI에서 많은 변경 사항이 적용되었습니다. 코드가 마음에 들지 않았으므로 지점 A에서 이전 커밋을 확인했습니다. 그런 다음 더 많은 변경을 수행하고 지점 A에서 커밋했습니다. 이제이 커밋을 어디에서나 찾을 수 없습니다. 이 코드를 잃어 버렸습니까?


"지점 A에서 이전 커밋을 체크 아웃했다"라고 말하면 "지점 A를 이전 커밋으로 재설정합니다"를 의미합니까? 즉 당신은 실제로 git reset보다는 오히려 않았다 git checkout?
CB Bailey

아니요, 결제를 사용했습니다. reflog가 작동했습니다.
Mausimo

체크 아웃을 사용한 경우 분리 된 상태 HEAD이고 분기 A가 이전 커밋에 남아 있었을 것입니다. 정확히 어떤 명령을 실행 했습니까?
CB Bailey

1
OSX Lion에서 SourceTree GIT GUI를 사용하고있었습니다. 나는 지점 A에 있었고 지점 A에서 이전 커밋을 체크 아웃했습니다. 그런 다음 많은 코드 변경을 수행하고 커밋했습니다 (지점 A). 나는 HEAD가 분리되었다고 생각합니다.
Mausimo

좋아, 나는 당신이 지점 A에서 더 많은 변화를 저질렀다고 말했을 때 혼란스러워했다고 생각 합니다.
CB Bailey

답변:


185

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

git reflog

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

git branch new-branch ba5a739

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


3
나는 똑같은 일을했고 심장 마비로 잃어 버렸다고 생각했다. 정보 주셔서 감사합니다!
체이스

14
git cherry-pick [SHA]분리 된 헤드 상태에서 실수로 커밋 한 경우 기존 커밋으로 커밋을 이동하는 데 사용
Jan Aagaard Meier

3
또는 기존 분기로 전환하고 reflog에 나열된 "lost"커밋에 해당하는 "git merge HEAD @ {n}"n을 수행 할 수 있습니다.
eaykin

prune커밋 메시지에서 참조되는 분리 된 커밋도 삭제 하는지 알고 있습니까? 아니면 그들에게 다가 갈 있습니까?
Kamafeather

@ Kamafeather : 나는 그것이 도달 할 수 있다고 생각하지 않습니다.
Dietrich Epp

63

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

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

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

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

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

    git cherry-pick a21d053
    

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


11

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

git fsck --lost-found

현재 헤드가 커밋 커밋 인 경우 손실 된 것으로 표시되지 않습니다.

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

그런 다음 손실 된 커밋에 분기를 만들 수 있습니다.

git branch new-branch ba5a739

먼저 "git reflog"명령을 사용한 다음 하위 모듈에 대해 "git branch new-branch ba5a739"명령을 사용했습니다.
ondermerol

7

작업 디렉토리의 상태에 대한 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

지점 '마스터'로 전환

정보와 링크에 감사드립니다. 이 링크를 통해 무슨 일이 있었는지 이해할 수있었습니다.
Mausimo

6

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


4

분리 된 헤드를 다시 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

모든 설정!!


2

Sourcetree에서 git reflog가 작동하지 않는다는 것을 알았으므로 GUI를 사용하여이를 수행하는 방법을 알아 냈습니다.

먼저, 명령 히스토리 (view : Show Command Output)에서 메시지를 찾아 "손실"커밋을 찾으십시오. 커밋을 잃어버린 후 "Switching Branch"명령에 들어가면 커밋 주석이 1234567 커밋으로 표시됩니다.

커밋 ID를 다음 단계로 가져갑니다.

상단 툴바에서 "지점"버튼을 누르면 특정 커밋을 지정할 수있는 "새 분기"대화 상자가 나타납니다. 커밋 ID를 거기에 넣고 새 브랜치 이름을 지정하고 브랜치 생성을 누르면 커밋이 손실 된 새 브랜치를 얻을 수 있습니다!

이것은 나를 위해 잃어버린 일을 다시 가져 왔습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.