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

179

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

Что я должен бежать, чтобы получить этот список?

Чен Кинрот
источник
35
"из-за бюрократии" xD
ptim

Ответы:

238

Для файлов, измененных между данным SHA и вашим текущим коммитом:

git diff --name-only <starting SHA> HEAD

или если вы хотите включить измененные, но еще не зафиксированные файлы:

git diff --name-only <starting SHA>

В общем, следующий синтаксис всегда скажет вам, какие файлы изменились между двумя коммитами (указанными в их SHA или других именах):

git diff --name-only <commit1> <commit2>
янтарный
источник
2
и если вы хотите знать файлы, измененные для определенного коммита, сделайте:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Использование --name-statusфлажка вместо --name-onlyудобного для получения списка файлов и просмотра статуса их изменения, например, «Добавлен» или «Изменен».
Тейн Пламмер
@Amber должен упомянуть заметки @Thane Plummer, которые --name-statusпоказывают, что с ними произошло
Золтан Сюле
64

Чтобы найти имена всех файлов, измененных с момента вашей последней фиксации:

git diff --name-only

Или (для получения дополнительной информации, включая неотслеживаемые файлы):

git status
Тим Беллис
источник
48
  • Чтобы просмотреть все неотмеченные отслеженные измененные файлы:

    git diff --name-only
    
  • Для того, чтобы перечислить все поставил отслеживаемые измененные файлы:

    git diff --name-only --staged
    
  • Чтобы просмотреть все помеченные и неустановленные отслеженные измененные файлы:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Чтобы вывести список всех неотслеживаемых файлов (перечисленных в списке, исключаяgit status любые игнорируемые файлы):

    git ls-files --other --exclude-standard
    

Если вы используете это в сценарии оболочки, и вы хотите программно проверить , если эти команды возвращаются ничего, вы будете заинтересованы в git diff«s --exit-codeварианта.

Флимм
источник
16

Когда я добавил / изменил / удалил много файлов (с момента последнего коммита), мне нравится смотреть на эти изменения в хронологическом порядке.

Для этого я использую:

  • Чтобы вывести список всех не подготовленных файлов:

    git ls-files --other --modified --exclude-standard
    
  • Чтобы получить дату последнего изменения для каждого файла:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Хотя Рувим предлагает в комментариях :

xargs -0 stat -c '%y %n' -- 
  • Чтобы отсортировать их от самых старых до самых последних:

    sort
    

Псевдоним облегчает использование:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Или (короче и эффективнее, благодаря ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Например:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Теперь я могу просмотреть свои модификации, от самых старых до самых последних.

VonC
источник
Почему бы не использовать xargsи разовый вызов stat? Полный однострочник:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim
@ruvim Спасибо. Очень хорошее предложение. Я отредактировал ответ, включив ваш комментарий, для большей наглядности.
VonC
4

Мне нужен список файлов, которые изменили содержимое между двумя коммитами (только добавлены или изменены), поэтому я использовал:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Различные параметры diff-фильтра из документации git diff :

Diff-фильтр = [(А | C | | М | Р | Т | У | Х | В) ... [*]]

Выберите только те файлы, которые добавлены (A), скопированы (C), удалены (D), изменены (M), переименованы (R), чей тип (т. Е. Обычный файл, символическая ссылка, подмодуль,…) изменен (T), Unmerged (U), Неизвестен (X), или у них было сломано соединение (B). Может использоваться любая комбинация символов фильтра (включая ни одного). Когда * (All-or-none) добавляется в комбинацию, выбираются все пути, если есть какой-либо файл, который соответствует другим критериям в сравнении; если нет файла, соответствующего другим критериям, ничего не выбирается.

Кроме того, эти заглавные буквы могут быть исключены в нижнем регистре. Например, --diff-filter = ad исключает добавленные и удаленные пути.

Если вы также хотите перечислить статус (например, A / M), измените --name-onlyна --name-status.

фураж
источник
3

Список unstaged модифицирована может быть получен с помощью git statusи grepкоманды , как показано ниже. Что-то вроде git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....
SuperNova
источник
Обратите внимание, что это можно использовать только для изменений без изменений, поэтому оно бесполезно для «файлов, которые изменились между двумя коммитами Git»
Джон Ванденберг,
2

С ним git showможно получить аналогичный результат. Для просмотра коммита (как он выглядит при git logпросмотре) со списком включенных файлов, используйте:

git show --name-only [commit-id_A]^..[commit-id_B]

Где [commit-id_A]находится начальный коммит и [commit-id_B]последний коммит, который вы хотите показать.

Особое внимание с ^символом. Если вы не укажете это, информация commit-id_A не будет развернута.

Kurapika
источник
1

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

git status - он покажет файлы с изменениями

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

git diff - покажет все изменения во всех файлах

это хорошо, только когда изменен только один файл

и если вы хотите проверить определенный файл, используйте

мерзавец

Саураб Пал
источник