커밋의 모든 파일을 나열하는 방법은 무엇입니까?


2791

관련 git없는 정보없이 해시 (SHA1)가 제공 한 커밋의 일부였던 모든 파일의 형식이 좋은 목록을 제공 하는 간단한 명령을 찾고 있습니다.

나는 시도했다 :

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

파일을 나열하지만 각각에 대한 원치 않는 diff 정보도 포함합니다.

git원하는 목록 만 제공하여 git show출력 에서 구문 분석을 피할 수 있는 다른 명령이 있습니까?


43
나는 조금 다른 것을 찾기 위해 여기에 왔습니다. 커밋 세트에 대해 수정 된 모든 파일을보고 git log --until 2013-05-21 --pretty="short" --name-only좋은 효과로 사용하고 싶습니다 .
제한적 속죄

4
이 명령을 사용하여 다음 n커밋까지 모든 변경 사항을 가져옵니다 master.git diff-tree --name-status -r @{3} master
ako

3
git diff --name-only master-마스터 브랜치와 비교하여 현재 브랜치에서 변경된 모든 파일을 나열합니다.
Noam Manos 2016 년

답변:


3758

선호하는 방법 ( 배관 명령 이기 때문에 프로그래밍 방식이어야 함) :

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

다른 방법 ( 도자기 명령 이므로 사용자가 직접 사용해야 하기 때문에 스크립트에 적합하지 않음)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • --no-commit-id를 억제는 ID 출력 커밋.
  • --pretty인수는 처음에 cruft에를 피하기 위해 빈 형식 문자열을 지정합니다.
  • --name-only인수는 영향을받은 파일 이름 만 표시합니다 (감사합니다). 사용하여 --name-status각 파일에 무슨 일이 있었는지보고 싶다면, 대신 ( D는 , eleted M은 odified, A는 dded)
  • -r인수는 하위 트리 재귀 적이다

25
그것은 주목해야한다 diff-tree루트 커밋을보고하지 작업 때.
jbranchaud

327
일 교체 --name-only와 옵션은 --name-status더 명확 요약을 제공 할 것입니다.
Kurt Zhong

20
루트 커밋에서 작동하려면 --root 플래그를 사용하십시오. 매뉴얼 페이지에서 : "-root가 지정되면 초기 커밋은 큰 생성 이벤트로 표시됩니다. 이는 NULL 트리에 대한 diff와 같습니다."
Chris

24
git log --name-only -n 1 <hash>마지막 커밋은 :git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
누군가가 (나처럼) 왜 첫 번째 방법이 "선호"인지 궁금하다면 @drizzt의 의견으로 되돌아갑니다. git show"자기"(사용자가 직면해야 함)이고 git diff-tree"배관"(예 : 스크립트에서 프로그래밍 방식으로 사용됨)입니다. (망할 놈의 메인테이너 드롭 수 있도록 시간이 지남에 따라 이전의 인터페이스는 변경 될 수 있습니다 --name-only나는 그들이 상상하지 않지만 유용성 이유로) 후자의 인터페이스 호환성을 위해 최대한 안정적으로 유지하는 반면,.
killscreen

237

변경된 파일 목록을 얻으려면 다음을 수행하십시오.

git diff-tree --no-commit-id --name-only -r <commit-ish>

커밋의 모든 파일 목록을 얻으려면 다음을 사용할 수 있습니다

git ls-tree --name-only -r <commit-ish>

1
--name-only가있는 ls-tree는 1.6.4.4 또는 1.6.3.3에서 작동하지 않는 것 같습니다. 이것이 버그라고 생각합니까?
krosenvold 2009

git ls-tree --name-only HEAD(의 <커밋 틱은> 매개 변수입니다 필요한 이 예에서 머리가) 자식 버전 1.6.4.3과 나를 위해 작동
야쿱 Narębski

2
여기서 매개 변수의 순서는 중요합니다. 귀하의 게시물에있는 것은 작동하지 않지만 응답에있는 것은 작동 하지 않습니다 -적어도 게시물을 업데이트 할 때까지;)
krosenvold

5
다음 --no-commit-id과 같이 SHA1 인쇄를 피하십시오.git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor

3
@CoDEmanX : 추가 -r/ -t옵션을 놓치지 않았습니까? diff-tree는 수정 된 파일과 추가 된 파일을 모두 처리하기 때문입니다. 새로운 (추가 된) 파일을 모두 나열하려면 다음을 사용하십시오.git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski

226

나는 gitk이것이 바람직하지 않다고 가정합니다 . 이 경우을 시도하십시오 git show --name-only <sha>.


36
--name-only는 내가 필요한 대부분의 경우에 충분합니다. 따라서 가장 짧은 솔루션 (1 시도에서 기억할 수있는 유일한 솔루션)을 상향 조정했습니다.
Erik S

25
또는 --name-status.
Neil Traft

CLI git을 정말로 좋아하는 사람 gitk은 실제로 파일을 검토하고 diff가있는 파일을 표시하는 적절한 방법입니다. 예를 들어 피어로부터 몬스터 커밋을 검토하는 코드.
Elijah Lynn

192

개인적으로 show 명령 과 함께 --stat--oneline 의 조합을 사용합니다 .

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

추가 / 제거 통계를 원하지 않거나 원하지 않는 경우 --stat--name-only로 바꿀 수 있습니다

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

4
대단해! 기본적으로 Github가 커밋보기의 맨 위에 표시하는 파일 요약을 제공합니다. 감사.
trisweb

아주 좋아요 별명을 정의하려면 alias gits='git show --stat --oneline'다음 gits을 수행하십시오 (). 자체적으로 최신 변경 사항 (HEAD) gits b24f5fb이 표시되고 개정판의 변경 사항을 표시하는 데 사용될 수 있습니다.
브렌트 파우스트

5
자식 별칭을 만들 수도 있습니다 (예 : 아마도) git config --global alias.changes 'show --stat --oneline'. 그런 다음 git changes(선택적 commit-ish와 함께) 입력 하여 위의 첫 번째 예제에서 출력을 얻을 수 있습니다.
lindes

Windows 용 Git에는 큰 따옴표가 필요합니다.git config --global alias.changes "show --stat --oneline"
Alchemistmatt

3
좋은. 수락 된 답변과 달리, git show숨김 변경 사항을 검토하는 작업도 수행합니다. 예git show --stat --oneline stash@{1}
Jeff Ward

83

당신은 또한 할 수 있습니다

git log --name-only

다양한 커밋, 커밋 메시지 및 변경된 파일을 탐색 할 수 있습니다.

프롬프트를 다시 표시하려면 q를 입력하십시오.


고마워요. BTW : git show 5944ad2a8b5 --name-only특정 커밋의 이름을 나열하는 데 사용 합니다
LiuWenbin_NO.

68

최근에 두 커밋 사이에 변경된 모든 파일을 나열해야했습니다. 그래서 나는 (또한 * nix 특정) 명령을 사용했습니다.

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

업데이트 : 또는 Ethan이 아래에 지적한 것처럼

git diff --name-only START_COMMIT..END_COMMIT

를 사용 --name-status하면 각 파일 옆에 변경 사항 (추가, 수정, 삭제 등)도 포함됩니다

git diff --name-status START_COMMIT..END_COMMIT

4
사용하는 경우 git diff --name-status START_COMMIT..END_COMMIT후행이 필요하지 않습니다 |sort | uniq.
Ethan

위의 의견에 대한 수정 :git diff --name-only START_COMMIT..END_COMMIT
에단

이것이 내가 찾던 것입니다. 내가 사용한 방법 : git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. 수천 개의 PNG 및 XML 레이아웃을 추가 한 거대한 PR에 대해서만 코드 변경 목록을 원했습니다.
AutonomousApps

63

가장 간단한 형태 :

git show --stat (hash)

기억하기 쉽고 필요한 모든 정보를 제공합니다.

파일 이름 만 원한다면 --name-only옵션을 추가 할 수 있습니다 .

git show --stat --name-only (hash)


2
--name-only에는 여전히 작성자, 날짜 및 커밋 메시지와 같은 정보가 포함 된 몇 개의 헤더 행이 포함됩니다.
삼키는 엘리시움

내가 병합 커밋을 위해 작동하는 것을 발견 한 단 하나
Alex Punnen

47

내가 사용하는 변경 꽤 자주 별칭을. 설정하려면 :

git config --global alias.changed 'show --pretty="format:" --name-only'

그때:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

유용 할 수있는 비슷한 명령 :

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

40

사용하다

git log --name-status

커밋 ID, 메시지, 변경된 파일 및 수정, 생성, 추가 또는 삭제 여부가 표시됩니다. 올인원 명령입니다.


38

표준 git diff 명령 사용 (스크립팅에도 적합) :

git diff --name-only <sha>^ <sha>

변경된 파일의 상태도 원하는 경우 :

git diff --name-status <sha>^ <sha>

이것은 병합 커밋과 잘 작동합니다.


26

이 명령을 사용하여 이름을 바꾸고 줄 수를 변경하십시오.

git show --stat <commit-hash>

파일 이름 만 표시

git show --stat --name-only  <commit-hash>

마지막 커밋 해시를 얻으려면이 명령을 시도하십시오.

git log -1

쇼 파일 이름 및 파일 상태가있는 마지막 커밋 수정, 작성 또는 삭제

 git log -1 --oneline --name-status <commit-hash>

또는 모두를 위해

git log

고급 git log 정보는이 기사를 읽으십시오.

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare "치명적인 : 인식 할 수없는 인수 : --names-only"from 2.20.1.windows.1
user2864740


20

좋아, 특정 커밋에서 모든 파일을 표시하는 몇 가지 방법이 있습니다 ...

정보를 줄이고 커밋 한 파일의 이름 만 표시 하려면 간단히 추가 --name-only하거나 --name-status플래그 를 지정할 수 있습니다 . 이러한 플래그는 원하는대로 이전 커밋과 다른 파일 이름 만 표시합니다.

따라서 git diff다음 --name-only과 같이 두 개의 커밋 해시 <sha0> <sha1>로 다음과 같이 할 수 있습니다.

git diff --name-only 5f12f15 kag9f02 

또한 이러한 상황에서 모든 단계를 보여주기 위해 아래 이미지를 만듭니다.

자식 diff-이름 전용 5f12f15 kag9f02


왜 두 개의 참조 (해시 이름을 지정합니까?)?
hakre

15

이것을 사용하여 두 변경 세트 사이에서 수정 된 파일 목록을 가져옵니다.

git diff --name-status <SHA1> <SHA2> | cut -f2

네,하지만 상태가 아니라 꽤 편리 할 수 있습니다 (isntance를 들어, 같은과 삭제 된 것을 제외한 모든 파일을 표시 grep을 할 수 있습니다git diff --name-status .. | grep ^[^D] | cut -f2
피에르 - 아드 비종


14

또한 git whatchanged보다 낮은 수준입니다git log

NAME
       git-whatchanged - Show logs with difference each commit introduces

모드 아래에 파일 목록과 함께 커밋 요약을 출력하고 added ( A), deleted ( D) 또는 modified ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

다음과 같은 것을 줄 것입니다 :

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

나는이 답변이 "외부 정보가없는"것과 실제로 일치하지 않는다는 것을 알고 있지만, 여전히이 목록이 파일 이름보다 더 유용하다고 생각합니다.


또한 whatchanged매개 변수를 제공하는 대신 하나의 명령 만 있습니다.
Gabrielius

11

나는 이것을 좋아한다 :

git diff --name-status <SHA1> <SHA1>^

나는 이것이 얻을 생각 A& D이 지정된에서 DIFF을 보여주는 있기 때문에 대신 다른 방법으로 주위의 커밋 이전에 커밋, 뒤로 (추가 및 삭제) 파일 상태를. 이어야합니다 git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi

11

마지막 커밋에서 파일 목록을 변경하려면 간단한 한 줄 명령을 사용하십시오.

git diff HEAD~1 --name-only

8

커밋에서 변경된 파일을 나열하십시오.

git diff --name-only SHA1^ SHA1

로그 메시지, 추가 줄 바꿈 또는 기타 혼란이 표시되지 않습니다. 이것은 현재 커밋뿐만 아니라 모든 커밋에 적용됩니다. 확실하지 그것은하지 않은 이유를 확실히 내가 추가 해요, 그래서 아직 언급되었다.


이 두 사람은 같은 모양 : git diff SHA1^ SHA1git show SHA1.
Vladimir Vukanac 2016 년

1
@mrW이 명령들은 비슷한 출력을 생성하지만 git show커밋 메시지를 보여줍니다
Newtonx

8

로그를 표시하십시오.

COMMIT는 공백 ( "")이거나 sha-1 또는 sha-1이 짧아 질 수 있습니다.

git log COMMIT -1 --name-only

파일 만 나열되므로 추가 처리에 매우 유용합니다.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

8

이에 대한 완벽한 답을 찾았습니다.

git show --name-status --oneline <commit-hash>

알 수 있도록

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

" git show --stat"(Ryan에게 감사함)과 몇 가지 sed 명령을 조합하면 데이터가 잘 려야합니다.

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

수정 된 파일 목록 만 생성됩니다.


5

파일 목록으로 보는 간단한 트릭이 있습니다 :. 해시 뒤에 추가 하십시오.

git show 9d3a52c474:

그런 다음 드릴 할 수 있습니다.

git show 9d3a52c474:someDir/someOtherDir

파일을 치면 파일의 원시 버전을 얻게됩니다. 좋은 참조 또는 주요 코드 조각 만 찾고 있다면 때로는 원하는 것입니다 (diffs는 모든 것을 혼란스럽게 만들 수 있습니다).

git show 9d3a52c474:someDir/someOtherDir/somefile

이 방법의 단점은 파일 트리를 쉽게 표시하지 않는다는 것입니다.



2

이것을 사용하여 병합 커밋에서 변경된 파일 목록을 가져옵니다.

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

또는

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

oh-my-zsh 및 git 플러그인을 사용하는 경우 glg 단축키가 도움이됩니다.


3
방금 대답에서 모든 코드를 잘라 냈습니까? 이것은 내가 언급 한 것이 아닙니다 . OP가 요청한 결과 출력에 답이 아닌 관련없는 정보 없습니다! 여전히 많은 외부 정보를 출력하는 답변이 있습니다. 그러나 지금은 훨씬 덜 정확하게 설명되어 있습니다. OP는 파일 목록을 출력하기를 원했습니다. 무엇을 glg출력 하는지보십시오 : 훨씬 더. 혼란을 드려 죄송합니다.
RomainValeri

0

파일 목록 (커밋 메시지조차 포함하지 않음) :

git show --name-only --pretty=format:

예를 들어 편집기에서 변경된 모든 파일을 엽니 다.

"$EDITOR" $(git show --name-only --pretty=format:)

-2

나는 내 별칭에 대한 요약을 공유 할 것이라고 생각했습니다. 또한 git과 함께 'zsh'를 사용하면 모든 것이 훌륭하게 크로마 키가되고 명령 프롬프트를 변경하여 분기가 항상 필요하다는 것을 알 수 있습니다.

SVN을 다루는 사람들에게는 이것이 유용하다는 것을 알게 될 것입니다.

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

-3

이것은 작동해야합니다 :

git status

스테이지되지 않은 것과 스테이지 된 것을 보여줍니다.


7
문제는 커밋 될 커밋이 아니라 이전 커밋 된 커밋의 파일 목록을 얻는 것입니다.
Rup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.