컴퓨터가 죽은 후 Git 저장소가 손상됨


94

내 컴퓨터가 죽었고 이제 내 git 저장소 중 하나가 손상되었습니다. 결제 마스터를 시도하면 다음과 같이 알려줍니다.

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

실행 git stash하면 다음을 얻습니다.

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

그래서 내가 무엇을 할 수 있니?

업데이트 출력 git reflog:

fatal: bad default revision 'HEAD'

별로 유망하지 않은 ... 결과 git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

.git/refs/heads/master존재 하는지 그리고 그 내용이 저장소의 유효한 커밋 해시인지 확인할 수 있습니까 (예 :를 사용하여 확인할 수 있음 git show <hash>)?
찌르기

나는 이것이 명백하다는 것을 알고 있지만 여전히 묻습니다. 같은 git repo의 원격 저장소가 있습니까?
Tuxdude 2013 년

의 내용을 @poke .git/refs/heads/master/한 무리의이다^@
vainolo

네 @Tuxdude,하지만 내 최신 변경 사항으로 업데이트
vainolo

1
무엇을 git reflog말합니까? 달리기를 시도해 보셨습니까 git fsck?
kynan

답변:


173

나는 다음을 통해 회복 할 수 있었다.

rm .git/refs/remotes/origin/HEAD
git fetch --all

제 경우에는 일부 로컬 및 원격 브랜치를 삭제했기 때문에 발생했습니다 (어쨌든 .git / refs / remotes / origin / HEAD 파일이 일관성이없는 상태로 남아 있음). 위에 언급 된 파일의 내용을 기존 로컬 브랜치 (예 : ref : refs / remotes / origin / master)를 가리 키도록 변경하면이 문제가 해결되었습니다. 그래도 HEAD가 현재 분기에없는 커밋을 가리킬 수 있기 때문에 위의 접근 방식이 더 나을 수 있습니다.
crissdev

특정 git 하위 모듈에 문제가 발생하는 경우 첫 번째 명령이 약간 변경됩니다.rm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe

1
나는해야 rm -rf .git/refs/remotes/origin했지만 u는 나를 올바른 방향으로 가리켰다
Jacka

23

깨진 git 저장소 복구에 제안 된 단계에 따라 시작하십시오 .

  • .git/refs여전히 유용한 것이 있는지 확인
  • 마지막에 git reflog있었던 .git/logs/refs/heads/master브랜치 의 내용을 확인 하고 실패
  • 실행 git fsck, 잠재적으로 --unreachable또는--lost-found

이를 통해 masterref가 무엇인지 파악하여 이를 복원 할 수 있습니다 (예 : 올바른 SHA1을 .git/refs/heads/master.

해당 커밋에 포함 된 개체가 실제로 손상된 경우 HEAD불행히도 커밋을 복원 할 수 없습니다 . 작업 트리 및 / 또는 인덱스가 손상되지 git reset --soft않았다고 가정 git reset하면 이전 커밋을 시도 하거나 실패한 다음 커밋을 다시 수행 할 수 있습니다. 작업 트리 sa git checkout -f또는 git reset --hard.


나는을 보았다 .git/logs/refs/heads/mybranch. 이 브랜치에 대한 일종의 커밋 내역을 보여줍니다. 그것을 파헤쳐 서 SHA를 선택하고 git show. (각 커밋에는 두 개의 SHA가 있으며 저자 이름 바로 앞의 두 번째를 선택했습니다.) 마지막 하나는 손상되었지만 이전 하나는 git shown 이 될 수 있으며 그런 다음 git push origin abcdef:mybranch.
에드 에이 비스

12

Windows 8.1에서 블루 스크린으로 인해 비슷한 문제가 발생했습니다.

이 위치에 파일이 있습니다 ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

그리고이 폴더의 다른 분기 파일에는 내부에 긴 문자열이있는 반면 비어 있습니다.

NB 변경 / 커밋이 없습니다.

  • <problem-branch>파일을 백업했습니다
  • 파일을 삭제했습니다.
  • git fetch --all 다시 가지를 얻으려면

그런 다음 탭 자동 완성이 다시 작동하기 시작했습니다.


6

수정 된 파일이 많지 않은 경우이 문제를 해결하는 가장 편리한 방법은 다음과 같습니다.

  1. 리포지토리에서 수정 한 파일 백업
  2. 기존 저장소 제거
  3. 서버에서 다시 복제
  4. 1 단계의 파일을 저장소에 붙여넣고 git commit -a

예, 아무도 재 복제를 생각할 수 없었습니다. 좋은 제안
셀만 Genç

5

git \ refs \ heads 디렉토리에서 마스터 파일을 삭제하여이 문제를 해결했습니다.


이것은 도움이되었고 intellij의 내 목록에서 브랜치를 제거하고 새 브랜치로 확인했습니다. 다행히도 변경 사항을 푸시하여 모두 거기에있었습니다.
OAM

4

계산 된 동결 및 충돌 후 git 분기가 다음 메시지와 함께 손상되었습니다 git fatal: your current branch appears to be broken. 나는 아무것도 할 수 없었다.

그 후 git fsck분기에 error: Invalid HEAD. refs/heads/<branch>했다 invalid sha1 pointer.

여기의 옵션을 .git/refs/heads/<branch>따를 때 메모장 ++ 편집기에서 열었고 각 sha1 문자는 NUL.

다행히 분기를 원격 상태로 재설정하기 만하면되었으며 이는 bitbucket repo에있었습니다. 원격 리포지토리의 끝에서 sha1을 가져 .git/refs/heads/<branch>와서 저장 한 다음git reset --hard HEAD 를 수행하고 모든 작업을 정상으로 되돌 렸습니다.


2

나는 푸시를 잊어 버릴 정도로 바보 였고 커밋을 수행하는 동안 내 컴퓨터가 충돌했습니다. .git / logs / refs / heads /를 열어 마지막 커밋을 제외한 모든 것을 복구 할 수 있습니다.

이 파일에는 분기에 대한 모든 커밋 (SHA 포함)이 포함되어 있습니다. 복구를 위해 수행 한 작업은 다음과 같습니다.

  • 최신 변경 사항을 임시 폴더에 백업
  • "깨끗한 슬레이트"로 이동
    • git checkout master
    • git reset --hard
  • 로그에서 두 번째에서 마지막 커밋까지 체크 아웃
  • 이 분리 된 머리에서 가지를 만듭니다
  • 푸시
  • 최신 변경 사항 복원
  • 다시 커밋

따라서 멍청한 실수를하더라도 하루 종일 git 작업으로 즉시 되돌려지지는 않습니다. :)


1

너무 늦은 응답이라는 것을 알고 있지만 origin/head. 을 실행하여 확인할 수 있습니다 git branch -r. origin/head원격 원점을 가리키는 것이 보이지 않으면를 실행하여이를 설정할 수 있습니다 git remote set-head origin {{your branch name}}.

이제 git branch -r다시 실행 하면 다음과 같은 내용이 표시됩니다. origin/HEAD -> origin/develop

이 문제를 겪고있는 다른 사람에게 도움이되기를 바랍니다.


1

참조를 잠글 수 없음 오류로 인해 마스터 브랜치를 체크 아웃 할 수 없습니다. 나는 결국 삭제했다 : .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

이 git 명령을 호출합니다.

git fetch --all

1

누군가를 따라 반복한다면 용서 해주세요 (모든 피드백을 읽지는 않았습니다). 제 생각에 문제를 해결하는 가장 간단한 방법은 .git 및 .idea없이 프로젝트를 복사하고, 정리하고, git에서 복제하고, 위의 디렉토리를 제외한 모든 것을 삭제 한 다음, 이전 사본을 .git 및 .idea로 새로 생성 된 저장소에 붙여 넣는 것입니다. . 이해가 되길 바랍니다.


1

내 컴퓨터가 두 번 충돌했고 그 결과 내 자식 저장소가 로컬에서 손상되었습니다. 내 변경 사항을 가져올 수 없었고 원격 출처 설정을 요청했지만 gitKraken에서 작동하지 않았습니다.

내 명령 프롬프트에서이 오류가 발생했습니다. 여기에 이미지 설명 입력

내 참조가 깨져서 수정해야한다는 것을 알고있었습니다. 내가해야 할 일은 git bash (SourceTree에서 "terminal"을 클릭)하는 것입니다. 그런 다음 다음과 같은 참조 폴더로 이동하십시오.

cd .git
cd refs
cd remotes
cd origin

거기에 파일 이름 master이있을 ls것입니다. 디렉토리에 무엇이 있는지보기 위해 사용 하십시오. 그런 다음 rm master를 사용하여 삭제하십시오.

bam, 손상된 파일이 사라졌습니다. 이제 git branch 명령 -a를 실행하면 다음과 같이 출력됩니다.

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

그런 다음이 명령을 실행하면 참조가 수정됩니다.

$ git remote set-head origin master

요약하면 리모컨을 가져 오려고하면 수정 된 빈 원격 이름이 표시됩니다.

여기에 이미지 설명 입력


0

나는 같은 문제가 있었지만 운이 좋지 않아 문제를 파악할 수 없었습니다. 내 저장소를 한쪽으로 가져가 서버에서 다시 복제하고 병합을 시도했습니다. 물론 내 지점과 관련이없는 많은 파일을 표시했지만 필요한 파일을 격리하는 데 도움이됩니다.


0

MSWindows가 git을 방해하는 desktop.ini 파일을 생성했는지 확인하십시오. 그것은 나를 위해한다. .git 디렉토리의 하위 폴더에서 모두 삭제하면 작동합니다.


0

Android Studio가 갑자기 종료되었을 때 (컴퓨터의 전원 손실로 인해) 동일한 문제가 발생했습니다.

C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\master파일 의 내용을 내 파일 에 복사하여 문제를 해결했습니다 C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master.

(이전에는 Android Studio에서 'Force Push'옵션도 켰지 만 이것이 필요한 단계라고 생각하지 않습니다.)

노트 :

C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\디렉토리 (하위 디렉토리 포함)에있는 파일의 내용을 다른 정상적인 프로젝트 (예 : C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

손상된 다른 파일이있을 수 있지만 다른 정상적인 프로젝트와 비교하면 무엇이 잘못되었는지 신속하게 파악할 수 있습니다.

git이 구성되어있는 다른 건강한 프로젝트가없는 경우 조사, 비교 및 ​​수정 등을 수행 할 수 있도록 손상된 프로젝트를 만든 것과 동일한 방식으로 간단한 프로젝트를 만드는 것이 좋습니다.

추신-내 오류 메시지 (편집 됨) : warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

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