Как сделать так, чтобы git log отображал имена файлов, такие как svn log -v

987

Журнал SVN имеет режим "-v", который выводит имена файлов, изменяемых при каждом коммите, например:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (ср., 3 января 2007 г.) | 1 строка
Измененные пути:
   A / АВТОРЫ
   A / КОПИРОВАНИЕ
   A / ChangeLog
   A / ЭВОЛЮЦИЯ
   A / УСТАНОВИТЬ
   A / MacOSX

Есть ли быстрый способ получить список измененных файлов в каждом коммите в git?

jes5199
источник
15
Интересно, почему git logне поддерживается просто -vпереключение, как многие ожидают / хотят? </
gripe

Ответы:

1528

Для полных путей измененных файлов:

git log --name-only

Для полного пути и статуса измененных файлов:

git log --name-status

Для сокращенных путей и diffstat измененных файлов:

git log --stat

Там намного больше вариантов, посмотрите документы .

CB Bailey
источник
17
Я использую git log --numstat. Смотрите git help logбольше вариантов.
ma11hew28
29
git log --name-only --onelineтоже довольно элегантно - одна цветная строка для коммита и один файл на строку. stackoverflow.com/a/14227496/1995714
cp.engr
4
С git 2.7.3 мне пришлось использовать git log --name-status --find-renamesего для отображения переименованных файлов вместо добавления + удаления.
Сюзанна Дюперон
1
Обратите внимание, что --statсокращает длинные пути; Ширина настраивается, но обернутые гистограммы труднее читать. Другие форматы, как --numstatвсегда, печатают полные пути.
Бени Чернявский-Паскин
@ ma11hew28 Спасибо. --numstatнаходится в строке 946 этой страницы руководства по состоянию на git 2.22.00. Это намного больше вариантов, чем нужно большинству людей.
Восстановите Монику - М. Шредер
139

ПРИМЕЧАНИЕ: не рекомендуется использовать вместо git whatchangedgit log

Новым пользователям рекомендуется использовать вместо этого git-log [1] . Эта whatchangedкоманда по сути такая же, как git-log [1], но по умолчанию она показывает вывод различий в необработанном формате и пропускает слияния.

Команда сохраняется в основном по историческим причинам; пальцы многих людей, которые изучили Git задолго до того, как он git logбыл изобретен чтением списка рассылки ядра Linux, обучены набирать его.


Вы можете использовать команду, git whatchanged --statчтобы получить список файлов, которые менялись в каждом коммите (вместе с сообщением о коммите).

Ссылки

mipadi
источник
50

git show это также отличная команда.

Это вроде как svn diff, но вы можете передать его руководству по коммиту и посмотреть этот diff.

ПТКС
источник
46

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

git log --name-only --pretty=format: <branch name>

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

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

При использовании этого метода следует обратить внимание на то, что в выводе есть несколько пустых строк, которые необходимо игнорировать. Использование этого может быть полезно, если вы хотите увидеть файлы, которые были изменены в локальной ветке, но еще не переданы в удаленную ветку, и нет гарантии, что последние из удаленной ветки уже были извлечены. Например, :

git log --name-only --pretty=format: my_local_branch --not origin/master

Показывает все файлы, которые были изменены в локальной ветви, но еще не объединены с главной веткой на удаленной.

Hazok
источник
1
Обратите внимание на пробелы в приведенных выше примерах - это как, git log --stat --pretty="format:" $branchName. Так например git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). Пока я в этом, вот точное заклинание, которое git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
оказалось
41

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

git log --stat --pretty=short --graph

Для краткости добавьте псевдоним в ваш файл .gitconfig, выполнив:

git config --global alias.ls 'log --stat --pretty=short --graph'
xsor
источник
Мой очень близок к этому, git log --pretty = oneline --graph --name-status. Я нахожу это более кратким, просто показывая список файлов, которые изменились.
Питер Сувара
15

Я использую это:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

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

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...
София
источник
7

git diff --stat HEAD^!показывает измененные файлы и количество добавленных / удаленных строк для последнего коммита ( HEAD).

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

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

Называться например. ./changed_files 99чтобы получить изменения в сжатой форме от HEADдо HEAD~99. Может быть, например, по трубопроводу. к less.

NRZ
источник
Разве вы не git diff --stat HEAD..masterможете показать разницу между HEAD и master, или этого не было, когда вы опубликовали свой ответ еще в 2012 году?
Ferrybig
1
Вопрос @Ferrybig OP о том, как «получить список измененных файлов в каждом коммите» , а не о различиях между HEADи master. Это две разные вещи.
NRZ
4

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

git log --pretty=oneline --graph --name-status
Питер Сувара
источник
3

Сводка ответов с примером вывода

Это использует локальный репозиторий с пятью простыми коммитами.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Кредиты @ CB-Bailey @ Питер-Сувара @Gaurav @ Омер-Даган @xsor @Hazok @nrz @ptc

JamesThomasMoon1979
источник
0

Еще одна полезная команда - это git diff-tree <hash>где хеш может быть также диапазоном хеша (обозначается через <old>..<new>нотацию). Пример вывода:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Поля:

режим источника, режим Dest, исходный хеш, Dest хэш, статус, имя файла

Ожидаемые статусы: D (удалено), A (добавлено), M (изменено) и т. Д. См. Man-страницу для полного описания.

Омер Даган
источник
0

Я обычно использую их, чтобы получить журналы:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"
Gaurav
источник
1
Я не знал об этих параметрах, но этот пост был бы более полезным, если бы он объяснил, что он фильтрует журнал. На мгновение я подумал, что это способ изменить способ перечисления авторов в выходных данных.
Стейн