Jak uzyskać listę wszystkich plików, które zmieniły się między dwoma zatwierdzeniami Gita?

178

Ze względu na biurokrację muszę uzyskać listę wszystkich zmienionych plików w moim repozytorium do raportu (zacząłem od istniejącego kodu źródłowego).

Co powinienem uruchomić, aby uzyskać tę listę?

Chen Kinnrot
źródło
34
„z powodu biurokracji” xD
ptim

Odpowiedzi:

238

W przypadku plików zmienionych między podanym SHA a bieżącym zatwierdzeniem:

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

lub jeśli chcesz dołączyć zmienione, ale jeszcze niezatwierdzone pliki:

git diff --name-only <starting SHA>

Mówiąc bardziej ogólnie, następująca składnia zawsze powie ci, które pliki zmieniły się między dwoma zatwierdzeniami (określone przez ich SHA lub inne nazwy):

git diff --name-only <commit1> <commit2>
Bursztyn
źródło
2
a jeśli chcesz poznać pliki zmodyfikowane dla konkretnego zatwierdzenia, zrób:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Użycie --name-statusflagi zamiast flagi --name-onlyjest przydatne, aby uzyskać listę plików i zobaczyć ich stan modyfikacji, na przykład Dodane lub Zmodyfikowane.
Thane Plummer
@Amber powinien wspomnieć o notatkach @Thane Plummera, które --name-statuspokazują, co się z nimi stało
Zoltán Süle,
64

Aby znaleźć nazwy wszystkich plików zmodyfikowanych od ostatniego zatwierdzenia:

git diff --name-only

Lub (aby uzyskać więcej informacji, w tym nieśledzone pliki):

git status
Tim Bellis
źródło
48
  • Aby wyświetlić listę wszystkich niestacjonarnych, śledzonych zmienionych plików:

    git diff --name-only
    
  • Aby wyświetlić wszystkie etapowe śledzone zmienione pliki:

    git diff --name-only --staged
    
  • Aby wyświetlić listę wszystkich przemieszczonych i niestacjonarnych śledzonych zmienionych plików:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Aby wyświetlić wszystkie nieśledzone pliki (te wymienione obok git status, nie uwzględniając ignorowanych plików):

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

Jeśli używasz tego w skrypcie powłoki, i chcesz programowo sprawdzić, czy te polecenia wrócił niczego, będziesz zainteresowany git diff„s --exit-codeopcja.

Flimm
źródło
16

Kiedy dodałem / zmodyfikowałem / usunąłem wiele plików (od ostatniego zatwierdzenia), lubię patrzeć na te modyfikacje w porządku chronologicznym.

Do tego używam:

  • Aby wyświetlić wszystkie pliki niestacjonarne:

    git ls-files --other --modified --exclude-standard
    
  • Aby uzyskać datę ostatniej modyfikacji dla każdego pliku:

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

Chociaż ruvim sugeruje w komentarzach :

xargs -0 stat -c '%y %n' -- 
  • Aby posortować je od najstarszych do nowszych:

    sort
    

Alias ​​ułatwia korzystanie z:

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'

Lub (krócej i wydajniej, dzięki Ruvim )

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

Na przykład:

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

Teraz mogę przejrzeć swoje modyfikacje, od najstarszych do nowszych.

VonC
źródło
Dlaczego nie użyć xargsi jednego połączenia z stat? Pełny git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
tekst jednoliniowy
@ruvim Dziękuję. Bardzo dobra sugestia. Zmodyfikowałem odpowiedź, dodając Twój komentarz, aby była bardziej widoczna.
VonC
4

Potrzebuję listy plików, które zmieniły zawartość między dwoma zatwierdzeniami (tylko dodane lub zmodyfikowane), więc użyłem:

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

Różne opcje filtra różnicowego z dokumentacji git diff :

diff-filter = [(A | C | D | M | R | T | U | X | B)… [*]]

Wybierz tylko pliki, które są Dodane (A), Skopiowane (C), Usunięte (D), Zmodyfikowane (M), Zmienione (R), mają zmieniony ich typ (np. Zwykły plik, łącze symboliczne, podmoduł,…), nie są scalone (U), są nieznane (X) lub ich parowanie zostało przerwane (B). Można użyć dowolnej kombinacji znaków filtru (w tym żadnego). Po dodaniu * (wszystko lub brak) do kombinacji wszystkie ścieżki są wybierane, jeśli istnieje plik, który spełnia inne kryteria porównania; jeśli nie ma pliku spełniającego inne kryteria, nic nie jest wybierane.

Również te wielkie litery można zmniejszyć, aby wykluczyć. Np. --Diff-filter = ad wyklucza dodane i usunięte ścieżki.

Jeśli chcesz wyświetlić również status (np. A / M), zmień --name-onlyna --name-status.

Pasza
źródło
3

Listę niestandowanych modyfikacji można uzyskać za pomocą git statusi greppolecenia jak poniżej. Coś takiego 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
źródło
Zauważ, że może to być używane tylko do zmian niestacjonarnych, więc nie jest przydatne w przypadku `` plików, które zmieniły się między dwoma zatwierdzeniami Git ''
John Vandenberg
2

Dzięki temu git showmożesz uzyskać podobny wynik. Aby spojrzeć na zatwierdzenie (jak wygląda na git logwidoku) z listą plików zawartych w, użyj:

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

Gdzie [commit-id_A]jest początkowe zatwierdzenie i [commit-id_B]ostatnie zatwierdzenie, niż chcesz pokazać.

Specjalna uwaga z ^symbolem. Jeśli tego nie umieścisz, informacja commit-id_A nie zostanie wdrożona.

Kurapika
źródło
1

Jeśli chcesz sprawdzić zmienione pliki, musisz zadbać o wiele drobnych rzeczy, na przykład, jeśli chcesz sprawdzić, który z plików został zmieniony, po prostu wpisz

stan git - pokaże pliki ze zmianami

jeśli chcesz wiedzieć, jakie zmiany mają zostać wprowadzone, możesz to sprawdzić na różne sposoby,

git diff - pokaże wszystkie zmiany we wszystkich plikach

dobrze jest tylko wtedy, gdy modyfikowany jest tylko jeden plik

a jeśli chcesz sprawdzić konkretny plik, użyj

git diff

Saurabh Pal
źródło