특정 파일을 변경 한 커밋을 모두 나열하려면 어떻게해야합니까?


800

특정 파일을 변경 한 모든 커밋을 나열하는 방법이 있습니까?


1
단일 브랜치에서 파일에 대한 변경 사항을 찾고 있습니까? 모든 지방 지점에서; 단일 리모콘의 모든 분기에 걸쳐; 아니면 모든 것을 가로 질러? 나는 그것을 통해 스크립트가 필요하다고 생각합니다.
benhorgen

답변:


1081

--follow특정 파일에 대한 작업

git log --follow -- filename

주어진 다른 솔루션과의 차이점

다른 솔루션에는 git log path(없이 --follow)가 포함됩니다. 이 접근 방식은 디렉토리의 변경 사항 (예 : 디렉토리의 변경 사항)을 추적하려는 경우에 편리 하지만 파일 이름이 바뀌면 사용됩니다 (따라서 사용 --follow filename).


32
+1 --follow은 이름 변경을 설명하므로 이보다 더 강력합니다.git log -- path
Gabe Moothart

42
파일뿐만 아니라 디렉토리 일 수 --follow있는 path 를 허용합니다 . 후자의 경우 재귀 적으로 실행되고 해당 지점 아래의 모든 파일에 변경 사항을보고합니다. (이 동작은 맨 페이지에 문서화되어 있지 않으며 영구적이지 않을 수 있습니다.)
StvnW

5
저것과 단지의 차이점git log filename?
VaTo

8
@SaulOrtega git log filename는 파일 이름 변경을 따르지 않습니다. 즉, 실제 파일이 아닌 해당 파일 이름 과 관련된 모든 커밋을 표시합니다 . 파일을 작성 X하고 Y둘 다 변경 한 다음 삭제 Y하고 이름 X을 바꾼 Y다음 변경 한 경우 실행 git log Y하면 이전 파일 Y새 파일 모두에 대한 메시지가 표시됩니다 . 반대의 --follow경우에는 파일 이름 X 이름이 지정된 파일에 관한 커밋을 얻 습니다 Y.
MarSoft

7
모든 분기의 모든 커밋을 보려면 "git log --all filename"을 사용하십시오
Lebnik

122

git log path당신이 원하는 것을해야합니다. 로부터 git log사람 :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
파일 경로가 변경된 경우 작동하지 않습니다. 이 경우 jackrabbit의 답변이 효과가 있습니다.
kwahn

1
로그를 특정 브랜치로 제한해야하는 경우 작동합니다.
ams

63

나는 이것을 자세히 살펴 보았고이 모든 대답이 실제로 모든 지부의 모든 커밋을 보여주지는 않는 것 같습니다.

다음은 gitk 편집 뷰 옵션을 망쳐 놓은 결과입니다. 이것은 분기, 로컬, 참조 로그 및 원격에 관계없이 파일에 대한 모든 커밋을 보여줍니다 .

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

그것은 또한 작동합니다 git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
이것은 누군가가 변경을 할 때 완벽하지만 변경을 어디서 커밋했는지 잊어 버립니다.
earthmeLon

2
매우 유용한. 또한 커밋을 숨기고 포함합니다
후안 안토니오 Tubío

이것이 선호되는 답변이어야합니다. 문제는 모든 커밋을 찾는 것이 었습니다.
carl verbiest

재 확보 --reflog/ 수정되거나 폐기 된 커밋이 포함 된 통지 . 어쩌면 그것은 분명해야하지만, 이것을 사용 git log하려고 시도하고 왜 중복 된 커밋이 보이는지 알아 내려고했습니다!
Soren Bjornstad

43

특정 파일에 대한 커밋을 얻으려면 아래 명령을 사용하십시오.

git log -p filename

8
커밋 목록을 원했기 때문에 이것이 정확하게 질문에 대답하지는 않지만 이것이 금색이며 내 파일에 들어가는 것입니다.
zkent

3
파일이 현재 체크 아웃 된 분기에 존재하지 않으면 전혀 작동하지 않습니다. 분기를 추가 git log -p mybranch -- filename하거나 git log --all -- filename모든 분기를 보는 데 사용할 수 있습니다 .
Soren Bjornstad

37

다음과 같이 간단해야합니다 git log <somepath>. 맨 페이지 ( git-log(1))를 확인하십시오 .

개인적으로 저는 git log --stat <path>각 커밋이 파일에 미치는 영향을 볼 수 있도록 사용 하고 싶습니다.


9
또는 -p몇 줄을 수정 한 것이 아니라 전체 diff를 보려는 경우 에도 마찬가지 입니다.
Cascabel

사실, 대부분의 파일이 평생 동안 여러 번 변경되었다는 점을 고려할 때 시끄 럽습니다. 파일을 건 드리는 모든 단일 커밋의 전체 차이점을보고 싶지 않습니다. 나는 일반적으로 특정 것을 찾고 있기 때문에 단지 영향을 미치는 로그를 얻을 수 있으며 git show문제가있는 특정 커밋에 대해 로그를 얻을 수 있습니다 .
rfunduk

git log --stat --follow-* .html => 커밋마다 정확히 하나의 파일이있는 커밋 출력 목록. 아주 좋아요!
Sergio Belevskij '

18

또는 (Git 1.8.4부터) 파일 의 특정 부분 을 변경 한 모든 커밋을 얻는 것도 가능 합니다. 시작 줄과 끝 줄 번호를 전달하면 얻을 수 있습니다.

반환 된 결과는이 특정 부분을 수정 한 커밋 목록입니다. 명령은 다음과 같습니다.

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

어디 upperLimit이다 start_line_numberlowerLimit는 ISending_line_number

추가 정보-https: //www.techpurohit.com/list-some-useful-git-commands


17

jackrabb1t가 지적했듯이 --follow이름 바꾸기 / 이동 이외의 기록을 계속 나열하기 때문에 더 강력합니다. 따라서 현재 동일한 경로에 있지 않은 파일이나 다양한 커밋에서 이름이 바뀐 파일을 찾으려면 --follow가 추적합니다.

이름 / 경로 변경을 시각화하려는 경우이 방법이 더 좋습니다.

git log --follow --name-status -- <path>

그러나 중요한 것만으로 더 간단한 목록을 원한다면 :

git log --follow --name-status --format='%H' -- <path>

또는

git log --follow --name-only --format='%H' -- <path>

단점은 --follow단일 파일에 대해서만 작동 한다는 것입니다.


4
--follow디렉토리 일 수 있는 단일 경로 에서 작동합니다 . 디렉토리를 전달하면 재귀 적으로 실행되고 해당 지점 아래의 모든 파일에 변경 사항을보고합니다.
StvnW

10

이전 커밋 사용에서 삭제파일따르 려고 하면

git log --follow -- filename

3
들어 git초보자 : 사용 git log -p --follow -- filename변경 사항을 표시 할뿐만 아니라합니다. 또한 "filename"은 파일, 디렉토리 또는 하위 모듈 일 수 있습니다.
티노

8

파일을 변경 한 모든 커밋을 모든 분기에서 보려면 다음을 사용하십시오.

git log --follow --all <filepath>

8

by filename아닌 by로 모든 커밋을 찾으려면 다음을 filepath사용하십시오.

git log --all -- '*.wmv'

6

파일 자체의 변경 사항이 아닌 특정 파일을 변경 한 커밋의 모든 변경 사항을 보려면 다음을 전달하십시오 --full-diff.

git log -p --full-diff [branch] -- <path>

또는[branch]
Anentropic

1
@Anentropic 대괄호는 인수가 선택 사항임을 나타냅니다.
큐빅

필요한 모든 것입니다. 전체 변경 사항을 표시하고 병합의 일부 변경 사항을 포함합니다.
ThanhLD

5

모든 브랜치에 git log --all <filename>영향을 미치는 커밋을 보는 데 사용 합니다 <filename>.


4
gitk <path_to_filename>

"gitk"패키지가 이미 설치되어 있다고 가정합니다.

설치되어 있지 않으면 다음을 수행하십시오.

sudo apt-get install gitk

그런 다음 위 명령을 시도하십시오. Linux 용입니다. GUI를 원하는 경우 Linux 사용자에게 도움이 될 수 있습니다.


Windows 사용자의 경우 Windows gitk용 Git과 함께 제공됩니다.
Soren Bjornstad

2

커밋 해시 목록을 얻으려면 git rev-list

 git rev-list HEAD <filename>

산출:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

이는 5 개의 커밋이이 파일을 터치했음을 의미합니다. 역순으로 정렬되므로 목록의 첫 번째 커밋 b7c4f0d7이 가장 최근의 커밋입니다 .


1

Linux에서는 gitk를 사용할 수 있습니다.

"sudo apt-get install git-gui gitk"를 사용하여 설치할 수 있습니다. "gitk <Filename>"으로 특정 파일의 커밋을 보는 데 사용할 수 있습니다.


1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

참고

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.