git 특정 자식 재설정 후 추가 된 파일 복구-헤더 HEAD ^




git 특정 파일 초기화 (4)

사용해보십시오. http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

내가 잃어버린 변화에 심장 마비가있다. 하지만이 게시물을 따르십시오. 내 변경 사항을 다시 가져 왔습니다.

새 파일 F1을 추가하고 다른 파일 F2를 변경했지만 "git reset -hard HEAD ^"를 수행하여 파일에 대한 모든 변경 사항을 잃었습니다.

어떤 방법이 있니 , 나는 그들을 돌려받을 수있다.

나는 여기에 관련된 질문을 보았다. 어떻게 자식 재설정을 취소 할 수 있는가? 그러나 그 질문은 git commit을했다고 가정합니다.


(필자는 누락 된 파일이 커밋의 일부가 아니라고 가정합니다. 그렇지 않으면, git log --all -g --diff-filter=D --stat 은 여러분의 친구입니다.)

  1. git 이 파일 이름을 알고있는 도달 할 수없는 파일의 목록을 얻습니다.

    git fsck --unreachable --no-reflogs --no-cache HEAD | fgrep " tree " \
    | cut -d " " -f3 | xargs -r -n1 git ls-tree \
    | fgrep " blob " | cut -d " " -f 3- | sort -k2 -u
    
  2. 흥미로운 것을 보면 git cat-file blob SHA-1-of-interesting-file 이 파일을 표준 출력으로 출력합니다. (예 : git cat-file blob b8f0bdf56 > recovered-logo.png )

불행히도, 누락 된 파일이 커밋의 일부가 아니라면, 자식은 타임 스탬프를 가지지 않으므로 시간순으로 정렬 된 다양한 버전의 파일을 인쇄 할 수 없습니다.

누락 된 파일 ( git stage 또는 git add ) 또는 git stash ( git stash )를 사용한 적이 없다면 git이 아는 한 파일이 존재하지 않기 때문에 운이 좋지 않을 것입니다. (여전히 git fsck --no-reflogs --lost-found 보고 디렉토리 .git/lost-found/other 를 살펴보면 .git/lost-found/other 사본을 갖고 있기 때문에 가치가있는 것이 있는지 확인할 수 있습니다 행운의 사고로 파일을 열 수 있습니다.이 경우 파일 이름만으로는 파일 내용이 없습니다.

단지 파일 대신 커밋을 잃어버린 경우에는 다음과 같이 실행하는 것이 좋습니다.

gitk --all $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )

그것은 모든 지점, 모든 reflog 및 모든 매달려있는 커밋으로 gitk 를 실행합니다. repo에 실제로 많은 커밋이있는 경우 (Linux 커널), -n 10000 이나 다른 제한을 추가 할 수 있습니다. gitk 가 없다면 다음과 같이 명령 줄만을 사용하여보다 적은 버전을 실행할 수 있습니다 :

git log --all --decorate --stat --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )

보다 자세한 출력이없는 버전

git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )

실제로, git add를 사용하여 인덱스에 객체를 추가했다면 객체의 해당 상태에 대해 생성 된 blob가 있지만이를 참조하는 트리 (따라서 커밋) 객체가 없습니다. 이것은 '매달려있는'느슨한 객체 파일을 얻는 방법이며, git fsck를 실행하면 참조되지 않은 blob (git gc가 실행되면 이러한 유형의 객체가 삭제됨)이 표시됩니다.

이 때문에, 활성화 된 경우 reflog를 사용하여 추가 된 파일 F1의 색인 상태를 복원 할 수 있습니다. F2를 전혀 추가하지 않았다면 Greg가 말했듯이, git은 그것에 대해 아무 것도 모르고 거기에서 운이 없어진 것입니다.






version-control