Git에서 고아 커밋 찾아보기 fsck –full’은 “치명적 :

내 git 저장소가 어떻게 든 불안정 해졌습니다. 오늘 아침에 msysgit을로드했고 현재 디렉토리 뒤에 브랜치 이름이 표시되는 대신 “((ref : re …))”라고 표시되고 ‘git status’는 모든 것을 a 새 파일, ‘git log’및 ‘git reflog’는 “치명적 : 잘못된 기본 개정판 ‘HEAD'”등을 알려줍니다.

‘git reflog –all’또는 ‘gitk –all’을 수행하면 저장소의 나머지 부분이 손상되지 않은 것으로 표시되지만 작업중인 브랜치가 사라진 것처럼 보이므로 HEAD가 존재하지 않는 것 같습니다. 무엇이든 가리 킵니다.

나는 git이 모든 종류의 정보를 보유하고 있다는 것을 알고 있으며, 내 커밋이 어떻게 든 고아가되었다고 가정하고 있습니다. 그러면 커밋을 표시하여 HEAD를 재설정 할 수있는 명령이 있습니까?

편집 : 오, 이런. 나는 ‘git fsck’를 발견했고 ‘git fsck –full’은 “치명적 : 개체 03ca4 …가 손상되었습니다”라고보고합니다. 악마는 그것에 대해 무엇을 할 수 있습니까?

편집 : 오, 오 이런. 다른 브랜치를 체크 아웃 한 다음 ‘git checkout -b lostbranchname’을 사용하여 동일한 이름으로 원래 브랜치를 다시 만들려고했는데 git은 “오류 : 참조 참조를 해결할 수 없습니다. refs / heads / lostbranchname : 오류 없음, 치명적 : 실패했습니다. 업데이트를 위해 참조 잠금 : 오류 없음 “. ‘오류 없음’은 특히 심한 오류 여야합니다. 그래서 그것은 여전히 ​​매달려 있지만 사용할 수없고 죽일 수도없는 것처럼 보입니다.

편집 : 슈퍼 듀퍼 오 이런. 여기에 제안 된대로 여러 가지를 풀고 재 포장하고 교체 했습니다. 하드 디스크 오류로 손상된 Git 개체를 복구하는 방법? , 그러나 이제 ‘git status’와 같은 무해한 것으로 인해 다른 해시가 손상된 것으로보고되었습니다. 나는 모든 것이 물에 빠져 있다고 생각합니다. 힘내는 사랑스럽고 모든 것이지만 이런 종류의 일을 다룰 필요는 없습니다.



답변

이것을 열어 두는 것보다 내 질문에 답할 것이라고 생각합니다. 사용 git reflog --all은 고아 커밋을 탐색하는 좋은 방법이며 기록을 재구성 할 수있는 SHA1 해시를 사용합니다.

하지만 제 경우에는 저장소가 손상되어 도움이되지 않았습니다. git fsck저장소 자체에서 오류를 찾고 수정하는 데 도움이 될 수 있습니다.


답변

git 2.9.x / 2.10 (Q3 2016)을 사용하면 git reflog --all더 이상 사용할 필요 git reflog가 없으며 충분합니다.

SZEDER Gábor ( )의 commit 71abeb7 (2016 년 6 월 3 일)을 참조하십시오 . (Merged by Junio ​​C Hamano in commit 7949837 , 06 Jul 2016)szeder
gitster

reflog: reflog과거의 루트 커밋을 계속 걷는다.

저장소에 하나 이상의 루트 커밋이 포함 된 경우 해당 HEAD 리플 로그에는 여러 “생성 이벤트”, 즉 “from”값이 null sha1 인 항목이 포함될 수 있습니다.
이러한 reflog를 나열하는 것은 현재 reflog에 이전 항목이 포함되어 있더라도 첫 번째 항목에서 조기에 중지됩니다.
이로 인해 사용자가 자신의 리플 로그가 ‘ git checkout --orphan‘ 뒤에 잘 렸다고 생각하게 만들 수 있습니다 .

이전 reflog 항목의 “new”값을 기반으로 이러한 생성 이벤트를 지나서 reflog를 계속 진행합니다.


답변

git의 좋은 기능 중 하나는 손상을 감지한다는 것입니다. 그러나 손상으로부터 보호하기위한 오류 수정은 포함되어 있지 않습니다.

이 저장소의 내용을 다른 시스템으로 푸시했거나 손상된 부분을 복구하기위한 백업이 있기를 바랍니다.

나는 Windows에서 git에 대한 경험이 없지만 Linux 또는 OS X에서 git에서 이런 종류의 동작을 본 적이 없습니다.


답변

일반적으로 git reflog출력이 혼란 스럽습니다. 에서 커밋 그래프를 이해하는 것이 훨씬 쉽습니다 git log --graph --reflog. 커밋 요약 만 표시하도록 형식을 재정의하면 그래프를 더 쉽게 따라갈 수 있습니다.

$ git alias graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

그에서 그것은 그 분명 e3124bf하고 6a7a52e참조되지 않은 고아는, 그들의 조상 커밋에서 맥락이있다.