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


1955

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

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


Ответы:


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 без объединения - Файл имеет конфликты после слияния


Я случайно сказал 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(-)

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'

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


5

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


3

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

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


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:удаления разделитель между коммитами.


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.