etc./StackOverFlow

Git에서 파일이 삭제된 시점 찾기

청렴결백한 만능 재주꾼 2023. 4. 28. 04:05
반응형

질문자 :JohnMetta


n 커밋이 있는 Git 저장소가 있습니다.

필요한 파일이 있는데 저장소에 있었는데 갑자기 "오! 그 파일이 어디로 갔지?"라고 생각합니다.

"파일 real_needed.txt가 커밋 n-13에서 삭제되었습니다"라고 알려주는 일련의 Git 명령이 있습니까?

다시 말해, 모든 개별 커밋을 보지 않고 내 Git 리포지토리에 모든 파일의 모든 변경 사항이 있다는 것을 알면서도 해당 파일이 있는 마지막 커밋을 빨리 찾아서 다시 가져올 수 있습니까?



git log --full-history -- [file path] 는 파일의 변경 사항을 보여주며 파일이 삭제된 경우에도 작동합니다.

예시:

 git log --full-history -- myfile

파일을 삭제한 마지막 커밋만 보고 싶다면 위의 명령어와 함께 -1 예시:

 git log --full-history -1 -- [file path]

내 기사를 참조하십시오. 어떤 커밋이 파일을 삭제했는지 .


vogella

짧은 답변:

 git log --full-history -- your_file

병합 커밋을 포함하여 your_file 을 건드린 리포지토리 기록의 모든 커밋을 표시합니다. 마지막(상단) 파일은 파일을 삭제한 파일입니다.

일부 설명:

--full-history 플래그가 중요합니다. 이것이 없으면 Git은 파일의 로그를 요청할 때 "히스토리 단순화"를 수행합니다. 문서는 이것이 정확히 어떻게 작동하는지에 대한 세부 사항에 대해 설명하고 있으며 소스 코드에서 알아내려고 시도하는 데 필요한 투지와 용기가 부족하지만 git-log 문서 에는 다음과 같은 내용이 많이 있습니다.

기본 모드

트리의 최종 상태를 설명하는 가장 간단한 기록으로 기록을 단순화합니다. 최종 결과가 같으면 일부 측면 가지를 잘라내기 때문에 가장 간단합니다(즉, 동일한 내용의 분기 병합)

삭제 된 파일의 최종 상태를 설명하는 간단한 역사부터 그 역사를 우리가 삭제하려는 파일이 어떤 역사 없을 때 이것은 분명히 직결된다. --full-history 없이 git log 가 단순히 파일이 생성되지 않았다고 주장할 위험이 있습니까? 불행히도, 그렇습니다. 다음은 데모입니다.

 mark@lunchbox:~/example$ git init Initialised empty Git repository in /home/mark/example/.git/ mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo" [master (root-commit) ddff7a7] Added foo 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 foo mark@lunchbox:~/example$ git checkout -b newbranch Switched to a new branch 'newbranch' mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar" [newbranch 7f9299a] Added bar 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bar mark@lunchbox:~/example$ git checkout master Switched to branch 'master' mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo" rm 'foo' [master 7740344] Deleted foo 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 foo mark@lunchbox:~/example$ git checkout newbranch Switched to branch 'newbranch' mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar" rm 'bar' [newbranch 873ed35] Deleted bar 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bar mark@lunchbox:~/example$ git checkout master Switched to branch 'master' mark@lunchbox:~/example$ git merge newbranch Already up-to-date! Merge made by the 'recursive' strategy. mark@lunchbox:~/example$ git log -- foo commit 77403443a13a93073289f95a782307b1ebc21162 Author: Mark Amery Date: Tue Jan 12 22:50:50 2016 +0000 Deleted foo commit ddff7a78068aefb7a4d19c82e718099cf57be694 Author: Mark Amery Date: Tue Jan 12 22:50:19 2016 +0000 Added foo mark@lunchbox:~/example$ git log -- bar mark@lunchbox:~/example$ git log --full-history -- foo commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c Merge: 7740344 873ed35 Author: Mark Amery Date: Tue Jan 12 22:51:36 2016 +0000 Merge branch 'newbranch' commit 77403443a13a93073289f95a782307b1ebc21162 Author: Mark Amery Date: Tue Jan 12 22:50:50 2016 +0000 Deleted foo commit ddff7a78068aefb7a4d19c82e718099cf57be694 Author: Mark Amery Date: Tue Jan 12 22:50:19 2016 +0000 Added foo mark@lunchbox:~/example$ git log --full-history -- bar commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c Author: Mark Amery Date: Tue Jan 12 22:51:29 2016 +0000 Deleted bar commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec Author: Mark Amery Date: Tue Jan 12 22:50:38 2016 +0000 Added bar

위의 터미널 덤프에 있는 git log -- bar 가 어떻게 말 그대로 출력이 되지 않는지 주목하십시오. bar 존재하지 않는 허구로 역사를 "단순화"하고 있습니다. 반면에 git log --full-history -- bar bar 를 생성한 커밋과 삭제한 커밋을 제공합니다.

분명히 하자면, 이 문제는 단순히 이론적인 것이 아닙니다. 삭제된 파일을 추적하려는 실제 저장소에서 git log -- some_file 이 실패했기 때문에 문서만 살펴보고 --full-history 기록 단순화는 현재 존재하는 파일이 어떻게 현재 상태가 되었는지 이해하려고 할 때 때때로 도움이 될 수 있지만, 파일 삭제 를 추적하려고 할 때 관심 있는 커밋을 숨겨서 당신을 망칠 가능성이 더 큽니다. . 이 사용 사례에는 항상 --full-history 플래그를 사용하십시오.


Mark Amery

힘내 로그인하지만 당신과 함께 경로를 앞에 필요 --

예:

 dan-mac:test dani$ git log file1.txt fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree. dan-mac:test dani$ git log -- file1.txt commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976 Author: Daniel Palacio <danpal@gmail.com> Date: Tue Jul 26 23:32:20 2011 -0500 foo

daniel

다음과 같이 파일을 삭제한 마지막 커밋을 찾을 수 있습니다.

 git rev-list -n 1 HEAD -- [file_path]

추가 정보는 여기에서 확인할 수 있습니다.


Akif

regexp를 사용하여 삭제된 파일의 커밋을 찾기 위한 솔루션을 여기에 추가했습니다 (git에 저장소의 모든 삭제된 파일을 나열하는 방법이 있습니까?).

 git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'

some_dir (계단식)이라는 디렉토리 내에서 삭제된 모든 것을 반환합니다. \/some_dir\/ 이 있는 모든 sed regexp가 수행됩니다.

OSX (@triplee 및 @keif 덕분에)

 git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }

estani

노력하다:

 git log --stat | grep file

Eric Woodruff

출처 : http:www.stackoverflow.com/questions/6839398/find-when-a-file-was-deleted-in-git

반응형