프로젝트 커밋 기록에서 삭제 된 파일을 찾는 방법은 무엇입니까?


1274

옛날 옛적에, 내 프로젝트에는 이제 얻을 수있는 파일이있었습니다.

문제는 언제 삭제했는지와 경로를 알 수 없다는 것입니다.

이 파일이 존재하는 경우 어떻게 커밋을 찾을 수 있습니까?


비슷한 질문이 여기에 있습니다 : stackoverflow.com/questions/7093602/…
eckes


13
여기에있는 답변은 중복 된 답변보다 나에게 더 유용합니다 .
Felipe Alvarez

5
동의합니다 ... 중복 사본에 관계없이 ... Google 검색에 나타나지 않았습니다 ... 어떤 질문이 가장 좋은지 알려주세요.
Tim Boland

답변:


1599

정확한 경로를 모르는 경우 사용할 수 있습니다

git log --all --full-history -- "**/thefile.*"

파일의 경로를 알고 있으면 다음을 수행 할 수 있습니다.

git log --all --full-history -- <path-to-file>

여기에는 해당 파일을 건드린 모든 분기의 커밋 목록이 표시되어야합니다. 그런 다음 원하는 파일 버전을 찾아서 표시 할 수 있습니다.

git show <SHA> -- <path-to-file>

또는 다음을 사용하여 작업 사본으로 복원하십시오.

git checkout <SHA>^ -- <path-to-file>

커밋 기호 ( ^)는 확인 된 항목 보다 먼저 체크 아웃을 가져옵니다. <SHA>커밋하는 순간 파일이 삭제되므로 삭제 된 파일의 내용을 가져 오기 위해 이전 커밋을 살펴 봐야합니다.


2
절대 경로 대신 상대 경로를 사용해보십시오 (아직없는 경우).
Amber

63
정확한 경로를 모른다면 어떻게해야합니까? 파일 이름 만 알고 있습니까?
Prixc

17
@PedroMorteRolo git log -- <path>는 파일이 존재하지 않는 지점에있을 때 출력이 없습니다. git log --all -- <path>다른 지점에서 발생한 변경 사항을 놓치지 않도록 항상을 사용해야 합니다. git log -- <path>분기가 둘 이상 있고 경로와 분기를 잊어 버리는 경향이있는 경우 명령 이 매우 위험 할 수 있으며 다른 개발자와 함께 작업하는 경우에도 위험합니다.
호브

4
@Amber 추가, 고려 --all(덕분에 필립을 당신에) git log사람들이 다른 나뭇 가지에 금주의 변화와 파일을 그래서, 대답. 잊어 버린 사람들은 저와 같은 슬픔을 피할 것입니다.
호브

3
아래의 대답에 명시된 바와 같이, 파일 복원해야 git checkout <SHA>^ -- <path-to-file>하기 때문에 <SHA>는 파일이 우리가 이전에 볼 필요가 삭제 삭제 된 파일의 내용을 얻기 위해 커밋 커밋의 순간에,합니다 (^ 기호에주의)
kipelovets

393

삭제 된 파일 목록을 가져 와서 삭제 된 파일의 전체 경로를 복사하십시오.

git log --diff-filter=D --summary | grep delete

다음 명령을 실행하여 해당 커밋의 커밋 ID를 찾아 커밋 ID를 복사하십시오.

git log --all -- FILEPATH

삭제 된 파일의 diff 표시

git show COMMIT_ID -- FILE_PATH

>like를 사용하여 출력을 파일에 쓸 수 있음을 기억하십시오.

git show COMMIT_ID -- FILE_PATH > deleted.diff

1
첫 번째 단계의 도움으로 경로를 찾았지만 두 번째 단계에서 다음 오류가 발생 unknown revision or path not in the working tree합니다.
jvannistelrooy 2016

6
삭제와 함께 커밋 해시를 보려면 다음을 수행하십시오.git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
Chris Middleton

1
2 단계는 아무 것도 반환하지 않습니다. 왜 일어날 수 있는지에 대한 아이디어가 있습니까? 내 파일 이름이 정확합니다.
Denis Kniazhev

2
세 가지를 하나의 함수로 결합하려면 이것을 .bashrc 또는 .zshrc에 추가하십시오. git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }이제 다음 과 같이 할 수 있습니다.git-grep-latest some_text
randomor

1
@TylerJones 파이프를 사용하여 리눅스로 무엇이든 피드 할 수 있습니다-google linux pipes.. 당신은 그것을 좋아할 것입니다.
John Hunt

37

승인 된 답변을 수정할 수 없으므로 여기에 답변으로 추가하십시오.

git에서 파일을 복원하려면 다음을 사용하십시오 (SHA 바로 다음에 '^'기호 참고)

git checkout <SHA>^ -- /path/to/file

나는 왜 당신이 ^를 원했는지 이해할 수 없습니다. 파일이 해당 SHA와의 커밋에 있습니다. 왜 거기에서 다른 커밋을 다시 걸고 싶습니까?
Tony K.

19
해당 sha가 "삭제됨"으로 커밋되어 여전히 존재하지 않습니다. 실제로 커밋하려면 커밋에 가야합니다.
tandrewnichols

6
@tandrewnichols는 잘못된 커밋 SHA를 사용하고 있음을 의미합니다. 원하는 파일 버전에 대한 커밋을 원합니다 ... 아마 파일이 삭제 된 버전이 아닙니다.
Amber

6
@Amber와 원하는 커밋이 삭제되기 전에 가장 최근 커밋 일 가능성이 높 으므로이 대답입니다.
Sam Holder

1
@AlexR : 따옴표로 묶을 <SHA>~1필요없이 동일하게 작동해야합니다.
CodeManX 2016 년

37

이라는 파일을 복구하려고 MyFile하지만 해당 경로 (또는 해당 확장명)가 확실하지 않은 경우 :

예비 : git root로 스테핑하여 혼동을 피하십시오

사소한 프로젝트는 이름이 같거나 같은 여러 디렉토리를 가질 수 있습니다.

> cd <project-root>
  1. 전체 경로 찾기

    자식 로그 --diff-filter = D-요약 | grep 삭제 | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js 찾고있는 경로 및 파일입니다.

  1. 해당 파일에 영향을 미치는 모든 커밋 결정

    git log --oneline --follow-full / path / to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. 파일 확인

첫 번째로 나열된 커밋 (마지막 시간순으로 여기에서 bd8374c)을 선택하면 해당 커밋에서 파일이 삭제되었으므로 파일을 찾을 수 없습니다.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

위의 (캐럿 추가) 커밋을 선택하십시오.

> git checkout bd8374c^ -- full/path/to/MyFile.js

3
이것은 허용 대답보다 훨씬 더 명확
Pouyan Khodabakhsh

Windows 콘솔 (cmd)의 경우 2 단계에서 grep 대신 find를 사용하십시오. 3 단계 git log --diff-filter=D --summary | find "delete" | find "MyFile"에서는 해시 주위의 따옴표를 참고하십시오.git checkout "bd8374c^" -- full/path/to/MyFile.js
user5542121

30

@ 앰버가 정답을 주었다! 파일의 정확한 경로를 모르면 와일드 카드를 사용할 수 있습니다. 이것은 나를 위해 일했습니다.

git log --all -- **/thefile.*

4
@PedroMorteRolo 흠. 기존 답변을 최상위 투표 답변으로 복사하는 것에 대해 어떻게 생각하는지 모르겠습니다. 공감이 충분했을까요?
Clément

1
Cygwin에서 테스트 한 프로젝트 루트에 있으면 파일을 찾을 수 없습니다.
Wortwart

19

다음은 dev 또는 git 사용자가 저장소 루트 디렉토리에서 삭제 된 파일 이름을 전달하고 히스토리를 가져올 수있는 간단한 명령입니다.

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

누구든지 명령을 향상시킬 수 있다면하십시오.


1
정말 고마워요! 내 파일이 전혀 존재하지 않는 것 같지만, 그것은 별개이고 훨씬 더 털이 문제입니다…

파일이 '누락 된'것처럼 보이는 경우 저장소 루트 디렉토리에서이를 실행하십시오.
samaspin

감사합니다 @samaspin이 답변을 업데이트했습니다.
Jason

18

gitk히스토리를 탐색하여 반으로 기억 된 파일을 찾을 수 있도록 뷰어 중 하나를 사용해보십시오 . ( gitk --all모든 지점에 필요한 경우 사용 )


4
--all옵션은 답변과 수락 된 답변 모두에 중요합니다.
호브

3
역사를 둘러 보는 것은 대부분의 프로젝트에서 엄청난 시간이 걸립니다.
mikemaccana

5

요약:

  1. 1 단계

당신은 삭제 된 파일의 역사에서 파일의 전체 경로를 검색 git log --diff-filter=D --summary | grep filename

  1. 2 단계

삭제되기 전에 커밋에서 파일을 복원합니다.

restore () {
  filepath="$@"
  last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
  echo "Restoring file from commit before $last_commit"
  git checkout $last_commit^ -- $filepath
}

restore my/file_path

0

내 해결책은 다음과 같습니다.

git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.