Pytanie Jak wyświetlić zmiany, które zostały zainscenizowane?


Zrobiłem kilka zmian, które należy popełnić; jak mogę zobaczyć różnicę wszystkich plików, które są wystawiane na następny commit? jestem swiadomy status gita, ale chciałbym zobaczyć rzeczywiste różnice - nie tylko nazwy plików, które są wystawiane.

Widziałem, że git-diff (1) strona podręcznika mówi

git diff [--options] [-] [...]

Ta forma służy do przeglądania zmian dokonanych względem indeksu (obszar przemieszczania dla następnego zatwierdzenia). Innymi słowy, różnice są tym, co ty mógłby powiedz git, aby dalej dodawał indeks, ale wciąż go nie masz. Możesz wprowadzić te zmiany za pomocą git-add (1).

Niestety nie mogę tego zrozumieć. Musi być jakaś przydatna jedna liniówka, dla której mógłbym stworzyć alias, prawda?


1697
2017-10-19 09:57


pochodzenie


git status -v działa też. Widzieć moja odpowiedź poniżej - VonC
@VonC Zawsze używam tego, ale wysyłam do niego less, jak w: git status -v | less - poręczne kawałki :) - Mr Office


Odpowiedzi:


Powinno to być po prostu:

git diff --cached

--cached oznacza pokazywanie zmian w pamięci podręcznej / indeksie (tj. zmian etapowych) względem bieżącego HEAD. --staged jest synonimem --cached.

--staged i --cached nie wskazuje HEAD, tylko różnica w stosunku do HEAD. Jeśli wybierasz, co chcesz użyć git add --patch (lub git add -p), --staged zwróci to, co jest wystawiane.


2102
2017-10-19 10:07



Jeśli chcesz tylko nazwy plików, wykonaj następujące czynności git diff --name-only --cached na post na stackoverflow.com/a/4525025/255187 - Michel Hébert
Użyj tego z git difftool --staged zamiast git diff --staged aby uruchomić domyślne narzędzie wizualne dla każdego pliku. difftool można zastąpić diffz dowolnymi innymi argumentami. - LightCC


Prosta grafika czyni to wyraźniejszym:

Simple Git diffs

git diff

Pokazuje zmiany między katalogiem roboczym a indeksem. Pokazuje to, co zostało zmienione, ale nie jest wystawiane na zatwierdzenie.

git diff --cached

Pokazuje zmiany między indeksem a HEAD (który jest ostatnim zatwierdzeniem w tym oddziale). Pokazuje to, co zostało dodane do indeksu i wystawiono na zatwierdzenie.

git diff HEAD

Pokazuje wszystkie zmiany między katalogiem roboczym a HEAD (który zawiera zmiany w indeksie). To pokazuje wszystkie zmiany od ostatniego zatwierdzenia, niezależnie od tego, czy zostały one wystawione na zatwierdzenie, czy nie.

Również:

Jest trochę więcej szczegółów na temat 365Git.


1411
2017-10-24 21:05



To naiwne, obawiam się (jak to zwykle bywa z jakimkolwiek wyjaśnieniem git). Jeśli masz lokalne modyfikacje foo.c i nie wykonuj git add foo.c, następnie foo.c jest nie w indeksie; nie jest wystawiony na zatwierdzenie. Gdyby git diff foo.c naiwnie w porównaniu do pracy foo.c do indeksu, musiałby pokazać gigantyczne różnice pomiędzy pustym / nieistniejącym plikiem a całą zawartością foo.c. W rzeczywistości, gdy plik nie istnieje w indeksie, git diff cofa się, dla tego pliku, przy korzystaniu z HEAD Kopiuj. - Kaz
@Kaz ściśle mówiąc, indeks jest nie pusty łupek. To wirtualna kopia HEAD na których stosowane są zmiany etapowe. Pamiętaj, że Git działa poprzez zapisywanie zmian, a nie przez zapisywanie całych plików. Kiedy przesuwasz plik, przechowuje on tylko wprowadzone zmiany. Jeśli indeks jest pusty, tak jak sugerujesz, nie wiedziałby, jak zapisać zmiany w indeksie i musiałby zapisać cały plik jako "nowo dodany" - co jest błędne. - ADTC
@Kaz Zarówno indeks, jak i HEAD będzie mieć niezmienioną wersję foo.c plik (nie są to fizyczne kopie, ale tylko logiczne kopie dla ciebie i dla mnie, dla Git są one tym samym strumieniem danych, do którego odnosi się każde zatwierdzenie, które kiedykolwiek dotyczyło tego pliku). Więc kiedy to zrobisz git diff na całkowicie niezarejestrowany foo.c tak naprawdę nie cofa się HEAD to faktycznie robi różnicę z indeksem (który zdarza się zawierać dokładnie taką samą wersję pliku jak HEAD robi). Więc grafika jest poprawna. - ADTC
Cześć, chciałbym wiedzieć, co to znaczy "indeks"w tym kontekście? Dzięki! - Gab是好人
@Abizern Więc indeks to zmiany etapowe? - Gab是好人


Jeśli byłbyś zainteresowany wizualnym widokiem z boku, to rozproszony narzędzie wizualne diff może to zrobić. Pokaże nawet trzy panele, jeśli zostaną dokonane niektóre, ale nie wszystkie zmiany. W przypadku konfliktów będą nawet cztery tafle.

Screenshot of diffuse with staged and unstaged edits

Wywołaj to przy pomocy

diffuse -m

w twojej kopii roboczej Git.

Jeśli pytasz mnie, najlepsze wizualne różnice widziałem od dekady. Ponadto nie jest to specyficzne dla Git: współpracuje z wieloma innymi VCS, w tym SVN, Mercurial, Bazaar, ...

Zobacz też: Pokazać drzewa etapowe i robocze w git diff?


52
2018-03-18 07:22



Dzięki, wygląda to na ładne narzędzie. Stwierdziłem, że Meld jest najlepszym wizualnym narzędziem do porównywania Linuksa, ale brakowało mi możliwości odróżniania tekstu ze schowka - Meld wymaga plików do wprowadzenia. Diffuse umożliwia to, a także ręczne wyrównanie. Wypróbuję to przez chwilę. - Drew Noakes
Zepsuty link do diffuse.sourceforge.net, użyj sourceforge.net/projects/diffuse Na razie. - user1133275
brew install diffuse działa w systemie OS X. Nie wyświetla 3 paneli, jeśli zmiany nie są przeprowadzane i etapowe - czy chodziło ci o zmiany, których jeszcze nie ma w indeksie? - Brent Faust
Którą wersję rozproszenia masz? Tak - jeśli dodasz plik, a następnie zmienisz go lokalnie, powinien on zawierać trzy okienka. - krlmlr
Możesz także skonfigurować rozproszony jako domyślne difftool i użyj tego wbudowanego mechanizmu / narzędzia / aliasu, aby go uruchomić. Zobacz moją odpowiedź tutaj: <stackoverflow.com/a/45684512/6501141>; - LightCC


Zauważ, że git status -v  również pokazuje zmiany etapowe! (czyli musisz wystawić - git add -- Trochę zmian. Brak zmian etapowych, brak różnic git status -v.
Robi to od tego czasu Git 1.2.0, luty 2006)

W swojej długiej formie (domyślnie), git status ma nieudokumentowaną opcję "verbose", która wyświetla różnicę między HEAD a indeksem.

I stanie się jeszcze bardziej kompletny: patrz "Pokazać drzewa etapowe i robocze w git diff?"(git 2.3.4+, Q2 2015):

git status -v -v

38
2017-08-31 10:05



Ostatnia linia powinna być git diff HEAD - artur
@artur dlaczego? Punktem wyjścia jest wspomnieć o tym git status -vv obejmuje również to, co git diff HEAD robi. - VonC
Nie działa git version 1.8.3.1. Wiem, że jest stary, ale jeśli to możliwe, zwróć uwagę, kiedy ta flaga została wprowadzona. - onebree
@onebree 1.8.3.1 to czerwiec 2013, naprawdę stary. Ale git status -v jest starszy (github.com/git/git/commit/..., git 1.2.0, luty 2006!). Zauważ, że wyświetla różnicę między indeks i HEAD: jeśli dodałeś coś do indeksu (nr git add), następnie git status -v nie wyświetla żadnych różnic. git status -v -v jest nowszy (Git 2.3.4, marzec 2015) - VonC
@VonC to był mój błąd ... zrobiłem git diff -v. - onebree


Możesz użyć tego polecenia.

git diff --cached --name-only

The --cachedopcja git diff oznacza uzyskiwanie plików etapowych i --name-only opcja oznacza uzyskanie tylko nazw plików.


23
2017-07-19 17:39



Edytuj za pomocą dodatkowych informacji. Tylko kod i odpowiedź "spróbuj tego" są odradzane, ponieważ nie zawierają treści do wyszukiwania i nie wyjaśniają, dlaczego ktoś powinien "spróbować tego". - abarisone


Od wersji 1.7 i późniejszych powinno to być:

git diff --staged

15
2017-08-14 23:33





KORZYSTANIE Z NARZĘDZIA WIZUALNEGO DYF

Domyślna odpowiedź (w linii poleceń)

Najlepsze odpowiedzi tutaj poprawnie pokazują, jak wyświetlić zmiany w pamięci podręcznej / etapowej w Index:

$ git diff --cached

lub $ git diff --staged który jest pseudonimem.


Uruchamianie narzędzia Visual Diff zamiast tego

Domyślna odpowiedź wypluje zmiany różnic w bicie git (tj. W wierszu poleceń lub w konsoli). Dla tych, którzy wolą wizualną reprezentację zróżnicowanych różnic pliku, dostępny jest skrypt w git, który uruchamia wizualne narzędzie porównania dla każdego wyświetlanego pliku, zamiast pokazywania ich w wierszu poleceń, nazywanym difftool:

$ git difftool --staged

To zrobi to samo, co git diff --staged, za wyjątkiem każdego uruchomienia narzędzia diff (tj. za każdym razem, gdy plik jest przetwarzany przez diff), uruchomi domyślne narzędzie do porównywania wizualnego (w moim środowisku jest to kdiff3).

Po uruchomieniu narzędzia skrypt diff git zostanie wstrzymany do momentu zamknięcia narzędzia porównywania wizualnego. Dlatego musisz zamknąć każdy plik, aby zobaczyć następny.


Zawsze możesz używać difftool zamiast diff w poleceniach git

Dla wszystkich Twoich potrzeb w zakresie różnic wizualnych, git difftool będzie działać w miejsce dowolnego git diff polecenie, w tym wszystkie opcje.

Na przykład, aby uruchomić wizualne narzędzie diff bez pytania, czy zrobić to dla każdego pliku, dodaj -y opcja (myślę, że zwykle będziesz tego chciała !!):

$ git difftool -y --staged

W takim przypadku każdy plik zostanie pobrany z narzędzia porównywania wizualnego, po jednym na raz, po następnym zamknięciu narzędzia.

Lub spojrzeć na różnicę określonego pliku, który jest wystawiony w Index:

$ git difftool -y --staged <<relative path/filename>>

Wszystkie opcje znajdują się na stronie podręcznika:

$ git difftool --help


Konfigurowanie narzędzia Visual Git

Aby użyć wizualnego narzędzia git innego niż domyślne, użyj -t <tool> opcja:

$ git difftool -t <tool> <<other args>>

Lub zobacz stronę podręcznika difftool, aby dowiedzieć się, jak skonfigurować git, aby używał innego domyślnego narzędzia do porównywania wizualnego.


12
2018-03-14 14:30



W przypadku PO podejrzewam, że jest to najlepsza odpowiedź. - Matt Ruwe


Jeśli masz więcej niż jeden plik ze zmianami etapowymi, może być bardziej praktyczny w użyciu git add -i, a następnie wybierz 6: diff, a na koniec wybierz plik (pliki), które Cię interesują.


7
2017-10-14 18:32





Jeśli twoje intencje mają na celu skierowanie do zdalnego oddziału repo, a twoje pierwsze przejście w dzienniku zmian zatwierdzania było niepełne, możesz poprawić instrukcję zatwierdzania przed naciśnięciem tego przycisku.

Lokalnie

... wprowadź pewne zmiany ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... przywołać więcej zmian niewymienionych w commit ...

git diff origin / master # spójrz na zmiany etapowe, ale nie pchane

... zmień wycofane oświadczenie commit ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7
2018-02-25 21:16