옛날 옛적에 내 프로젝트에 지금 얻고 싶은 파일이 있었습니다.
문제는 내가 언제 삭제했는지, 어떤 경로에 있었는지 알 수 없다는 것입니다.
이 파일이 존재했을 때 커밋을 어떻게 찾을 수 있습니까?
질문자 :Pedro Rolo
옛날 옛적에 내 프로젝트에 지금 얻고 싶은 파일이 있었습니다.
문제는 내가 언제 삭제했는지, 어떤 경로에 있었는지 알 수 없다는 것입니다.
이 파일이 존재했을 때 커밋을 어떻게 찾을 수 있습니까?
정확한 경로를 모르는 경우 사용할 수 있습니다.
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 --diff-filter=D --summary | grep delete
다음 명령을 실행하여 해당 커밋의 커밋 ID를 찾고 커밋 ID를 복사합니다.
git log --all -- FILEPATH
삭제된 파일의 차이점 표시
git show COMMIT_ID -- FILE_PATH
>
like를 사용하여 파일에 출력을 쓸 수 있음을 기억하십시오.
git show COMMIT_ID -- FILE_PATH > deleted.diff
MyFile
파일을 복구하려고 하지만 경로(또는 확장자)가 확실하지 않다고 가정합니다.
예비: git 루트로 이동하여 혼동을 피하십시오.
중요하지 않은 프로젝트에는 파일 이름이 비슷하거나 동일한 여러 디렉토리가 있을 수 있습니다.
> cd <project-root>
전체 경로 찾기
git log --diff-filter=D --summary | 그렙 삭제 | grep 내 파일
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
는 찾고 있는 경로 및 파일입니다.
해당 파일에 영향을 준 모든 커밋 확인
git log --oneline --follow -- 전체/경로/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에서 파일을 복원하려면 다음을 사용하십시오(SHA 바로 뒤에 있는 '^' 기호에 주의).
git checkout <SHA>^ -- /path/to/file
@Amber님이 정답을 맞췄습니다! 한 가지만 더 추가하면 파일의 정확한 경로를 모르는 경우 와일드카드를 사용할 수 있습니다! 이것은 나를 위해 일했습니다.
git log --all -- **/thefile.*
다음은 dev 또는 git 사용자가 저장소 루트 디렉터리에서 삭제된 파일 이름을 전달하고 기록을 가져올 수 있는 간단한 명령입니다.
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
명령을 개선할 수 있는 사람이 있으면 수행하십시오.
gitk
와 같은 뷰어 중 하나를 사용하여 기록을 탐색하여 절반만 기억된 파일을 찾을 수 있습니다. (모든 분기에 필요한 경우 gitk --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>
size
를 보고 싶다면 뿐만 아니라 관련 SHA
git log --all --stat --diff-filter=D --oneline
내용을 보려면 -p를 추가하십시오.
git log --all --stat --diff-filter=D -p
파일로 범위를 좁히려면 grep으로 파이프하고 파일 이름을 검색하십시오.
git log --all --stat --diff-filter=D --oneline | grep someFileName
파일이 어디에 있는지 안다면 이 파일을 좋아할 수도 있습니다.
git log --all --full-history -- someFileName
출처 : http:www.stackoverflow.com/questions/7203515/how-to-find-a-deleted-file-in-the-project-commit-history
정수의 제곱근이 정수인지 확인하는 가장 빠른 방법 (0) | 2022.02.17 |
---|---|
C#에서 사전이 Hashtable보다 선호되는 이유는 무엇입니까? (0) | 2022.02.17 |
현대 Python에서 사용자 정의 예외를 선언하는 적절한 방법은 무엇입니까? (0) | 2022.02.17 |
Python에서 stderr로 인쇄하는 방법은 무엇입니까? (0) | 2022.02.17 |
다른 지점에서 하나의 파일만 가져오는 방법은 무엇입니까? (0) | 2022.02.17 |