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


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


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


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

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`

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.


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'

2
Lub git config --global alias.showfiles 'show --pretty="format:" --name-only'zrobić git showfiles.
cgmb


5

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


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.


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

3

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

 git diff --name-status SHA1 SHA2 | grep '\.java$'

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.