Як перелічити лише імена файлів, які змінилися між двома комітами?


1952

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

Яку команду я повинен використовувати?


Відповіді:


2662
git diff --name-only SHA1 SHA2

де потрібно лише включити достатню кількість SHA для ідентифікації комітетів. Ви також можете зробити, наприклад

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

щоб побачити відмінності між десятим останнім чином і п'ятим останнім (або близько того).


151
Це працює і для git show. git show --name-only SHA1.
Серпень Ліллеас

78
git diff --name-status [TAG|SHA1]показує, які операції були зроблені і над файлами
перезавантажтеся

2
Ви також можете зробити: git diff - тільки Ім'я HEAD @ {3} HEAD @ {0} для точних завдань, які ви хочете порівняти.
b01

7
@AugustLilleaas, що фактично використовує шоу, покаже лише 2 конкретні коміти, якщо у вас є коміти між цими 2, вони будуть залишені
chrisan

4
Як зазначено нижче, git diff --name-statusсхоже, не хочеться показувати додані файли. @sschuberth зазначив git show, що, схоже на роботу правильно для мене git show --pretty=format: --name-status. Щойно робити git show --name-statusтрохи більше інформації, але все-таки приємно і щільно ... це буде моя нова команда goto;)
travc

416
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-редагування C - Файл скопійовано та змінено
R перейменування-редагування - Файл перейменовано та змінено
Додано - Файл додано
D видалено - Файл видалено
U unmerged - У файлі виникають конфлікти після злиття


Я випадково кажу, що git diff - name-status, і він дав "доданий файл".
аартист

1
Для журналу git потрібно мати дві крапки між SHA, як-от SHA1..SHA2, а друга SHA не є необов'язковою, тому вона має виглядати так: git log - ім'я-статус --одна лінія [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
Прийнята відповідь правильна, але це дуже корисно і дає трохи додаткової інформації. Дякую!
kontur

2
Погоджено, це корисніша відповідь, оскільки вона містить різну статистику.
Інтернет через

52

Але для того, щоб побачити зміни файлів між вашою гілкою та її загальним предком з іншою гілкою (скажімо, походження / головний):

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(зверніть увагу на три крапки). Детальне пояснення дивіться тут .
ostrokach

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функціональність, яка дає можливість використовувати цю функцію, тобто менше шансів на неправильні результати (наприклад, помилкові позитиви)
Jasper

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
чорт

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

яка зручна для використання в Дженкінсі, де вам надано Список змінSet SHA, і хочете переглядати їх, щоб побачити, які файли були змінені.

Це схоже на пару відповідей, поданих вище, але використовує, tformat:а не format:видаляє простір між розділами.


0

На підставі git diff --name-statusя написав розширення git git-diffview, яке надає ієрархічний вигляд дерева того, що змінилося між двома шляхами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.