Jak wyświetlić tylko nazwy plików, które zmieniły się między dwoma zatwierdzeniami?

1952

Mam kilka zmian w repozytorium. Chcę zobaczyć listę plików zmienioną między dwoma zatwierdzeniami - z SHA1 na SHA2.

Jakiego polecenia powinienem użyć?

Shawn
źródło
3
Dla zatwierdzenia i jego elementu nadrzędnego: stackoverflow.com/questions/424071/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

2662
git diff --name-only SHA1 SHA2

gdzie wystarczy podać wystarczającą ilość SHA, aby zidentyfikować zatwierdzenia. Możesz także zrobić na przykład

git diff --name-only HEAD~10 HEAD~5

aby zobaczyć różnice między dziesiątym ostatnim zatwierdzeniem a piątym ostatnim (lub tak).

Piotr
źródło
151
Działa to również w przypadku git show. git show --name-only SHA1.
August Lilleaas,
78
git diff --name-status [TAG|SHA1]pokazuje, jakie operacje wykonano również na plikach
Rebbot
2
możesz także zrobić: git diff - tylko nazwa HEAD @ {3} HEAD @ {0} dla dokładnych zatwierdzeń, które chcesz porównać.
b01,
7
@ AugustLilleaas faktycznie korzystający z show pokaże tylko 2 konkretne zmiany, jeśli masz między nimi 2, zostaną one pominięte
Chris
4
Jak wspomniano poniżej, git diff --name-statuswydaje się , że nie chce wyświetlać dodanych plików. @sschuberth wskazał git show, który wydaje się działać prawidłowo dla mnie git show --pretty=format: --name-status. Samo robienie git show --name-statusdaje trochę więcej informacji, ale wciąż jest ładne i gęste ... to będzie moje nowe polecenie goto;)
travc
416
git diff --name-status [SHA1 [SHA2]]

jest jak - - tylko nazwa, z tym wyjątkiem, że otrzymujesz prosty prefiks informujący o tym, co się stało z plikiem (zmodyfikowany, usunięty, dodany ...)

git log --name-status --oneline [SHA1..SHA2]

jest podobny, ale zatwierdzenia są wyświetlane po komunikacie zatwierdzenia, dzięki czemu można zobaczyć, kiedy plik został zmieniony.

  • jeśli jesteś zainteresowany tym, co stało się z niektórymi plikami / folderami, możesz dołączyć -- <filename> [<filename>...]do git logwersji.

  • jeśli chcesz zobaczyć, co się stało dla pojedynczego zatwierdzenia, nazwij to SHA1, a następnie zrób
    git log --name-status --oneline [SHA1^..SHA1]

Flagi statusu pliku:
M zmodyfikowany - Plik został zmodyfikowany
C kopiuj-edytuj - Plik został skopiowany i zmodyfikowany
R Zmień nazwę-edytuj - Plik został zmieniony i zmodyfikowany
A Dodano - Plik został dodany
D usunięty - Plik został usunięty
U unmerged - Plik ma konflikty po scaleniu

artfulrobot
źródło
Tak się składa, że ​​powiedziałem git diff --name-status i dało to „dodany plik”.
aartist
1
W przypadku git log musi mieć dwie kropki między SHA, jak SHA1..SHA2, a druga SHA nie jest opcjonalna, więc powinna wyglądać tak: git log - nazwa-status --online [SHA1 .. SHA2]
twasbrillig
Czy istnieje sposób na wykluczenie niektórych plików / niektórych typów plików?
sierpień
3
Ta --relative[=<path>]opcja może ci pomóc, nie jestem pewien. W przeciwnym razie zawsze będzie | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot
80

Wygląda na to, że nikt nie wspomniał o przełączniku --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Istnieje również --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

i --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
źródło
4
Przyjęta odpowiedź jest poprawna, ale jest to bardzo przydatne i daje trochę dodatkowych informacji. Dzięki!
kontur
2
Zgadzam się, że jest to bardziej użyteczna odpowiedź, ponieważ zawiera statystyki różnic.
Internetross
52

Ale żeby zobaczyć, jak zmieniły się pliki między twoją gałęzią a jej wspólnym przodkiem z inną gałęzią (powiedz origin / master):

git diff --name-only `git merge-base origin/master HEAD`
Tim James
źródło
1
To było naprawdę przydatne! Chciałbym móc po prostu powiedzieć git diffstatus masterlub coś podobnego, co wyzwala powyższe.
oma
3
Lub git show --pretty=format: --name-only origin/master...
sschuberth
Być może nie będziesz w stanie zrobić z niego aliasu git, ale zdecydowanie możesz umieścić go w swoim .bashrc.
Fred
3
Lub jeszcze prościej: git diff --name-only HEAD...master(zwróć uwagę na trzy kropki). Szczegółowe wyjaśnienie znajduje się tutaj .
ostrokach
1
Wygląda na przeważnie poprawną odpowiedź! Prosty git diff --name-only master..branchnie odpowiada liście PR github. W ten sposób bardziej precyzyjny. Ale w każdym razie mam 173 pliki w chan kontra 171 w github PR. (bez merge-basemam 228 vs 171)
x'ES
21

Aby uzupełnić odpowiedź @ artfulrobot, jeśli chcesz pokazać zmienione pliki między dwoma oddziałami:

git diff --name-status mybranch..myotherbranch

Uważaj na pierwszeństwo. Jeśli najpierw umieścisz nowszą gałąź, wyświetli się ona jako usunięta, a nie dodana.

Dodanie greppuszki uściśla rzeczy:

git diff --name-status mybranch..myotherbranch | grep "A\t"

To pokaże tylko dodane pliki myotherbranch.

Max MacLeod
źródło
4
Regeksy są fajne i naprawdę mogą zrobić prawie wszystko. W tym przypadku jest jednak także --diff-filterta funkcja, która daje natywną funkcjonalność, co oznacza mniejszą szansę na niepoprawne wyniki (np. Fałszywe alarmy)
Jasper
8

Dodaj poniższy alias do swojego ~/.bash_profile, a następnie uruchom source ~/.bash_profile; teraz, kiedy chcesz zobaczyć zaktualizowane pliki w ostatnim zatwierdzeniu, uruchom, showfilesz repozytorium git.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
źródło
2
Lub git config --global alias.showfiles 'show --pretty="format:" --name-only'zrobić git showfiles.
cgmb
7

Spowoduje to wyświetlenie zmian w plikach:

git diff --word-diff SHA1 SHA2
Julio Marins
źródło
5

Zwróć też uwagę, jeśli chcesz zobaczyć zmienione pliki między ostatnim zatwierdzeniem a poprzednim. Działa to dobrze:git show --name-only

Parris
źródło
3

Użyj git log --pretty = oneline> C: \ nazwa_pliku.log

który rejestruje tylko oneline (--pretty = oneline), który jest nazwą zmienionego pliku. Również zapisuje wszystkie szczegóły w pliku wyjściowym.

Agni
źródło
git log --pretty=onelinedaje mi tylko SHA i komunikat zatwierdzenia za pomocą git 2.10.1
cholera
3

Jak powiedział artfulrobot w swojej odpowiedzi:

git diff --name-status [SHA1 [SHA2]]

Mój przykład:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Jaime Montoya
źródło
3

Tylko dla kogoś, kto musi skupić się tylko na plikach Java, oto moje rozwiązanie:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
K. Symbol
źródło
1

Poniższe działa dla mnie dobrze:

$ git show --name-only --format=tformat: SHA1..SHA2

Można go również użyć z jednym zatwierdzeniem:

git show --name-only --format=tformat: SHA1

który jest przydatny do użycia w Jenkins, gdzie masz Listę SHA zmian i chcesz iterować nad nimi, aby zobaczyć, które pliki zostały zmienione.

Jest to podobne do kilku powyższych odpowiedzi, ale użycie tformat:zamiast format:usuwa przestrzeń separatora między zatwierdzeniami.

blindsnowmobile
źródło
0

Na podstawie git diff --name-statusnapisałem rozszerzenie git git-diffview, które renderuje hierarchiczny widok drzewa tego, co zmieniło się między dwiema ścieżkami.

Bernard Opic
źródło