etc./StackOverFlow

Git 리포지토리에서 삭제된 파일을 찾고 복원하는 방법

청렴결백한 만능 재주꾼 2021. 10. 9. 02:27
반응형

질문자 :avdgaag


내가 Git 저장소에 있다고 가정해 봅시다. 파일을 삭제하고 해당 변경 사항을 커밋합니다. 나는 계속 일하고 몇 가지 더 커밋합니다. 그런 다음 해당 파일을 복원해야 합니다.

git checkout HEAD^ foo.bar 사용하여 파일을 체크아웃할 수 있다는 것을 알고 있지만 해당 파일이 언제 삭제되었는지 모르겠습니다.

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

내 로그를 수동으로 탐색하고 지정된 SHA에 대한 전체 프로젝트를 체크아웃한 다음 해당 파일을 원래 프로젝트 체크아웃에 수동으로 복사할 필요가 없기를 바랍니다.



주어진 경로에 영향을 준 마지막 커밋을 찾습니다. 파일이 HEAD 커밋에 없기 때문에 이 커밋에서 파일을 삭제했을 것입니다.

 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"

CB Bailey

  1. git log --diff-filter=D --summary 를 사용하여 파일을 삭제하고 파일을 삭제한 모든 커밋을 가져옵니다.
  2. git checkout $commit~1 path/to/file.ext 를 사용하여 삭제된 파일을 복원합니다.

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


Robert Munteanu

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

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

Manu

방금 삭제했지만 아직 변경 사항을 커밋하지 않은 파일을 복원하려고이 질문에 왔습니다. 이 상황에 처한 경우를 대비하여 다음 작업만 하면 됩니다.

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


Brett

미쳤다면 git-bisect 하세요. 수행할 작업은 다음과 같습니다.

 git bisect start git bisect bad git bisect good <some commit where you know the file existed>

이제 자동 테스트를 실행할 차례입니다. 쉘 명령 '[ -e foo.bar ]' foo.bar 가 있으면 0을 반환하고 그렇지 않으면 1을 반환합니다. git-bisect 의 "run" 명령은 바이너리 검색을 사용하여 테스트가 실패한 첫 번째 커밋을 자동으로 찾습니다. 주어진 범위(좋은 것부터 나쁜 것까지)의 중간에서 시작하여 지정된 테스트 결과에 따라 반으로 자릅니다.

 git bisect run '[ -e foo.bar ]'

이제 당신은 그것을 삭제한 커밋에 있습니다. 여기에서 미래 git-revert 를 사용하여 변경 사항을 취소할 수 있습니다.

 git bisect reset git revert <the offending commit>

또는 한 커밋으로 돌아가서 손상을 수동으로 검사할 수 있습니다.

 git checkout HEAD^ cp foo.bar /tmp git bisect reset cp /tmp/foo.bar .

Josh Lee

bonyiii 의 답변(upvoted)과 " Git alias command에 인수 전달 "에 대한 내 자신의 답변을 기반으로 하는 내가 가장 좋아하는 별칭:

 git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

몇 가지 커밋 전에 실수로 삭제한 파일을 잃어버렸습니까?
빠른:

 git restore my_deleted_file

위기를 피했습니다.

경고, Git 2.23(2019년 3분기)에는 git restore (!)라는 실험적 명령이 제공됩니다.
따라서 이 별칭의 이름을 바꿉니다(아래 참조).


Robert Dailey 는 주석 에서 다음 별칭을 제안합니다.

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

그리고 jegan은 다음 과 같이 덧붙입니다 .

명령줄에서 별칭을 설정하기 위해 다음 명령을 사용했습니다.

 git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""

VonC

파일 이름을 알고 있다면 기본 명령을 사용하는 쉬운 방법입니다.

해당 파일에 대한 모든 커밋을 나열합니다.

 git log -- path/to/file

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

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

wisbucky

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

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

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


Fedir RYKHTIK

이 솔루션이 있습니다 .

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

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # 기억나는 것이 거의 없다면 추천
  2. 당신은 다음과 같은 것을 얻어야 합니다:

commit 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

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Author: Alexander Orlov 날짜: Thu May 12 22:10:22 2011 +0200

3 . 이제 커밋 ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7을 사용하여 다음을 수행합니다.

 git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

커밋 ID는 파일이 이미 삭제된 커밋을 참조하므로 bfe68b 직전의 커밋을 참조해야 하며 ^1 을 추가하여 수행할 수 있습니다. 이것은 bfe68b 직전에 커밋을 제공한다는 의미입니다.


Alex

파일을 변경하고 삭제만 하고 커밋하지 않고 이제 변경 사항과 헤어진 경우

 git checkout -- .

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

 git checkout <file_path>

그리고 파일이 돌아왔습니다.


Paulo Linhares - Packapps

git checkout /path/to/deleted.file

user1528493

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 체크아웃합니다. 소스 .


Beau Smith

사실 이 질문은 Git에 대한 질문이지만, 나 같은 사람은 Git CLI 명령에 대해 아는 것 외에 WebStorm VCS와 같은 GUI 도구로 작업합니다.

삭제된 파일이 포함된 경로를 마우스 오른쪽 버튼으로 클릭한 다음 Git으로 이동한 다음 기록 표시 를 클릭합니다.

여기에 이미지 설명 입력

VCS 도구는 모든 개정판을 보여주고 각 개정판의 모든 커밋과 변경 사항을 볼 수 있습니다.

여기에 이미지 설명 입력

그런 다음 내 친구가 PostAd.js 파일을 삭제하는 커밋을 선택합니다. 이제 아래를 참조하십시오.

여기에 이미지 설명 입력

그리고 지금, 나는 내가 원하는 삭제 된 파일을 볼 수 있습니다. 파일 이름을 두 번 클릭하면 복구됩니다.

여기에 이미지 설명 입력

내 대답은 Git 명령이 아니지만 초보자와 전문 개발자에게 빠르고 안정적이며 쉽습니다. WebStorm VCS 도구는 Git으로 작업하기에 훌륭하고 완벽하며 다른 플러그인이나 도구가 필요하지 않습니다.


AmerllicA

많은 경우 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

다른 사람들이 나보다 먼저 말한 것처럼.

이제 파일이 제거되기 전의 상태로 복원됩니다. 유지하려면 작업 트리에 다시 커밋하는 것을 잊지 마십시오.


Thomas E

특정 커밋에서 삭제된 파일을 복원해야 했으며 두 가지 명령으로 관리했습니다.

 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 지워졌습니다. 파일을 복원해야 했지만 스테이지를 해제해야 했습니다. 복원할 파일이 수백 개 있었고 다른 예에서와 같이 각 파일에 대해 수동으로 입력하는 것은 너무 느릴 것입니다.


kzar

나는 같은 질문을했다. 나도 모르게 dangling commit 을 만들었습니다.

매달린 커밋 나열

git fsck --lost-found

각 댕글링 커밋 검사

git reset --hard <commit id>

매달린 커밋으로 이동할 때 내 파일이 다시 나타납니다.

이유에 대한 git status

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


rustyMagnet

파일을 삭제한 커밋을 찾습니다.

 git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

샘플 출력:

 4711174

Git 2.23부터 실제로 restore 명령이 있습니다. 아직 실험적 이지만 커밋에서 제거한 항목(이 경우 4711174)을 복원하려면 다음을 입력할 수 있습니다.

 git restore --source=4711174^ path/to/file

파일을 삭제한 커밋 이전 의 커밋에서 무언가를 복원하기를 원하므로 커밋 ID 뒤에 ^를 주목하세요.

--source 인수는 restore 할 파일을 찾을 위치를 복원 명령에 지시하며 이는 모든 커밋 및 인덱스가 될 수 있습니다.

참조: git 2.23.0용 git-restore 문서


cb2

user@bsd:~/work/git$ rm slides.tex user@bsd:~/work/git$ git pull Already up-to-date. user@bsd:~/work/git$ ls slides.tex ls: slides.tex: No such file or directory

삭제된 파일 복원:

 user@bsd:~/work/git$ git checkout D .slides.tex.swp D slides.tex user@bsd:~/work/git$ git checkout slides.tex user@bsd:~/work/git$ ls slides.tex slides.tex

J. Ceron

파일을 삭제한 커밋을 알고 있는 경우 다음 명령을 실행합니다. 여기서 <SHA1_deletion> 은 파일을 삭제한 커밋입니다.

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

파이프 앞 부분은 커밋에서 삭제된 모든 파일을 나열합니다. 그것들은 모두 복원하기 위해 이전 커밋에서 체크아웃되었습니다.


Tony Wickham

우리의 경우 실수로 커밋에서 파일을 삭제했고 일부 커밋은 나중에 실수를 깨닫고 수정된 파일이 아닌 삭제된 모든 파일을 되돌리기를 원했습니다.

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)

bonyiii

간단하고 정확한-

우선, 다음과 같이 해당 파일이 있는 최신 안정적인 커밋을 가져옵니다.

 git log

$commitid 1234567...을 찾으면

 git checkout <$commitid> $fileName

그러면 해당 커밋에 있던 파일 버전이 복원됩니다.


Sudhanshu Jain

가장 좋은 방법은 시도해 보십시오.


먼저 파일을 삭제한 커밋의 커밋 ID를 찾습니다. 파일을 삭제한 커밋 요약을 제공합니다.

git log --diff-filter=D --summary

자식 체크아웃 84sdhfddbdddf~1

참고: 84sdhfddbdddcommit id

이를 통해 삭제된 모든 파일을 쉽게 복구할 수 있습니다.


Ritesh Adulkar

파일을 삭제한 커밋을 항상 git revert ( 이것은 삭제가 커밋의 유일한 변경 사항이라고 가정합니다. )

 > git log commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3 Author: Dave <dave@domain.com> Date: Thu May 9 11:11:06 2019 -0700 deleted readme.md

작업을 계속하고 나중에 삭제 커밋을 커밋하고 싶지 않다는 것을 깨달았다면 다음을 사용하여 되돌릴 수 있습니다.

 > git revert 2994bd

이제 git log 표시됩니다.

 > git log Author: Dave <dave@domain.com> Date: Thu May 9 11:17:41 2019 -0700 Revert "deleted readme" This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

그리고 readme.md 가 저장소로 복원되었습니다.


Dave Baghdanov

삭제가 커밋되지 않은 경우 아래 명령은 작업 트리에서 삭제된 파일을 복원합니다.

 $ git checkout -- <file>

아래 명령을 사용하여 작업 트리에서 삭제된 모든 파일의 목록을 얻을 수 있습니다.

 $ git ls-files --deleted

삭제가 커밋된 경우 발생한 커밋을 찾은 다음 이 커밋에서 파일을 복구합니다.

 $ git rev-list -n 1 HEAD -- <file> $ git checkout <commit>^ -- <file>

복구할 파일의 경로를 찾는 경우 다음 명령은 삭제된 모든 파일의 요약을 표시합니다.

 $ git log --diff-filter=D --summary

Muhammad Soliman

또한 아래 코드를 사용하여 이전 파일을 로컬 디렉토리로 검색하는 데 이 문제가 있습니다.

 git checkout <file path with name>

아래 예는 저에게 효과적입니다.

git checkout resources/views/usaSchools.blade.php


Akbor

플러스 포인트: 아래 방법은 휴지통이나 휴지통에서도 파일/폴더가 삭제된 시나리오에 적합합니다.

파일/폴더가 작업 트리에서 삭제되었지만 아직 커밋되지 않았습니다.

I. 변경 사항을 아직 인덱싱하지 않은 경우(git add) 디렉토리의 내용을 되돌릴 수 있습니다.

git restore -- path/to/folder_OR_file

Ⅱ. 삭제가 이미 인덱싱된 경우 먼저 재설정해야 합니다.

git reset -- path/to/folder_OR_file

그런 다음 git restore path/to/folder_OR_file

파일/폴더는 과거의 일부 커밋에서 삭제됩니다.

  1. git log --diff-filter=D --summary 를 사용하여 파일/폴더가 삭제된 커밋에 대한 세부 정보를 얻으십시오.
  2. git checkout $commit~1 path/to/folder_OR_file 을 사용하여 삭제된 파일/폴더를 복원합니다. 여기서 $commit 은 1단계에서 찾은 커밋의 sha-값입니다(예: c7578994).

Rishabh

삭제된 파일을 체크아웃할 수 있습니다.

 git checkout

산출

 D index.html

복원하려면:

 git restore index.html

여러 파일을 삭제하고 모든 사용을 복원해야 하는 경우:

 git restore .

GIF 이미지 참조 git으로 파일 복원


Eng_Farghly

$ git log --diff-filter=D --summary  | grep "delete" | sort

kujiy

Git으로 삭제된 모든 파일을 복원하려면 다음을 수행할 수도 있습니다.

 git checkout $(git ls-files --deleted)

여기서 git ls-files --deleted 는 삭제된 모든 git checkout $(git command) 은 매개변수의 파일 목록을 복원합니다.


Charles Duporge

출처 : http:www.stackoverflow.com/questions/953481/how-to-find-and-restore-a-deleted-file-in-a-git-repository

반응형