옛날 옛적에, 내 프로젝트에는 이제 얻을 수있는 파일이있었습니다.
문제는 언제 삭제했는지와 경로를 알 수 없다는 것입니다.
이 파일이 존재하는 경우 어떻게 커밋을 찾을 수 있습니까?
옛날 옛적에, 내 프로젝트에는 이제 얻을 수있는 파일이있었습니다.
문제는 언제 삭제했는지와 경로를 알 수 없다는 것입니다.
이 파일이 존재하는 경우 어떻게 커밋을 찾을 수 있습니까?
답변:
정확한 경로를 모르는 경우 사용할 수 있습니다
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>
커밋하는 순간 파일이 삭제되므로 삭제 된 파일의 내용을 가져 오기 위해 이전 커밋을 살펴 봐야합니다.
git log -- <path>
는 파일이 존재하지 않는 지점에있을 때 출력이 없습니다. git log --all -- <path>
다른 지점에서 발생한 변경 사항을 놓치지 않도록 항상을 사용해야 합니다. git log -- <path>
분기가 둘 이상 있고 경로와 분기를 잊어 버리는 경향이있는 경우 명령 이 매우 위험 할 수 있으며 다른 개발자와 함께 작업하는 경우에도 위험합니다.
git checkout <SHA>^ -- <path-to-file>
하기 때문에 <SHA>는 파일이 우리가 이전에 볼 필요가 삭제 삭제 된 파일의 내용을 얻기 위해 커밋 커밋의 순간에,합니다 (^ 기호에주의)
삭제 된 파일 목록을 가져 와서 삭제 된 파일의 전체 경로를 복사하십시오.
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
unknown revision or path not in the working tree
합니다.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
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
linux pipes
.. 당신은 그것을 좋아할 것입니다.
승인 된 답변을 수정할 수 없으므로 여기에 답변으로 추가하십시오.
git에서 파일을 복원하려면 다음을 사용하십시오 (SHA 바로 다음에 '^'기호 참고)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
필요없이 동일하게 작동해야합니다.
이라는 파일을 복구하려고 MyFile
하지만 해당 경로 (또는 해당 확장명)가 확실하지 않은 경우 :
예비 : git root로 스테핑하여 혼동을 피하십시오
사소한 프로젝트는 이름이 같거나 같은 여러 디렉토리를 가질 수 있습니다.
> cd <project-root>
전체 경로 찾기
자식 로그 --diff-filter = D-요약 | grep 삭제 | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
찾고있는 경로 및 파일입니다.
해당 파일에 영향을 미치는 모든 커밋 결정
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.
파일 확인
첫 번째로 나열된 커밋 (마지막 시간순으로 여기에서 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
git log --diff-filter=D --summary | find "delete" | find "MyFile"
에서는 해시 주위의 따옴표를 참고하십시오.git checkout "bd8374c^" -- full/path/to/MyFile.js
gitk
히스토리를 탐색하여 반으로 기억 된 파일을 찾을 수 있도록 뷰어 중 하나를 사용해보십시오 . ( gitk --all
모든 지점에 필요한 경우 사용 )
--all
옵션은 답변과 수락 된 답변 모두에 중요합니다.
요약:
당신은 삭제 된 파일의 역사에서 파일의 전체 경로를 검색 git log --diff-filter=D --summary | grep filename
삭제되기 전에 커밋에서 파일을 복원합니다.
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
내 해결책은 다음과 같습니다.
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>