Git에서 고아 커밋 찾아보기


102

내 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 checkout -b lostbranchname-브랜치의 내용이 아닌 브랜치의 이름에만 관심이 있다면 수동으로 삭제 (또는 이름 변경) 할 수 있습니다 .git/refs/heads/lostbranchname.
Antony Hatchkins

1
그리고이 git 폴더를 푸시하는 업스트림이 없습니까?
Lakshman Prasad

1
안타깝게도 실제로 열등한 소스 제어 시스템을위한 일종의 대리 저장소입니다. 다른 시스템의 번거 로움없이 모든 git의 기능과 장점을 얻기 위해 로컬로 사용하고 있습니다. 그러나 적어도 다른 시스템은 스스로를 임의로 손상시키지 않습니다. 그래도 내가 잃어버린 것은 다른 시스템에 마지막으로 체크인 한 이후의 변경 사항뿐임을 의미하며 이미 복구했습니다. 새로운 저장소를 시작할 시간입니다!
Ben Hymers

7
나는 git가 당신을 "이런 종류의 일을 처리"하게 만들었거나 그것이 스스로 타락했다고 말하기를 주저합니다. 백업 외에 데이터 손실에 대해 완전히 안정적인 것은 없습니다.
Cascabel

1
나는 정말로 알고있다, 나는 내가 나의 예쁜 역사를 잃어버린 것에 대해 (자연스럽게) 조금 슬퍼합니다. 그것은 git의 잘못이 아니며 다른 시스템은 주어진 파일 시스템 오류와 동일하게 작동합니다.
Ben Hymers

답변:


135

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

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


3
감사. github에서 고아 풀 요청을 가져 오려고 할 때이 정보를 찾은 유일한 곳입니다. 내 문제를 해결했습니다.
SystemParadox 2011

6
누구나 gitk에서 모든 것을 원할 경우 : [alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&(편집 : 단일 백틱이 여기에서 작동하지 않는 것처럼 보이는 이중 백틱을 상상해보십시오)
mbx

1
멋진 팁 @mbx! 고아 커밋 간의 링크를 그래픽으로 볼 수 있으면 매우 유용합니다!
Ben Hymers

@BenHymers "rebase / squash"와 같은 커밋 관계에 대해 점선을 얻을 수 있다면 멋질 것입니다. 나는 아직 그 방법을 찾지 못했습니다.
mbx 2015-06-20

위의 답변을 썼을 때 리플 로그에 대해 몰랐습니다. 정말 유용한 도구입니다!
Jamey Hicks

17

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를 계속 진행합니다.


4

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

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

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


3

일반적으로 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참조되지 않은 고아는, 그들의 조상 커밋에서 맥락이있다.


방금 잃어버린 작업 시간을 절약했습니다! 푸시 git reflog --all되지 않은 커밋이있는 로컬 브랜치를 실수로 삭제했지만 표시되지 않습니다. git log --graph --reflog매우 눈에
띄었습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.