이것이 일어난 일입니다.
지점 A가 있습니다. 지점 AI에서 많은 변경 사항이 적용되었습니다. 코드가 마음에 들지 않았으므로 지점 A에서 이전 커밋을 확인했습니다. 그런 다음 더 많은 변경을 수행하고 지점 A에서 커밋했습니다. 이제이 커밋을 어디에서나 찾을 수 없습니다. 이 코드를 잃어 버렸습니까?
HEAD이고 분기 A가 이전 커밋에 남아 있었을 것입니다. 정확히 어떤 명령을 실행 했습니까?
이것이 일어난 일입니다.
지점 A가 있습니다. 지점 AI에서 많은 변경 사항이 적용되었습니다. 코드가 마음에 들지 않았으므로 지점 A에서 이전 커밋을 확인했습니다. 그런 다음 더 많은 변경을 수행하고 지점 A에서 커밋했습니다. 이제이 커밋을 어디에서나 찾을 수 없습니다. 이 코드를 잃어 버렸습니까?
HEAD이고 분기 A가 이전 커밋에 남아 있었을 것입니다. 정확히 어떤 명령을 실행 했습니까?
답변:
이전 커밋은 여전히 reflog에 있습니다.
git reflog
커밋 목록이 표시되고 "잃어버린"커밋이 있어야합니다. 새로운 지점으로 만들 수 있습니다. 예를 들어 SHA-1이 ba5a739 인 경우 이전 커밋에서 "new-branch"라는 새 분기를 다음과 같이 만들 수 있습니다.
git branch new-branch ba5a739
데이터베이스가 제거되면 "손실"커밋이 삭제됩니다.
git cherry-pick [SHA]분리 된 헤드 상태에서 실수로 커밋 한 경우 기존 커밋으로 커밋을 이동하는 데 사용
prune커밋 메시지에서 참조되는 분리 된 커밋도 삭제 하는지 알고 있습니까? 아니면 그들에게 다가 갈 수 있습니까?
커밋은 이미 지적했듯이 여전히 reflog에서 사용할 수 있습니다. 다른 답변 외에도 다음은 새 분기를 만들고 병합하지 않고 분리 된 HEAD 커밋을 현재 분기로 직접 인계하는 방법입니다 .
분리 된 HEAD 상태에서 수행 한 커밋의 SHA-1 해시를
git reflog
그런 다음 모든 커밋 해시를 가장 오래된 것부터 가장 오래된 것까지 순서대로 실행하십시오.
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 repo에 연결하려면 다음 단계를 따르십시오.
git checkout "your branch with path but without remote name"예를 들어, 원격 이름이 출발지이고 지점 이름이 bugfix/somebranch사용 된 경우git checkout bugfix/somebranch
git reflog
분리 된 분기의 커밋 목록에서 커밋 SHA를 가져옵니다.
git cherry-pick "commit hash1" "commit hash2" "commit hash3"
git push
모든 설정!!
Sourcetree에서 git reflog가 작동하지 않는다는 것을 알았으므로 GUI를 사용하여이를 수행하는 방법을 알아 냈습니다.
먼저, 명령 히스토리 (view : Show Command Output)에서 메시지를 찾아 "손실"커밋을 찾으십시오. 커밋을 잃어버린 후 "Switching Branch"명령에 들어가면 커밋 주석이 1234567 커밋으로 표시됩니다.
커밋 ID를 다음 단계로 가져갑니다.
상단 툴바에서 "지점"버튼을 누르면 특정 커밋을 지정할 수있는 "새 분기"대화 상자가 나타납니다. 커밋 ID를 거기에 넣고 새 브랜치 이름을 지정하고 브랜치 생성을 누르면 커밋이 손실 된 새 브랜치를 얻을 수 있습니다!
이것은 나를 위해 잃어버린 일을 다시 가져 왔습니다!
git reset보다는 오히려 않았다git checkout?