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

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

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


person Shawn    schedule 12.10.2009    source источник
comment
Для фиксации и ее родителя: stackoverflow.com/questions/424071/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 24.07.2015
comment
Вы должны изменить заголовок вопроса ... вы не хотите перечислять имена файлов, которые изменились ... вы хотите перечислить имена файлов, которые изменились. Обратите внимание, что можно изменять имена файлов без изменения их содержимого.   -  person Max Waterman    schedule 10.07.2020


Ответы (15)


git diff --name-only SHA1 SHA2

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

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

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

person Peter    schedule 12.10.2009
comment
Это работает и для git show. git show --name-only SHA1. - person August Lilleaas; 23.11.2009
comment
git diff --name-status [TAG|SHA1] показывает, какие операции были выполнены с файлами - person reconbot; 28.09.2011
comment
вы также можете: git diff --name-only HEAD @ {3} HEAD @ {0} для точных коммитов, которые вы хотите сравнить. - person b01; 29.11.2011
comment
@AugustLilleaas, фактически использующий show, покажет только 2 конкретных коммита, если у вас есть коммиты между этими 2, они будут исключены - person chrisan; 10.10.2012
comment
не то, что попросил OP, но вы также можете сделать: git log -p --name-only - person Lenny Sirivong; 21.03.2013
comment
--name-only показывает только файлы, которые были изменены ... теперь, если я сделаю git diff SHA1 SHA2, я увижу весь код ... для больших коммитов это может выглядеть очень плохо в интерфейсе командной строки ... есть ли программное обеспечение с графическим интерфейсом ( то есть инструмент сравнения, такой как diffmerge), который может принимать такую ​​команду git и визуально отображать разницу? - person abbood; 13.12.2013
comment
неважно ... я только что понял, что это можно сделать визуально ... то есть с помощью таких инструментов, как sourcetree с использованием diffmerge в качестве графического интерфейса. Вы можете просто выбрать все коммиты (включая тот, который был перед первым, иначе вы не увидите изменений первого коммита) .. и он красиво соберет все различия .. довольно аккуратно! - person abbood; 13.12.2013
comment
это покажет только имя файла, а не изменения в файлах, проверьте мой ответ ниже: git diff --word-diff SHA1 SHA2 - person Julio Marins; 04.12.2014
comment
Как указано ниже, git diff --name-status, похоже, не хочет отображать добавленные файлы. @sschuberth указал на git show, который, похоже, у меня работает правильно: git show --pretty=format: --name-status. Простое выполнение git show --name-status дает немного больше информации, но все же красиво и плотно ... это будет моя новая команда goto;) - person travc; 15.06.2017
comment
Это довольно круто, как тогда можно фильтровать по автору, как в случае с git log --author? - person tonix; 19.11.2018
comment
git diff --name-only HEAD^ для того, что изменилось в самой последней фиксации - person starscream_disco_party; 23.05.2019
comment
Между прочим, точно так же, как git status показывает список измененных файлов, вы можете сделать git diff --name-only, чтобы получить тот же список без префикса modified:. Полезно, если вы хотите направить вывод для обработки. - person Nagev; 25.06.2019
comment
Есть ли способ раскрасить этот вывод? - person Unknow0059; 12.01.2021

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 unmerged - Файл конфликтует после слияния

person artfulrobot    schedule 26.07.2011
comment
Я сказал git diff --name-status, и он дал «добавленный файл». - person aartist; 08.02.2013
comment
Для git log между SHA должны быть две точки, например SHA1..SHA2, а второй SHA не является обязательным, поэтому он должен выглядеть так: git log --name-status --oneline [SHA1 .. SHA2] - person twasbrillig; 13.05.2014
comment
Есть ли способ исключить определенные файлы / определенные типы файлов? - person aug; 13.10.2014
comment
Вариант --relative[=<path>] может вам помочь, я не уверен. Иначе всегда | erep -v '(.tmp|.foo|.dontwant)$' ... - person artfulrobot; 15.10.2014
comment
@artfulrobot, ты имел ввиду egrep? - person David Moles; 05.05.2021
comment
@DavidMoles да, но я не могу редактировать комментарий сейчас! - person artfulrobot; 06.05.2021
comment
@artfulrobot ???? ну, теперь это хотя бы задокументировано - person David Moles; 06.05.2021

Похоже, что никто не упомянул о переключателе --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(-)
person leeyuiwah    schedule 19.10.2017
comment
Принятый ответ правильный, но он очень полезен и дает дополнительную информацию. Спасибо! - person kontur; 08.01.2018
comment
Согласен, это более полезный ответ, поскольку он содержит статистику различий. - person internetross; 30.04.2018

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

git diff --name-only `git merge-base origin/master HEAD`
person Tim James    schedule 20.03.2012
comment
Это было действительно полезно! Хотел бы я просто сказать git diffstatus master или что-то подобное, что вызывает вышеупомянутое. - person oma; 04.06.2013
comment
Возможно, вам не удастся сделать его псевдонимом git, но вы определенно можете поместить его в свой .bashrc. - person Fred; 26.02.2016
comment
Или еще проще: git diff --name-only HEAD...master (обратите внимание на три точки). Подробное объяснение см. здесь. - person ostrokach; 26.12.2016
comment
Похоже, в основном правильный ответ! Простой git diff --name-only master..branch не соответствует списку PR github. Так точнее. Но в любом случае у меня есть 173 измененных файла против 171 в PR на github. (без merge-base у меня 228 против 171) - person x'ES; 19.05.2017

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

git diff --name-status mybranch..myotherbranch

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

Добавление grep может улучшить ситуацию:

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

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

person Max MacLeod    schedule 22.10.2013
comment
Регулярные выражения хороши и действительно могут делать почти все. В этом случае, однако, есть --diff-filter, который предоставляет эту функцию изначально, что означает меньшую вероятность получения неверных результатов (например, ложных срабатываний). - person Jasper; 19.02.2015
comment
это не сработает, если в именах файлов есть "A\t". Вам нужно grep "^A\t" - person phuclv; 04.11.2020

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

git diff --word-diff SHA1 SHA2
person Julio Marins    schedule 04.12.2014

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

alias showfiles='git show --pretty="format:" --name-only'
person Zorayr    schedule 10.04.2015
comment
Или git config --global alias.showfiles 'show --pretty="format:" --name-only' сделать git showfiles. - person cgmb; 09.10.2017

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

git show --name-only
person Parris    schedule 01.10.2015

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

 git diff --name-status SHA1 SHA2 | grep '\.java$'
person K. Symbol    schedule 29.01.2019

Как сказал артфулробот в своем ответе:

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
person Jaime Montoya    schedule 03.05.2018

Использовать

git log --pretty=oneline > C:\filename.log

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

person Agni    schedule 10.09.2014
comment
git log --pretty=oneline дает мне только SHA и сообщение фиксации с использованием git 2.10.1 - person damd; 17.11.2016
comment
В Windows? В каком контексте? - person Peter Mortensen; 02.07.2021

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

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

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

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

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

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

person blindsnowmobile    schedule 16.11.2018

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

person Bernard Opic    schedule 03.11.2015

На случай, если кто-то ищет список измененных файлов, включая поэтапные файлы

git diff HEAD --name-only --relative --diff-filter=AMCR

git diff HEAD --name-only --relative --diff-filter=AMCR sha-1 sha-2

Удалите --relative, если вам нужны абсолютные пути.

person girishso    schedule 21.01.2021

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

Использование --no-pager решает эту проблему.

git --no-pager  diff --name-only sha1 sha2
person m12lrpv    schedule 04.07.2021