폴더 Git 저장소에서 삭제 된 파일 찾기 및 복원




sourcetree 삭제 복구 (16)

Git 저장소에 있다고 가정 해 보겠습니다. 나는 파일을 지우고 그 변화를 저지른다. 나는 일을 계속하고 더 커밋을합니다. 그런 다음 해당 파일을 복원해야합니다.

git checkout HEAD^ foo.bar 사용하여 파일을 체크 아웃 할 수 있다는 것을 알고 있지만 파일이 삭제되었을 때 실제로 알지 못합니다.

  1. 주어진 파일 이름을 삭제 한 커밋을 찾는 가장 빠른 방법은 무엇입니까?
  2. 그 파일을 작업 복사본으로 다시 가져 오는 가장 쉬운 방법은 무엇입니까?

수동으로 내 로그를 찾아보고 SHA에 대한 전체 프로젝트를 체크 아웃 한 다음 수동으로 원래 프로젝트 체크 아웃에 해당 파일을 복사하지 않아도됩니다.


나는 방금 삭제 한 파일을 복원하려고이 질문에 왔지만 아직 변경을 약속하지 않았습니다. 이 상황에서 자신을 발견 한 경우를 대비하여 다음 작업 만 수행하면됩니다.

git checkout HEAD -- path/to/file.ext


파일을 변경하고 삭제했지만 커밋하지 않은 경우 변경 사항이 깨졌습니다.

git checkout -- .

하지만 삭제 된 파일이 반환되지 않으면 다음 명령을 수행하면됩니다.

git checkout <file_path>

그리고 presto, 파일이 돌아 왔어.


많은 경우, Git과 함께 coreutils (grep, sed 등)를 사용하는 것이 유용 할 수 있습니다. 나는 이미이 도구들을 아주 잘 알고 있지만 Git은 그렇게 적다. 삭제 된 파일을 검색하려면 다음을 수행하십시오.

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

수정 / 커밋을 찾을 때 :

git checkout <rev>^ -- path/to/refound/deleted_file.c

다른 사람들이 나보다 먼저 말했듯이.

이제 파일이 제거되기 전의 상태로 복원됩니다. 계속 유지하려면 작업 트리에 다시 커밋해야합니다.


파일 이름을 아는 경우 기본 명령을 사용하는 쉬운 방법입니다.

해당 파일에 대한 모든 커밋을 나열하십시오.

git log -- path/to/file

마지막 커밋 (맨 위)은 파일을 삭제 한 커밋입니다. 따라서 두 번째 커밋을 복원해야합니다.

git checkout {second to last commit} -- path/to/file

나는 같은 질문을했다. 그것을 모른 채, 나는 매달린 커밋을 만들었습니다.

매달린 커밋 목록

git fsck --lost-found

매달린 커밋을 검사합니다.

git reset --hard <commit id>

매달린 커밋으로 이동하면 파일이 다시 나타납니다.

이유에 대한 git status :

“HEAD detached from <commit id where it detached>”


삭제 및 커밋 된 파일을 복원하려면 :

git reset HEAD some/path
git checkout -- some/path

Git 버전 1.7.5.4에서 테스트되었습니다.



간단하고 정확한 -

우선, 당신이 그 파일을 가지고있는 최신의 안정된 커밋을 얻으십시오 -

git log 

$ commitid 1234567 ...을 찾으면

git checkout <$commitid> $fileName

그러면 커밋 된 파일 버전이 복원됩니다.


  1. git log --diff-filter=D --summary 를 사용하여 삭제 된 파일과 삭제 된 모든 커밋을 가져옵니다.
  2. git checkout $commit~1 filename 을 사용하여 삭제 된 파일을 복원하십시오.

여기서 $commit 은 1 단계에서 찾은 커밋의 값입니다 (예 : e4cf499627


파일을 삭제 한 커밋을 알고있는 경우이 명령을 실행하십시오. 여기서 <SHA1_deletion> 는 파일을 삭제 한 커밋입니다.

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

파이프 앞에있는 부분은 커밋에서 삭제 된 모든 파일을 나열합니다. 그들은 이전 커밋에서 모두 체크 아웃하여 복원합니다.


우리의 경우 실수로 커밋 된 파일을 지우고 나중에 커밋을하면 실수를 인식하고 수정 된 파일은 삭제하지 않고 다시 가져 오려고합니다.

Charles Bailey의 훌륭한 대답은 다음과 같습니다.

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

git undelete path/to/file.ext

  1. 이 파일을 .bash_profile (또는 명령 셸을 열 때로드되는 다른 관련 파일)에 넣으십시오.

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. 그런 다음 사용하십시오.

    git undelete path/to/file.ext
    

이 별칭은 먼저이 파일이 있던 마지막 커밋을 확인한 다음이 파일이 있던 마지막 커밋에서 해당 파일 경로에 대한 git 체크 아웃을 수행합니다. source


나는 이 해결책을 가지고있다.

  1. 아래의 방법 중 하나를 사용하여 파일이 삭제 된 커밋의 ID를 가져옵니다.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # 당신이 아무것도 기억하지 못한다면 추천
  2. 당신은 다음과 같은 것을 얻어야한다.

커밋 bfe68bd117e1091c96d2976c99b3bcc8310bebe7 작성자 : Alexander Orlov 날짜 : Thu May 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

커밋 3ea4e3af253ac6fd1691ff6bb89c964f54802302 저자 : Alexander Orlov 날짜 : Thu May 12 22:10:22 2011 +0200

3 . 이제 커밋 ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7을 사용하여 :

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

커밋 ID가 파일을 이미 삭제 한 커밋을 참조 할 때 ^1 을 추가하여 수행 할 수있는 bfe68b 바로 전에 커밋을 참조해야합니다. 이것은 다음과 같은 것을 의미합니다. bfe68b 바로 전에 커밋 해주세요.


주어진 경로에 영향을 미친 마지막 커밋을 찾습니다. 파일이 HEAD? L 트에 없기 때.에,이? 미트가 파일을 h 제해야합니다.

git rev-list -n 1 HEAD -- <file_path>

그런 다음 캐럿 ( ^ ) 기호를 사용하여 커밋 시점의 버전을 확인하십시오.

git checkout <deleting_commit>^ -- <file_path>

또는 한 명령에서 $file 이 문제의 파일이면.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

zsh을 사용 중이고 EXTENDED_GLOB 옵션이 활성화 된 경우 캐럿 기호가 작동하지 않습니다. 대신 ~1 사용할 수 있습니다.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

그래서 나는 특정 커밋에서 많은 삭제 된 파일들을 복원해야했고 다음과 같은 두 가지 명령으로 관리했다.

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

각 명령의 끝에 공백이 있음을 유의하십시오.

파일이 .gitignore 파일에 추가 된 다음 git rm으로 지워졌습니다. 파일을 복원 한 다음 파일을 복원해야했습니다. 나는 다른 파일 에서처럼 각 파일에 대해 수작업으로 타이핑하여 수백 개의 파일을 복원 할 수 있었다.


삭제 된 모든 파일을 폴더에 복원하려면 다음 명령을 입력하십시오.

git ls-files -d | xargs git checkout --




git-checkout