Jak wyświetlić różnicę plików w git przed zatwierdzeniem

443

Często mi się to zdarza:

Pracuję nad kilkoma powiązanymi zmianami jednocześnie w ciągu jednego lub dwóch dni, a kiedy nadszedł czas na zatwierdzenie, w końcu zapominam o zmianach w określonym pliku. (To tylko osobiste repozytorium git, więc nie mam nic przeciwko, aby mieć więcej niż jedną aktualizację w zatwierdzeniu.)

Czy jest jakiś sposób, aby wyświetlić podgląd zmian między moim plikiem lokalnym, który ma zostać zaewidencjonowany, a ostatnim zatwierdzeniem dla tego pliku?

Coś jak:

git diff --changed /myfile.txt

I wydrukuje coś takiego:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

W ten sposób mogłem szybko zobaczyć, co zrobiłem w tym pliku od ostatniego wpisu.

Sos McBoss
źródło

Odpowiedzi:

732

Jeśli chcesz zobaczyć to, czego jeszcze nie git addedytowałeś:

git diff myfile.txt

lub jeśli chcesz zobaczyć już dodane zmiany

git diff --cached myfile.txt
Bursztyn
źródło
20
sprawdzić git add -p. Przejrzyj każdą zmianę, wybiórczo zatwierdzaj zmiany na scenie, przerwij w dowolnym momencie, jeśli zmienisz zdanie, a nawet edytuj fragment. Nigdy git addbez tego nie mam .
Kyle Baker
2
jak możesz wyjść z pliku?
Kopnięcie Buttowskiego
3
@Kliknij Spróbuj nacisnąćq
wjandrea
Ponadto, jeśli chcesz usunąć głupie prefiksy „a /” i „b /” w wyniku porównania, możesz ustawić git config --global diff.noprefix true.
Liang
64
git diff HEAD file

pokaże ci zmiany dodane do twojego stołu roboczego od ostatniego zatwierdzenia. Wszystkie zmiany (etapowe lub nie etapowe) zostaną wyświetlone.

ouah
źródło
1
Twoje rozwiązanie działa. Ale jestem trochę zdezorientowany. HEAD wskazuje na ostatni numer zatwierdzenia. Kiedy dodajemy, indeks katalogu roboczego jest aktualizowany, a nie HEAD. Jak to pokazuje różnicę.
Mav55
17

Aby sprawdzić lokalne różnice:

git diff myfile.txt

lub możesz użyć narzędzia różnicowego (na wypadek, gdybyś chciał cofnąć niektóre zmiany):

git difftool myfile.txt

Aby git difftoolefektywniej korzystać, zainstaluj i użyj swojego ulubionego narzędzia GUI, takiego jak Meld, DiffMerge lub OpenDiff.

Uwaga: Możesz także użyć .(zamiast nazwy pliku), aby zobaczyć bieżące zmiany katalogu.

Aby sprawdzić zmiany w każdej linii, użyj git blame:, która wyświetli, która linia została zatwierdzona w którym zatwierdzeniu.


Aby wyświetlić rzeczywisty plik przed zatwierdzeniem (gdzie masterjest twoja gałąź), uruchom:

git show master:path/my_file
kenorb
źródło
15

Czy próbowałeś -v(lub --verbose) opcji git commit? Dodaje różnicę zatwierdzenia w edytorze wiadomości.

vhallac
źródło
Dobra odpowiedź. Może to dostarczyć informacji w edytorze zatwierdzeń, co ułatwia mi zatwierdzanie. Czy jest jakiś sposób na zamknięcie obszaru informacyjnego, Changes not staged for commit:który może uczynić edytor zatwierdzeń bardziej czystym.
Radian Jheng
15

Inna technika do rozważenia, jeśli chcesz porównać plik z ostatnim zatwierdzeniem, co jest bardziej pedantyczne:

git diff master myfile.txt

Zaletą tej techniki jest to, że można również porównać do przedostatniego zatwierdzenia z:

git diff master^ myfile.txt

a poprzedni:

git diff master^^ myfile.txt

Możesz także zastąpić „~” znakiem karetki „^”, a „you branch name” zamiast „master”, jeśli nie jesteś w gałęzi master.

anisbet
źródło
14

Myślę, że jest to idealny przypadek użycia gwarantujący GUI. - Chociaż całkowicie rozumiem, że można to również osiągnąć wystarczająco dobrze w linii poleceń.

Osobiście, każde moje popełnienie, robię z git-gui. W którym mogę wykonać wiele atomowych zatwierdzeń z osobnymi porcjami / liniami, jeśli ma to sens.

Gut Gui umożliwia oglądanie różnic w dobrze sformatowanym kolorowym interfejsie, jest raczej lekki. Wygląda na to, że powinieneś również to zrobić.

Lakshman Prasad
źródło
Zgadzam się - pozwala również edytować komunikat zatwierdzenia, patrząc na różnicę.
François,
Dobrze wiedzieć, ale chciałbym pozostać przy CLI. Użyłem kilku pakietów, które go miały, ale przestawiłem się na ściśle terminal / vim dla mojego przepływu pracy. W każdym razie dzięki.
Sos McBoss,
Tak, jeśli trzymasz się GUI, istnieje wiele fajnych funkcji git bisect, które nie są tak naprawdę dostępne.
NoBugs
2
Zgadzam się - istnieje wiele opcji, dla których jest to znacznie szybsze i bardziej sensowne jest użycie wiersza polecenia. Jednak podgląd zmian nie jest jedną z nich.
VitalyB
Istnieją również tekstowe interfejsy użytkownika, które działają w terminalu. Warto sprawdzić tig„interfejs tekstowy dla Gita”.
smido
10

W systemie macOS przejdź do katalogu głównego git i wpisz git diff *

catanore
źródło
Tak, właśnie to przetestowałem. Czy masz zainstalowany git? Jakieś komunikaty o błędach? Być może można by zadać nowe pytanie w tej sprawie.
catanore
4

Najlepszym sposobem, jaki znalazłem, oprócz używania dedykowanego interfejsu GUI zatwierdzania, jest użycie git difftool -d- Otwiera to twoje narzędzie różnicowania w trybie porównywania katalogów, porównując HEAD z bieżącym brudnym folderem.

Witalij B.
źródło
dokładnie to, czego potrzebowałem. Dzięki
Ivan Ferrer Villa
3
git difftool -d HEAD filename.txt

Pokazuje porównanie za pomocą okna szczelinowego VI w terminalu.

Tomachi
źródło