Как перечислить только имена файлов, которые изменились между двумя коммитами?

1955

У меня есть куча коммитов в репо. Я хочу увидеть список файлов, измененных между двумя коммитами - с SHA1 на SHA2.

Какую команду я должен использовать?

Шон
источник
3
Для коммита и его родителя: stackoverflow.com/questions/424071/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

2668
git diff --name-only SHA1 SHA2

где вам нужно только включить достаточное количество SHA, чтобы идентифицировать коммиты. Вы также можете сделать, например,

git diff --name-only HEAD~10 HEAD~5

чтобы увидеть различия между десятым последним коммитом и пятым последним (или около того).

Питер
источник
152
Это работает и для git show. git show --name-only SHA1,
Август Лиллеас
78
git diff --name-status [TAG|SHA1]показывает, какие операции были проделаны с файлами
переназначение
2
вы также можете сделать: git diff - name-only HEAD @ {3} HEAD @ {0} для точных коммитов, которые вы хотите сравнить.
b01
7
@AugustLilleaas, фактически использующий show, покажет только 2 конкретных коммита, если у вас есть коммиты между этими 2, они будут
пропущены
4
Как отмечено ниже, git diff --name-statusкажется, не хочет показывать добавленные файлы. @sschuberth отметил git show, что, похоже на работу правильно для меня git show --pretty=format: --name-status. Просто делать git show --name-statusдает немного больше информации, но все же приятно и плотно ... это будет моя новая команда goto;)
travc
417
git diff --name-status [SHA1 [SHA2]]

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

git log --name-status --oneline [SHA1..SHA2]

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

  • если вас интересует только то, что случилось с определенными файлами / папками, вы можете добавить -- <filename> [<filename>...]к git logверсии.

  • если вы хотите увидеть, что произошло для одного коммита, назовите его SHA1, затем выполните
    git log --name-status --oneline [SHA1^..SHA1]

Флаги состояния файла:
M изменено - Файл был изменен
C copy-edit - Файл был скопирован и изменен
R rename-edit - Файл был переименован и изменен
A добавлен - Файл был добавлен
D удален - Файл был удален
U без объединения - Файл имеет конфликты после слияния

artfulrobot
источник
Я случайно сказал git diff --name-status, и он дал «добавленный файл».
аартист
1
Для git log, он должен иметь две точки между SHA, например SHA1..SHA2, а второй SHA не является обязательным, поэтому он должен выглядеть следующим образом: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig
Есть ли способ исключить определенные файлы / определенные типы файлов?
август
3
--relative[=<path>]Вариант может помочь вам, я не уверен. В противном случае всегда есть | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot
80

Кажется, что никто не упомянул переключатель --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Это также --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

а также --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
источник
4
Принятый ответ правильный, но это очень полезно и дает вам немного дополнительной информации. Спасибо!
Контур
2
Согласитесь, это более полезный ответ, поскольку он содержит статистику различий.
Интернет
52

Но для просмотра файлов, измененных между вашей веткой и ее общим предком с другой веткой (скажем, origin / master):

git diff --name-only `git merge-base origin/master HEAD`
Тим Джеймс
источник
1
Это было действительно полезно! Я хотел бы просто сказать git diffstatus masterили подобное, что вызывает вышеизложенное.
Ома
3
Или git show --pretty=format: --name-only origin/master...
sschuberth
Возможно, вы не сможете сделать его псевдонимом git, но вы определенно можете поместить его в свой .bashrc.
Фред
3
Или даже проще: git diff --name-only HEAD...master(обратите внимание на три точки). Для подробного объяснения смотрите здесь .
Острокач
1
Похоже, в основном правильный ответ! Простой git diff --name-only master..branchне соответствует списку PR GitHub. Этот способ более точный. Но в любом случае у меня есть 173 измененных файла против 171 в github PR. (без merge-baseменя у меня 228 против 171)
x'ES
21

В дополнение к ответу @ artfulrobot, если вы хотите показать измененные файлы между двумя ветками:

git diff --name-status mybranch..myotherbranch

Будьте осторожны с приоритетом. Если вы сначала разместите более новую ветку, то она будет отображать файлы как удаленные, а не как добавленные.

Добавление grepможет улучшить вещи дальше:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Затем будут показаны только файлы, добавленные в myotherbranch.

Макс Маклеод
источник
4
Регулярные выражения хороши и могут действительно сделать почти все. В этом случае, однако, есть также, --diff-filterкоторый дает эту функциональность изначально, что означает меньшую вероятность неправильных результатов (например, ложных срабатываний)
Джаспер
8

Добавьте псевдоним ниже к вашему ~/.bash_profile, затем запустите source ~/.bash_profile,; теперь в любое время вам нужно увидеть обновленные файлы в последнем коммите, запустить showfilesиз вашего репозитория git.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
источник
2
Или git config --global alias.showfiles 'show --pretty="format:" --name-only'сделать git showfiles.
cgmb
7

Это покажет изменения в файлах:

git diff --word-diff SHA1 SHA2
Хулио Маринс
источник
5

Также обратите внимание, если вы просто хотите увидеть измененные файлы между последним коммитом и предыдущим. Это прекрасно работает:git show --name-only

Parris
источник
3

Используйте git log --pretty = oneline> C: \ filename.log

который будет регистрировать только один файл (--pretty = oneline), который является именем измененного файла. Также будет записывать все детали в ваш выходной файл.

Agni
источник
git log --pretty=onelineдает мне только SHA и сообщение о коммите, используя git 2.10.1
damd
3

Как сказал artfulrobot в своем ответе:

git diff --name-status [SHA1 [SHA2]]

Мой пример:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Хайме Монтойя
источник
3

Просто для тех, кому нужно сосредоточиться только на файлах Java, вот мое решение:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
К. Символ
источник
1

Следующее хорошо работает для меня:

$ git show --name-only --format=tformat: SHA1..SHA2

Его также можно использовать с одним коммитом:

git show --name-only --format=tformat: SHA1

который удобен для использования в Jenkins, где вам предоставляется список SHA changeSet, и вы хотите просмотреть их, чтобы посмотреть, какие файлы были изменены.

Это похоже на пару ответов выше, но использует tformat:вместо format:удаления разделитель между коммитами.

blindsnowmobile
источник
0

Основываясь на этом, git diff --name-statusя написал расширение git git-diffview, которое отображает иерархическое древовидное представление о том, что изменилось между двумя путями.

Бернард Опик
источник