Jak mieć git log wyświetlać nazwy plików, takie jak svn log -v

987

Dziennik SVN ma tryb „-v”, który wyświetla nazwy plików zmienionych w każdym zatwierdzeniu, tak jak:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (śr., 03 stycznia 2007) | 1 linia
Zmienione ścieżki:
   A / AUTORZY
   A / KOPIOWANIE
   A / ChangeLog
   A / EWOLUCJA
   A / INSTALL
   A / MacOSX

Czy istnieje szybki sposób na uzyskanie listy zmienionych plików w każdym zatwierdzeniu w git?

jes5199
źródło
15
Zastanawiasz się, dlaczego git lognie obsługuje tylko -vprzełącznika, którego tak wielu oczekuje / chce? </
gripe

Odpowiedzi:

1528

Aby uzyskać pełne nazwy ścieżek zmienionych plików:

git log --name-only

Aby uzyskać pełne nazwy ścieżek i status zmienionych plików:

git log --name-status

Skrócone nazwy ścieżek i diffstat zmienionych plików:

git log --stat

Jest o wiele więcej opcji, sprawdź dokumenty .

CB Bailey
źródło
17
Używam git log --numstat. Zobacz git help logwięcej opcji.
ma11hew28
29
git log --name-only --onelinejest też dość sprytny - jedna kolorowa linia dla zatwierdzenia i jeden plik na linię. stackoverflow.com/a/14227496/1995714
cp.engr
4
W przypadku git 2.7.3 musiałem go używać git log --name-status --find-renames, aby wyświetlać pliki o zmienionych nazwach zamiast dodawania i usuwania.
Suzanne Dupéron,
1
Zauważ, że --statskraca długie ścieżki; szerokość jest konfigurowalna, ale zawijane histogramy są trudniejsze do odczytania. Inne formaty, takie jak --numstatzawsze, drukują pełne ścieżki.
Beni Cherniavsky-Paskin
@ ma11hew28 Dzięki. --numstatznajduje się w linii 946 tej strony podręcznika od git 2.22.00. To o wiele więcej opcji, niż większość ludzi potrzebuje.
Przywróć Monikę - M. Schröder
139

UWAGA: jest przestarzałe, użyj zamiast niego git whatchangedgit log

Nowych użytkowników zachęca się do korzystania z git-log [1] . whatchangedPolecenie jest zasadniczo taka sama jak git-log [1] , ale domyślne pokazać surowego Format wyjściowy diff pominąć scalone.

Polecenie jest utrzymywane przede wszystkim ze względów historycznych; palce wielu osób, które nauczyły się Gita na długo przed git logwynalezieniem przez czytanie listy mailingowej jądra Linuksa, są wyszkolone do pisania.


Możesz użyć polecenia, git whatchanged --stataby uzyskać listę plików, które zmieniły się w każdym zatwierdzeniu (wraz z komunikatem zatwierdzenia).

Bibliografia

mipadi
źródło
50

git show to także świetne polecenie.

To trochę tak svn diff, ale możesz przekazać go guidowi zatwierdzenia i zobaczyć różnicę.

ptc
źródło
46

Jeśli chcesz uzyskać nazwy plików tylko bez reszty wiadomości zatwierdzenia, możesz użyć:

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

Można to następnie rozszerzyć, aby używać różnych opcji zawierających nazwę pliku:

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

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

Podczas korzystania z tej metody należy zauważyć, że na wydruku są pewne puste linie, które należy zignorować. Korzystanie z tego może być przydatne, jeśli chcesz zobaczyć pliki, które zostały zmienione w oddziale lokalnym, ale nie są jeszcze wypychane do oddziału zdalnego i nie ma gwarancji, że najnowsze pliki zdalne zostały już pobrane. Na przykład :

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

Pokaże wszystkie pliki, które zostały zmienione w oddziale lokalnym, ale nie zostały jeszcze scalone z odgałęzieniem głównym na pilocie.

Hazok
źródło
1
Uwaga na temat białych znaków w powyższych przykładach - to jak git log --stat --pretty="format:" $branchName. Na przykład git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). Podczas gdy ja to robię, oto dokładna inkantacja, która zakończyła się stosownie do mojego celu:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher
41

Używam tego na co dzień, aby pokazać historię ze zmienionymi plikami:

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

Krótko mówiąc, dodaj do swojego aliasu .gitconfig, wykonując:

git config --global alias.ls 'log --stat --pretty=short --graph'
xsor
źródło
Mój jest bardzo blisko tego, git log --pretty = oneline --graph - nazwa-status. Uważam to za bardziej zwięzłe, po prostu pokazuje listę plików, które uległy zmianie.
Peter Suwara
15

Używam tego:

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

która wyświetla tylko listę plików i ich stan (dodany, zmodyfikowany, usunięty):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...
Sofia
źródło
7

git diff --stat HEAD^!pokazuje zmienione pliki i liczbę dodanych / usuniętych linii dla ostatniego zatwierdzenia ( HEAD).

Wydaje mi się, że nie ma jednego polecenia, aby uzyskać zwięzłe dane wyjściowe składające się tylko z nazw plików oraz dodanych i usuniętych liczników linii dla kilku zatwierdzeń na raz, więc stworzyłem w tym celu własny skrypt 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

Nazywać się np. ./changed_files 99aby uzyskać zmiany w zwięzłej formie od HEADdo HEAD~99. Może być instalowany np. do less.

nrz
źródło
Czy nie możesz zrobić, git diff --stat HEAD..masteraby pokazać różnicę między HEAD a master, czy nie istniało to, kiedy opublikowałeś swoją odpowiedź w 2012 roku?
Ferrybig,
1
Pytanie @Ferrybig OP dotyczy tego, jak „uzyskać listę zmienionych plików w każdym zatwierdzeniu” , a nie różnic między HEADi master. To są dwie różne rzeczy.
nrz
4

Uważam, że następujący jest idealny sposób wyświetlania listy plików zmienionych na zatwierdzenie w zwięzłym formacie:

git log --pretty=oneline --graph --name-status
Peter Suwara
źródło
3

Podsumowanie odpowiedzi z przykładowym wynikiem

To używa lokalnego repozytorium z pięcioma prostymi zatwierdzeniami.

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

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <[email protected]>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <[email protected]>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <[email protected]>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <[email protected]>

      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 <[email protected]>
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


Kredyty dla @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc

JamesThomasMoon1979
źródło
0

Innym przydatnym poleceniem byłoby, gdy git diff-tree <hash>skrót może być również zakresem skrótu (oznaczonym <old>..<new>notacją). Przykład wyjściowy:

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

Te pola to:

tryb źródłowy, tryb dest, skrót źródłowy, skrót skrótu, status, nazwa pliku

Statusy są tymi, których można się spodziewać: D (usunięty), A (dodany), M (zmodyfikowany) itd. Pełny opis znajduje się na stronie man.

Omer Dagan
źródło
0

Zazwyczaj używam ich, aby uzyskać dzienniki:

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

$ git log --name-status --grep="<text from Commit message>"
Gauraw
źródło
1
Nie wiedziałem o tych opcjach, ale ten post byłby bardziej przydatny, gdyby wyjaśnił, że filtruje dziennik. Przez chwilę myślałem, że to sposób na zmianę sposobu wyświetlania autorów w wynikach.
Stein