Как вывести список всех файлов в коммите?

2794

Я ищу простую gitкоманду, которая предоставляет красиво отформатированный список всех файлов, которые были частью фиксации, предоставленной хешем (SHA1), без посторонней информации.

Я пытался:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Хотя в нем перечислены файлы, он также включает в себя нежелательную информацию о различиях для каждого.

Есть ли другая 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- Вывести ВСЕ измененные файлы на текущую ветку, сравнивая с основной веткой.
Ноам Манос

Ответы:

3764

Предпочтительный способ (потому что это сантехническая команда; предназначена для программирования):

$ 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подавляет фиксации выходного идентификатора.
  • --prettyАргумент задает пустую строку формата , чтобы избежать хлама в самом начале.
  • В --name-onlyрассуждении показывает только имена файлов , которые были затронуты (Спасибо Hank). Используйте --name-statusвместо этого, если вы хотите увидеть, что случилось с каждым файлом ( D eleted, M odified, A dded)
  • -rАргумент для рекурсии в суб-деревья
Райан МакГири
источник
25
Следует отметить, что diff-treeон не будет работать при просмотре корневого коммита
jbranchaud
327
Замена --name-onlyопции --name-statusдаст более четкое резюме.
Курт Чжонг,
20
Если вы хотите, чтобы он работал с корневым коммитом, используйте флаг --root. Со страницы руководства: «Когда указан параметр --root, начальный коммит будет показан как большое событие создания. Это эквивалентно diff для дерева NULL».
Крис
24
git log --name-only -n 1 <hash>Последний коммит будет:git log --name-only -n 1 HEAD~1..HEAD
Курт
10
Если кому-то интересно (как и мне), почему первый способ «предпочтителен», он возвращается к комментарию @drizzt; git show«фарфор» (предназначенный для пользователя) и git diff-tree«трубопровод» (предназначенный для программного использования, например, из сценариев). Интерфейс для первого может изменяться с течением времени (так что сопровождающие git могут упасть, --name-onlyхотя я не думаю, что это произойдет ) по соображениям удобства использования, тогда как интерфейс для последнего будет поддерживаться максимально стабильным из соображений совместимости.
killscreen
237

Если вы хотите получить список измененных файлов:

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

Если вы хотите получить список всех файлов в коммите, вы можете использовать

git ls-tree --name-only -r <commit-ish>
Якуб Наребски
источник
1
Дерево ls с параметром --name-only не работает на 1.6.4.4 или 1.6.3.3. Как вы думаете, это ошибка?
krosenvold
git ls-tree --name-only HEAD(параметр <commit-ish> обязателен ; в данном примере это HEAD) у меня работает с git версии 1.6.4.3
Якуб Наренбский
2
Оказывается, порядок параметров здесь имеет большое значение. Тот, что в вашем посте, не работает, а тот, что в вашем ответе , работает - по крайней мере, пока вы не обновите свой пост;)
krosenvold
5
Проход, --no-commit-idчтобы избежать печати SHA1, например так:git diff-tree --no-commit-id --name-only -r <commit-ish>
Джон Меллор
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 попытку).
Эрик С
25
Или --name-status.
Нил Трафт
Как человек, которому действительно нравится CLI git, gitkна самом деле это достойный способ просмотра файлов и отображения файла, в котором находится diff. Например, код, проверяющий коммит монстра от сверстника.
Элайджа Линн
192

Я лично использую комбинацию --stat и --oneline с командой show :

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
Tuxdude
источник
4
Это замечательно! По сути, он дает сводку файлов, которую Github показывает в верхней части представления коммита. Спасибо.
trisweb
Очень хорошо. Чтобы определить псевдоним:, alias gits='git show --stat --oneline'тогда он gitsсам показывает последние изменения (в HEAD), а gits b24f5fbможет быть использован для отображения изменений любой ревизии.
Брент Фауст
5
Можно также создать псевдоним git ... например, возможно git config --global alias.changes 'show --stat --oneline'. Затем вы можете напечатать git changes(с необязательным коммитом) и получить вывод из первых примеров выше.
Линдес
Git для Windows требует двойных кавычек:git config --global alias.changes "show --stat --oneline"
Alchemistmatt
3
Ницца. И в отличие от принятого ответа, git showтакже работает для просмотра скрытых изменений: например,git show --stat --oneline stash@{1}
Джефф Уорд
83

Вы также можете сделать

git log --name-only

и вы можете просматривать различные коммиты, коммит сообщения и измененные файлы.

Введите q, чтобы получить ответ.

Инду Деванатх
источник
Спасибо, это помогает. КСТАТИ: используйте, git show 5944ad2a8b5 --name-onlyчтобы перечислить имя конкретного коммита
LiuWenbin_NO.
68

Недавно мне нужно было перечислить все измененные файлы между двумя коммитами. Поэтому я использовал эту (также * nix-специфическую) команду

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

Обновление : или как Этан указывает ниже

git diff --name-only START_COMMIT..END_COMMIT

Использование --name-statusтакже будет включать изменения (добавлены, изменены, удалены и т. Д.) Рядом с каждым файлом

git diff --name-status START_COMMIT..END_COMMIT
lunohodov
источник
4
Если вы используете, git diff --name-status START_COMMIT..END_COMMITто вам не нужен трейлинг |sort | uniq.
Итан
Исправление к вышеуказанному комментарию:git diff --name-only START_COMMIT..END_COMMIT
Итан
Это то, что я искал. Как я использовал это: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Я хотел список изменений кода только для огромного PR, который добавил тысячи PNG и XML-макетов.
Автономные приложения
63

Простейшая форма:

git show --stat (hash)

Это легче запомнить и даст вам всю необходимую информацию.

Если вы действительно хотите только имена файлов, вы можете добавить --name-onlyопцию.

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

Vato
источник
2
--name-only по-прежнему будет содержать несколько строк заголовка, содержащих такую ​​информацию, как автор, дата и сообщение о коммите.
пожрал Элизиум
я нашел только один, который работает для коммита слияния
Алекс Пуннен,
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
takeshin
источник
40

использование

git log --name-status

Это покажет вам идентификатор фиксации, сообщение, файлы, которые были изменены, и были ли они изменены, созданы, добавлены или удалены. Что-то вроде команды «все в одном».

alpha_989
источник
38

Используя стандартную команду git diff (также хорошо для сценариев):

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

Если вы хотите также статус измененных файлов:

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

Это хорошо работает с коммитами слияния.

vquintans
источник
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 прочитайте эту статью

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

https://devhints.io/git-log

Джинеш Джойсар
источник
1
@DanFare "fatal: нераспознанный аргумент: --names-only" от 2.20.1.windows.1
user2864740
24
$ git log 88ee8 ^ .. 88ee8 --name-only --pretty = "format:"
Пэт Нотц
источник
20

в порядке, есть несколько способов показать все файлы в конкретном коммите ...

Чтобы уменьшить информацию и показать только имена файлов, которые передали, вы можете просто добавить --name-onlyили--name-status пометить ..., эти флаги просто показывают вам имена файлов, которые отличаются от предыдущих коммитов, как вы хотите ...

Таким образом, вы можете сделать git diffследующее --name-only, с двумя хешами коммитов <sha0> <sha1>, что-то вроде ниже:

git diff --name-only 5f12f15 kag9f02 

Я также создаю изображение ниже, чтобы показать все шаги, которые необходимо выполнить в этой ситуации:

git diff - только для имени 5f12f15 kag9f02

Алиреза
источник
Почему два рефери (вы называете их хешами)?
19
15

Я использую это, чтобы получить список измененных файлов между двумя наборами изменений:

git diff --name-status <SHA1> <SHA2> | cut -f2
user135507
источник
Да, но статус может быть достаточно удобным (для краткости, вы можете использовать grep для отображения всех файлов, кроме тех, которые были удалены с чем-то вродеgit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson
14

Я люблю использовать

git show --stat <SHA1>^..<SHA2>
Майкл Де Сильва
источник
14

Там также git whatchanged, который является более низким уровнем, чемgit log

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

Он выводит сводную информацию о коммите со списком файлов под ним с их режимами и, если они добавлены ( A), удалены ( D) или изменены ( 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
...

Я знаю, что этот ответ на самом деле не соответствует «без посторонней информации», но я все же думаю, что этот список более полезен, чем просто имена файлов.

Koen.
источник
Плюс всего одна команда whatchangedвместо предоставления параметров.
Габриелиус
11

Мне это нравится:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
источник
Я думаю , что это получает Aи Dфайл (добавлять и удалять) статусы в обратном направлении, так как он показывает на диф от указанной фиксации к предыдущей фиксации, а не наоборот. Так и должно быть git diff --name-status <SHA1>^ <SHA1>.
Трой Джиззи
11

Используйте простую однострочную команду, если вы хотите, чтобы список файлов был изменен во время последнего коммита:

git diff HEAD~1 --name-only
Разработчик-Sid
источник
8

Список файлов, которые изменились в коммите:

git diff --name-only SHA1^ SHA1

Это не показывает сообщения журнала, лишние новые строки или любой другой беспорядок. Это работает для любого коммита, а не только для текущего. Не знаю , почему он не совсем был упомянут еще, так что я добавляю его.

Newtonx
источник
Эти два выглядят одинаково: git diff SHA1^ SHA1и git show SHA1.
Владимир Вуканац
1
@mrW Эти команды выдают похожий вывод, но git showтакже показывают сообщение о
коммите
8

Показать журнал.

COMMIT может быть пустым ("") или сокращенным sha-1 или sha-1.

git log COMMIT -1 --name-only

Это перечислит только файлы, очень полезные для дальнейшей обработки.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"
thefreshteapot
источник
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" (спасибо Райан) и пара команд sed должны урезать данные для вас:

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

Это даст только список измененных файлов.

seanhodges
источник
5

Существует простой трюк для просмотра в виде списка файлов, просто добавьте :после хеша.

git show 9d3a52c474:

Затем вы можете сверлить,

git show 9d3a52c474:someDir/someOtherDir

Если вы нажмете на файл, вы получите сырую версию файла; иногда это то, что вам нужно, если вы ищете только хорошую ссылку или ключевые куски кода (различия могут привести к беспорядку),

git show 9d3a52c474:someDir/someOtherDir/somefile

Единственным недостатком этого метода является то, что он не может легко показать дерево файлов.

srcspider
источник
3
git show HEAD@{0}

у меня отлично работает

Брюс
источник
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
Вы только что ... вырезали весь код из своего ответа? Это совсем не то, на что я ссылался. Никакой посторонней информации в выводе результатов, как было задано ОП, а не в вашем ответе! У вас все еще есть ответ, который выводит МНОГО посторонней информации. Но сейчас это описывается гораздо менее точно. ОП хотел вывести список файлов, и ничего более. Посмотрите на какие glgвыводы: намного больше. Извините за путаницу.
RomainValeri
0

Только список файлов (даже не зафиксировать сообщение):

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

Например, откройте все измененные файлы в вашем редакторе:

"$EDITOR" $(git show --name-only --pretty=format:)
user2394284
источник
-2

Я думал, что поделюсь краткой информацией о моем псевдониме ... также я нахожу, что с помощью 'zsh' замечательно с git it все ключи ключей цветности все хорошо и сообщают, что вы хотите, чтобы ветвь всегда была, изменяя командную строку.

Для тех, кто освещает 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

Это покажет, что не поставлено, а что поставлено.

4067098
источник
7
Вопрос в том, чтобы получить список файлов в ранее зафиксированном коммите, а не в коммите, который должен быть зафиксирован.
Rup