Zainscenizowałem kilka zmian do zatwierdzenia; jak mogę zobaczyć różnicę wszystkich plików, które są przenoszone do następnego zatwierdzenia? Jestem świadomy statusu git , ale chciałbym zobaczyć rzeczywiste różnice - nie tylko nazwy plików, które są inscenizowane.
Widziałem, że strona podręcznika git-diff (1) mówi
git diff [--options] [-] […]
Ten formularz służy do przeglądania dokonanych zmian w stosunku do indeksu (obszar przejściowy dla następnego zatwierdzenia). Innymi słowy, różnice są co mógłby powiedzieć git kolejny dodatek do indeksu, ale nadal nie ma. Możesz wprowadzić te zmiany za pomocą git-add (1).
Niestety nie mogę tego zrozumieć. Musi być jakiś przydatny liniowiec, dla którego mógłbym stworzyć alias, prawda?
git status -v
też działa. Zobacz moją odpowiedź poniżejless
, jak w:git status -v | less
- porcje do zarządzania :)Odpowiedzi:
Powinno to być po prostu:
--cached
oznacza pokazanie zmian w pamięci podręcznej / indeksie (tj. zmiany etapowe) w stosunku do prąduHEAD
.--staged
jest synonimem--cached
.--staged
i--cached
nie wskazujeHEAD
, tylko różnica w odniesieniu doHEAD
. Jeśli wybierzesz opcję zatwierdzenia za pomocągit add --patch
(lubgit add -p
),--staged
zwróci to, co zostało ustawione.źródło
git diff --name-only --cached
dla posta na stackoverflow.com/a/4525025/255187git difftool --staged
zamiast zamiastgit diff --staged
uruchamiać domyślne narzędzie wizualnego porównywania dla każdego pliku.difftool
można zastąpićdiff
dowolnymi innymi argumentami.git difftool --staged -d
do różnicowania dwóch katalogów w narzędziu wizualnym zamiast jednego pliku na raz.git diff --cached -- <stagedfile>
Prosta grafika czyni to jaśniejszym:
git diff
Pokazuje zmiany między katalogiem roboczym a indeksem. Pokazuje to, co zostało zmienione, ale nie jest wystawiane dla zatwierdzenia.
git diff --cached
Pokazuje zmiany między indeksem a HEAD (który jest ostatnim zatwierdzeniem w tej gałęzi). To pokazuje, co zostało dodane do indeksu i ustawione dla zatwierdzenia.
git diff HEAD
Pokazuje wszystkie zmiany między katalogiem roboczym a HEAD (w tym zmiany w indeksie). Pokazuje wszystkie zmiany od ostatniego zatwierdzenia, bez względu na to, czy zostały one wprowadzone w życie, czy nie.
Również :
365Git zawiera nieco więcej szczegółów .
źródło
foo.c
i nie wykonujesz ichgit add foo.c
, niefoo.c
ma tego w indeksie ; nie jest wystawiany na zatwierdzenie. Gdybygit diff foo.c
naiwnie porównać do pracyfoo.c
z indeksem, musiałby pokazać gigantyczną różnicę między pustym / nieistniejącym plikiem a całą zawartościąfoo.c
. Tak więc, gdy plik nie istnieje w indeksie,git diff
wycofuje się dla tego pliku przy użyciuHEAD
kopii.HEAD
na której wprowadzane są zmiany etapowe. Pamiętaj, że Git działa poprzez zapisywanie zmian, a nie przez zapisywanie całych plików. Gdy wykonujesz etap, plik przechowuje tylko wprowadzone zmiany. Jeśli indeks jest pusty, jak sugerujesz, nie wiedziałby, jak zapisać zmiany w indeksie i musiałby zapisać cały plik jako „nowo dodany” - co jest złe.HEAD
będą miały niezmienioną wersjęfoo.c
pliku (nie są kopiami fizycznymi, ale tylko logicznymi kopiami 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 robisz togit diff
na całkowicie nieetapowanym,foo.c
to tak naprawdę nie wraca doHEAD
tego, że robi różnicę z indeksem (który akurat zawiera dokładnie taką samą wersję pliku jak toHEAD
robi). Więc grafika jest poprawna.git status -v
jest równoważnygit diff --cached
(plusgit status
oczywiście)Jeśli interesuje Cię wizualny widok obok siebie, narzędzie do rozproszenia wizualnego porównania może to zrobić. Pokażą nawet trzy panele, jeśli zostaną wprowadzone niektóre, ale nie wszystkie zmiany. W przypadku konfliktu będą nawet cztery panele.
Wywołaj to za pomocą
w kopii roboczej Git.
Jeśli mnie zapytasz, najlepsza grafika różni się od dekady. Ponadto nie jest specyficzny dla Git: współpracuje z wieloma innymi VCS, w tym SVN, Mercurial, Bazaar, ...
Zobacz także: Pokazywać drzewo etapowe i robocze w git diff?
źródło
brew install diffuse
działa w systemie OS X. Nie wyświetla 3 okienek, jeśli zarówno zmiany niestacjonarne, jak i etapowe - czy miałeś na myśli zmiany, których jeszcze nie ma w indeksie?Pamiętaj, że pokazuje
git status -v
także zmiany etapowe! (co oznacza, że musisz mieć inscenizację -git add
- niektóre zmiany. Bez zmian etapowych, bez różnicgit status -v
.Robi to od Git 1.2.0, luty 2006 )
W swojej długiej formie (domyślnie)
git status
ma nieudokumentowaną opcję „szczegółową”, która faktycznie wyświetla różnicę między HEAD a indeksem.I wkrótce będzie jeszcze bardziej kompletny: patrz „ Pokazywanie drzewa etapowego i roboczego w git diff? ” (Git 2.3.4+, II kw. 2015):
źródło
git diff HEAD
git status -vv
obejmuje również to, cogit diff HEAD
robi.git version 1.8.3.1
. Wiem, że jest stary, ale jeśli to możliwe, zwróć uwagę na datę wprowadzenia tej flagi.git status -v
jest starszy ( github.com/git/git/commit/… , git 1.2.0, luty 2006!). Zauważ, że wyświetla różnicę między indeksem aHEAD
: jeśli dodałeś coś do indeksu (niegit add
), togit status -v
nie wyświetliłby żadnej różnicy.git status -v -v
jest nowszy (Git 2.3.4, marzec 2015)git diff -v
.Możesz użyć tego polecenia.
--cached
Opcjagit diff
znaczy dostać wystawił pliki, a--name-only
środki opcja dostać tylko nazwy plików.źródło
--name-only
opcją równie dobrze mógłbym użyć zwykłegogit status
Od wersji 1.7 i nowszych powinno to być:
źródło
UŻYWANIE NARZĘDZIA WIZUALNEGO DIFF
Domyślna odpowiedź (w wierszu poleceń)
Najważniejsze odpowiedzi tutaj poprawnie pokazują, jak wyświetlić buforowane / przemieszczane zmiany w
Index
:lub
$ git diff --staged
który jest pseudonimem.Zamiast tego uruchamia się narzędzie Visual Diff
Domyślna odpowiedź wypluwa zmiany w git bash (tj. W wierszu poleceń lub w konsoli). Dla tych, którzy wolą wizualną reprezentację różnic między plikami etapowymi, w git dostępny jest skrypt, który uruchamia wizualne narzędzie różnicowania dla każdego oglądanego pliku, zamiast pokazywać je w wierszu poleceń, o nazwie
difftool
:Robi to tak samo, jak za
git diff --staged
każdym razem, gdy uruchamiane jest narzędzie diff (tj. Za każdym razem, gdy plik jest przetwarzany przez diff), uruchomi domyślne narzędzie wizualne diff (w moim środowisku jest to kdiff3 ).Po uruchomieniu narzędzia skrypt git diff zatrzyma się do momentu zamknięcia narzędzia wizualnego porównywania. Dlatego musisz zamknąć każdy plik, aby zobaczyć następny.
Zawsze możesz używać
difftool
zamiastdiff
poleceń gitDla wszystkich twoich potrzeb wizualnego różnicowania,
git difftool
będzie działać zamiast każdegogit diff
polecenia, w tym wszystkich opcji.Na przykład, aby uruchomić wizualne narzędzie do porównywania bez pytania, czy zrobić to dla każdego pliku, dodaj
-y
opcję (myślę, że zwykle będziesz tego chciał !!):W takim przypadku będzie pobierał każdy plik w wizualnym narzędziu porównywania, jeden po drugim, wyświetlając następny plik po zamknięciu narzędzia.
Lub spojrzeć na różnicę określonego pliku, który jest umieszczony w
Index
:Wszystkie opcje znajdziesz na stronie man:
Konfigurowanie narzędzia Visual Git
Aby użyć wizualnego narzędzia git innego niż domyślny, użyj
-t <tool>
opcji:Lub zobacz stronę podręcznika difftool, aby dowiedzieć się, jak skonfigurować git, aby używał innego domyślnego narzędzia do wizualnego porównywania.
Przykładowe
.gitconfig
wpisy dla vscode jako narzędzia porównywania / scalaniaCzęść konfiguracji difftool obejmuje zmianę
.gitconfig
pliku, albo za pomocą komend git, które zmieniają go za sceną, albo bezpośrednio go edytować.Możesz go znaleźć
.gitconfig
w swoim katalogu domowym, na przykład~
wc:\users\<username>
systemie Unix lub normalnie w systemie Windows).Lub możesz otworzyć użytkownika
.gitconfig
w domyślnym edytorze Git za pomocągit config -e --global
.Oto przykładowe wpisy mojego globalnego użytkownika
.gitconfig
dla VS Code jako narzędzia do porównywania i scalania:źródło
Dla porównania obszaru pomostowego vs repozytorium (ostatnie zatwierdzenie)
Polecenie porównuje
$ git add fileName
zmiany etapowe ( ) z ostatnim zatwierdzeniem. Jeśli chcesz zobaczyć, co zainscenizowałeś, co przejdzie do następnego zatwierdzenia, możesz użyć git diff --staged. To polecenie porównuje zmiany etapowe z ostatnim zatwierdzeniem.Dla porównania Porównanie pracy i pracy
Polecenie porównuje zawartość katalogu roboczego z tym, co znajduje się w obszarze testowym. Ważne jest, aby pamiętać, że git diff sam w sobie nie pokazuje wszystkich zmian dokonanych od czasu ostatniego zatwierdzenia - tylko zmiany, które są wciąż nieetapowane. Jeśli wprowadziłeś wszystkie zmiany (
$ git add fileName
), git diff nie da ci żadnych wyników.Ponadto, jeśli wykonasz etap pliku (
$ git add fileName
), a następnie go edytujesz, możesz użyć git diff, aby zobaczyć zmiany w pliku, które są przemieszczane i zmiany, które nie są przenoszone.źródło
$ git diff
” . Jestem prawie pewien, żegit diff
porównuje między Working a Staging. Zobacz stackoverflow.com/a/1587952Jeśli masz zamiar wycelować w gałąź zdalnego repo, a twoje pierwsze przejście w dzienniku zmian zatwierdzenia było niepełne, możesz poprawić instrukcję zatwierdzenia przed wypychaniem w ten sposób.
Lokalnie
... dokonaj zmian ...
... przywołuje więcej zmian niewymienionych w commit ...
git diff origin / master # spójrz na zmiany etapowe, ale nie wypchnięte
... zmienić etapowe oświadczenie zatwierdzenia ...
źródło
Jeśli masz więcej niż jeden plik ze zmianami etapowymi, bardziej praktyczne może być użycie
git add -i
, a następnie wybranie6: diff
i wybranie pliku (ów), który Cię interesuje.źródło
Domyślnie git diff służy do pokazywania zmian, które nie są dodawane do listy zaktualizowanych plików git. Ale jeśli chcesz, aby pokazać zmiany, które są dodawane lub stagged wtedy trzeba zapewnić dodatkowe opcje, które pozwolą git wie, że jesteś zainteresowany stagged lub dodanych plików diff .
Przykład
Po dodaniu plików nie można użyć domyślnej opcji „git diff”. Musisz wykonać następujące czynności: -
źródło
git gui
igit-cola
są narzędziami graficznymi, które pozwalają przeglądać indeks i manipulować nim. Oba zawierają proste wizualne różnice dla plików przemieszczanych, agit-cola
także mogą uruchamiać bardziej zaawansowane narzędzie wizualnego porównywania.Zobacz moją ściśle powiązaną odpowiedź na stronie Jak usunąć plik z indeksu w git? , a także ten oficjalny katalog klientów Git - GUI .
źródło
Pomyśl także o
gitk
narzędziu, wyposażonym w git i bardzo przydatnym, aby zobaczyć zmianyźródło