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

1584

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

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

Теги:
git-diff
git-show

13 ответов

2272
Лучший ответ
git diff --name-only SHA1 SHA2

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

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

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

  • 124
    Это работает и для git show. git show --name-only SHA1 .
  • 2
    особенно полезно получить список коммитов для рабочего процесса GIT + CVS
Показать ещё 9 комментариев
380
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 - Файл был переименован и изменен
Добавлен файл - Добавлен файл - D удален - Файл удален
U unmerged - Файл имеет конфликты после слияния

  • 0
    Я случайно сказал git diff --name-status, и он дал «добавленный файл».
  • 1
    Для git log, он должен иметь две точки между SHA, например SHA1..SHA2, а второй SHA не является обязательным, поэтому он должен выглядеть следующим образом: git log --name-status --oneline [SHA1 .. SHA2]
Показать ещё 2 комментария
45

Но для просмотра файлов, которые были изменены между вашей веткой и ее общим предком с другой ветвью (например, 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..
Показать ещё 3 комментария
41

Кажется, никто не упомянул переключатель --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(-)
  • 3
    Принятый ответ правильный, но это очень полезно и дает вам немного дополнительной информации. Спасибо!
  • 1
    Согласитесь, это более полезный ответ, поскольку он содержит статистику различий.
19

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

git diff --name-status mybranch..myotherbranch

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

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

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

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

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

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

alias showfiles='git show --pretty="format:" --name-only'
  • 1
    Или git config --global alias.showfiles 'show --pretty="format:" --name-only' чтобы создать git showfiles .
7

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

git diff --word-diff SHA1 SHA2
3

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

3

Использование git log --pretty = oneline > C:\filename.log

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

  • 0
    git log --pretty=oneline дает мне только SHA и сообщение о коммите, используя git 2.10.1
2

Как сказал 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
0

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

 git diff --name-status SHA1 SHA2 | grep '\.java$'
0

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

$ 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-diffview git, которое отображает иерархическое древовидное представление того, что изменилось между двумя путями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню