Як мати назви git log show, як svn log -v


987

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

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (ср., 03 січня 2007 р.) | 1 рядок
Змінені шляхи:
   A / АВТОРИ
   A / КОПІВАННЯ
   A / ChangeLog
   A / ЕВОЛЮЦІЯ
   A / ВСТАНОВИТИ
   A / MacOSX

Чи є швидкий спосіб отримати список змінених файлів у кожному комісі в git?


15
Цікаво, чому git logпросто не підтримує -vкомутатор, як багато хто очікує / хоче? </gripe>
MarkHu

Відповіді:


1528

Повні назви змінених файлів шляху:

git log --name-only

Повні назви шляхів та статус змінених файлів:

git log --name-status

Для скорочених імен шляхів та дифстату змінених файлів:

git log --stat

Варіантів набагато більше, ознайомтеся з документами .


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-журнал [1] , але по замовчуванням , щоб показати необроблені вихідний формат відмінності і пропустити злиття.

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


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

Список літератури


50

git show також чудова команда.

Це як- svn 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

Показували б усі файли, які були змінені на локальній гілці, але ще не об'єднані в головну гілку на пульті.


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)
driftcatcher

41

Я використовую це щодня, щоб показувати історію із зміненими файлами:

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

Щоб зробити його коротким, додайте псевдонім у своє .gitconfig, виконуючи такі дії:

git config --global alias.ls 'log --stat --pretty=short --graph'

Шахта дуже близька до цього, 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.


Ви не можете зробити, git diff --stat HEAD..masterщоб показати різницю між HEAD та master, чи це не існувало, коли ви опублікували свою відповідь ще у 2012 році?
Феррібіг

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 @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

Іншою корисною командою було б те, git diff-tree <hash>де хеш може бути також хеш-діапазоном (позначається <old>..<new>позначеннями). Приклад виводу:

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

Поля:

вихідний режим, режим dest, джерело хешу, хеш dest, статус, ім'я файлу

Статуси - це такі, які ви очікували: D (видалено), A (додано), M (змінено) тощо. Повний опис див.


0

Зазвичай я їх використовую для отримання журналів:

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

$ git log --name-status --grep="<text from Commit message>"

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