Jak pokazać wprowadzone zmiany?

Wystawiłem kilka zmian do zatwierdzenia; Jak mogę zobaczyć różnice wszystkich plików, które są wystawiane do następnego zatwierdzenia? Znam git status, ale chciałbym zobaczyć rzeczywiste diffy - nie tylko nazwy plików, które są wystawiane.

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

Git diff [--options] [--] [...]

Ten formularz ma na celu wyświetlenie zmian wprowadzonych względem indeksu (miejsce postoju dla następnego commita). Innymi słowy, różnice są tym, co mógłbyś powiedzieć gitowi, aby dalej dodawał do indeksu, ale nadal tego nie zrobiłeś. możesz wprowadzić te zmiany używając git-add(1).

Niestety, nie do końca rozumiem to. Musi być jakiś poręczny, jednowierszowy, dla którego mógłbym stworzyć alias, prawda?

Author: Community, 2009-10-19

14 answers

Powinno być:

git diff --cached

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

--staged i --cached nie wskazuje na HEAD, tylko na różnicę w stosunku do HEAD. Jeśli zdecydujesz się na użycie git add --patch (lub git add -p), --staged zwróci to, co jest wystawione.

 2729
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-28 23:35:53

Prosta grafika sprawia, że jest to jaśniejsze:

Simple Git diffs

Git diff

Pokazuje zmiany pomiędzy katalogiem roboczym a indeksem. Pokazuje to, co zostało zmienione, ale nie jest wystawiane dla commit.

Git diff --cached

Pokazuje zmiany pomiędzy indeksem a nagłówkiem (który jest ostatnim commitem w tej gałęzi). Pokazuje to, co zostało dodane do indeksu i wystawione do zatwierdzenia.

GIT diff HEAD

Pokazuje wszystkie zmiany między katalogiem roboczym a nagłówkiem (w tym zmiany w indeksie). Pokazuje wszystkie zmiany od ostatniego commita, niezależnie od tego, czy zostały wystawione dla commita, czy nie.

Również :

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

 1634
Author: Abizern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 17:11:50

Jeśli interesuje Cię wizualny widok side-by-side, narzędzie diffuse Visual diff może to zrobić. Pokaże nawet trzy szyby, jeśli niektóre, ale nie wszystkie zmiany są wystawione. W przypadku konfliktów będą nawet cztery szyby.

Zrzut ekranu diffuse z edycjami staged i unstaged

Wywołaj to za pomocą

diffuse -m

W Twojej kopii roboczej Git.

Według mnie najlepsza różnica wizualna, jaką widziałem od dekady. Ponadto, nie jest specyficzny dla Gita: współpracuje z wieloma innymi VC, w tym SVN, Mercurial, Bazar,..

Zobacz także: Show both stsing & working tree in Git diff?

 55
Author: krlmlr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Zauważ, że git status -v również pokazuje inscenizowane zmiany! (co oznacza, że musisz wprowadzić -- git add -- jakieś zmiany. Brak zmian w Ustawieniach, brak różnic z git status -v.
Robi to od Git 1.2.0, luty 2006)

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

I wkrótce stanie się jeszcze bardziej kompletna: zobacz " Show both stsing & working tree in Git diff?" (git 2.3.4+, Q2 2015):

git status -v -v
 52
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:48

Możesz użyć tego polecenia.

git diff --cached --name-only

Opcja --cached z git diff oznacza pobieranie plików z poczekalni, a opcja --name-only oznacza pobieranie tylko nazw plików.

 26
Author: Yash Patadia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 13:14:11

Do porównywania przestrzeni przejściowej z repozytorium(ostatni commit) użyj

 $git diff --staged

Komenda porównuje zmiany wystawione ($ git add fileName) z ostatnim zatwierdzeniem. Jeśli chcesz zobaczyć, co wystawiłeś, które trafią do Twojego następnego commita, możesz użyć git diff --stsinged. To polecenie porównuje wprowadzone zmiany z ostatnim zatwierdzeniem.

Do porównań roboczych i Stagingowych

$ git diff 

Polecenie porównuje to, co znajduje się w katalogu roboczym z tym, co znajduje się w obszarze przejściowym. Ważne jest, aby zauważ, że git diff sam w sobie nie pokazuje wszystkich zmian dokonanych od ostatniego zatwierdzenia - tylko zmiany, które są nadal nieaktywne. Jeśli Ustawiłeś wszystkie zmiany ($ git add fileName), git diff nie da ci żadnego wyjścia.

Ponadto, jeśli ustawisz plik ($ git add fileName), a następnie go edytujesz, możesz użyć git diff, aby zobaczyć zmiany w pliku, które są stagowane i zmiany, które nie są stagowane.

 24
Author: Goyal Vicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-20 11:25:09

UŻYWANIE WIZUALNEGO NARZĘDZIA DIFF

Domyślna odpowiedź (w wierszu poleceń)

Najlepsze odpowiedzi tutaj poprawnie pokazują, jak wyświetlić buforowane/zainscenizowane zmiany w Index:

$ git diff --cached

Lub $ git diff --staged, który jest aliasem.



Uruchamianie Visual Diff Tool zamiast

Domyślna odpowiedź wypluwa zmiany różnic w Git bash(np. w wierszu poleceń lub w konsoli). Dla tych, którzy preferują wizualną reprezentację różnic między poszczególnymi plikami, w git dostępny jest skrypt, który uruchamia wizualne narzędzie różnicujące dla każdego oglądanego pliku, zamiast wyświetlać je w wierszu poleceń, o nazwie difftool:

$ git difftool --staged

To zrobi to samo co git diff --staged, z tym wyjątkiem, że za każdym razem, gdy narzędzie diff jest uruchomione (tj. za każdym razem, gdy plik jest przetwarzany przez diff), uruchomi domyślne narzędzie wizualnego diff (w moim środowisku jest to kdiff3).

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



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

Dla wszystkich wizualnych różnic, git difftool będzie działać w miejsce dowolnego polecenia git diff, łącznie ze wszystkimi opcjami.

Na przykład, aby narzędzie Visual diff uruchomiło się bez pytania, czy zrobić to dla każdego pliku, Dodaj opcję -y (myślę, że zazwyczaj będziesz tego chciał!!):

$ git difftool -y --staged

W tym przypadku będzie ciągnąć każdy plik w visual diff tool, jeden po drugim, wyświetlając następny po zamknięciu narzędzia.

W tym celu należy sprawdzić, czy dany plik jest przechowywany w pliku Index:
$ git difftool -y --staged <<relative path/filename>>

Wszystkie opcje można znaleźć na stronie podręcznika:

$ git difftool --help


Konfiguracja narzędzia Visual Git

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

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

Lub zobacz stronę podręcznika difftool, aby dowiedzieć się, jak skonfigurować git do używania innego domyślnego różnicowania wizualnego narzędzie.



Przykład .gitconfig wpisy dla vscode jako narzędzie diff/merge

Część konfiguracji difftool polega na zmianie pliku .gitconfig, albo za pomocą komend git, które zmieniają go za kulisami, albo bezpośrednio edytując.

Możesz znaleźć .gitconfig w swoim katalogu domowym, na przykład ~ w Unixie lub normalnie c:\users\<username> W Windows).

Lub możesz otworzyć użytkownika .gitconfig w domyślnym edytorze Gita za pomocą git config -e --global.

Oto przykładowe wpisy w mojej globalnej użytkownik .gitconfig dla kodu VS jako narzędzia diff i merge:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe
 18
Author: LightCC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-12 00:08:17

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

git diff --staged
 17
Author: ML13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 11:36:41

Jeśli twoje zamiary to push-target zdalnej gałęzi repo, a twoje pierwsze przejście w dzienniku zmian commita było niekompletne, możesz poprawić instrukcję commita przed naciśnięciem w ten sposób.

Lokalnie

... wprowadzić pewne zmiany ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... przypomnij sobie więcej zmian, które nie zostały wymienione w commicie ...

Git diff origin / master # look at stsed but not pushed changes

... zmienić wystawione oświadczenie commit ...

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

git push
 8
Author: Marc Condon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jeśli masz więcej niż jeden plik ze zmianami, bardziej praktyczne może być użycie git add -i, następnie wybierz 6: diff i na koniec wybierz interesujący Cię plik(y).

 7
Author: Fred Schoen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 14:30:29

DomyślnieGit diff jest używany do pokazania zmian, które nie są dodawane do listy zaktualizowanych plików git. Ale jeśli chcesz pokazać zmiany, które są dodawane lub stagowane, musisz podać dodatkowe opcje, które poinformują Gita, że jesteś zainteresowany stagged lub added files diff .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Przykład

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Po dodaniu plików, nie możesz użyć domyślnego 'git diff'.Musisz zrobić tak: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;
 6
Author: Deepak Dixit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 06:30:23

git gui i {[1] } są narzędziami graficznymi, które umożliwiają przeglądanie i manipulowanie indeksem. Oba zawierają proste wizualne dyfuzory dla plików wystawionych, a git-cola mogą również uruchomić bardziej wyrafinowane narzędzie różnicowania wizualnego side-by-side.

Zobacz moją odpowiedź na Jak usunąć plik z indeksu w git?, a także ten oficjalny katalog klientów Git - GUI .

 2
Author: Brent Bradburn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:44

Pomyśl także o gitk narzędziu, dostarczonym z Gitem i bardzo przydatnym, aby zobaczyć zmiany

 0
Author: sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 10:40:51

--cached nie zadziałało dla mnie, ... gdzie, zainspirowany git log

git diff origin/<branch>..<branch> tak.

 0
Author: ergohack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-24 19:52:11