IT박스

git reset --hard HEAD ^ 후 추가 된 파일 복구

itboxs 2020. 12. 7. 07:59
반응형

git reset --hard HEAD ^ 후 추가 된 파일 복구


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

거기에 일부 방법은, 내가 그들을 다시 얻을 수 있습니다.

여기에서 관련 질문을 보았습니다. git reset --hard HEAD ~ 1을 실행 취소하려면 어떻게해야합니까? 그러나 그 질문은 그 사람이 git 커밋을 수행했다고 가정합니다.


(일부 작업을 통해) 마지막 "git add <file> " 에서 파일 상태를 복구 할 수 있습니다 . 당신이 사용할 수있는

$ git fsck --cache --no-reflogs --lost-found --unreachable  HEAD

그런 다음 '.git / lost-found / other'디렉토리의 파일을 검사하십시오.

git fsck 맨 페이지를 읽으십시오 .


(누락 된 파일이 커밋의 일부 아니라고 가정합니다 . 그렇지 않으면 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에는 타임 스탬프가 없으므로 시간순으로 정렬 된 다양한 버전의 파일을 인쇄 할 수 없습니다.

누락 된 파일이 스테이징 ( git stage또는 git add) 또는 숨김 ( git stash)되지 않은 경우 git이 아는 한 파일이 존재하지 않았기 때문에 운이 좋지 않습니다. (당신은 여전히 git가 실수로 잃어버린 파일의 복사본을 가지고있는 경우에 대비하여 보관할 가치가있는 것이 있는지 확인하기 위해 a를 수행하고 git fsck --no-reflogs --lost-found디렉토리 .git/lost-found/other둘러 볼 수 있습니다.이 경우에 도움이 될 파일 이름이 없습니다. 파일 내용.)

파일 대신에 일부 커밋을 잃어버린 경우 다음과 같이 실행하고 싶을 것입니다.

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

그것은 gitk모든 분기, 모든 리플 로그 및 모든 매달린 커밋과 함께 실행 됩니다. -n 10000리포지토리에 커밋이 정말 많은 경우 (예 : Linux 커널) 를 추가 하거나 다른 제한 을 추가 할 수 있습니다 . 이없는 경우 다음 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' )

브랜치로 저장하고 싶은 커밋이 보이면 recovered1그냥하세요 git checkout -b recovered1 <sha1-of-the-commit>.


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

잃어버린 변화 때문에 심장 마비가 생겼습니다. 그러나이 게시물을 따른 후. 변경 사항을 되찾았습니다.


이 작업을 git plugin즉시 수행하는 것이 있습니다.

https://github.com/pendashteh/git-recover-index

$ cd /path/to/disatered/repo
$ git clone git@github.com:pendashteh/git-recover-index.git $HOME/.git-recover-index
$ $HOME/.git-recover-index/git-recover-index.sh

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

이 때문에 reflog를 활성화 한 경우 추가 된 파일 F1의 인덱스 상태를 복원하고 복원 할 수 있습니다. F2를 전혀 추가하지 않았다면 Greg가 말했듯이 git은 그것에 대해 아무것도 모르고 운이 좋지 않습니다.

참고 URL : https://stackoverflow.com/questions/1108853/recovering-added-file-after-doing-git-reset-hard-head

반응형