Jak odróżnić niezatwierdzone zmiany lokalne od pochodzenia

141

Powiedzmy, że sklonowałem repozytorium i zacząłem modyfikować pliki. Wiem, że jeśli mam lokalne niezatwierdzone zmiany, mogę wykonać git diff test.txtróżnicę w następujący sposób i pokaże mi różnicę między bieżącą lokalną HEAD a zmodyfikowanymi, niezatwierdzonymi zmianami w pliku. Jeśli zatwierdzę te zmiany, mogę porównać je z oryginalnym repozytorium za pomocągit diff master origin/master

Ale czy istnieje sposób na porównanie lokalnych zmian z oryginalnym repozytorium na serwerze przed ich zatwierdzeniem lokalnie? Próbowałem różnych permutacji git diff --cached master origin/masterbez powodzenia.

Chaitanya
źródło
Chciałem wiedzieć, jak bardzo zmienił się mój plik od ostatniej zatwierdzonej wersji na moim lokalnym. Odpowiedzią na moje pytanie było to pytanie. Dzięki!
Souvik Ghosh

Odpowiedzi:

133

Biorąc pod uwagę, że zdalne repozytorium zostało buforowane za pośrednictwem git fetch, powinno być możliwe porównanie z tymi zatwierdzeniami. Spróbuj wykonać następujące czynności:

$ git fetch origin
$ git diff origin/master
JJD
źródło
5
Ach, świetnie. Kluczem było pozostawienie mistrza poza domem. Próbowałem wcześniej kombinacji, w której wykonywałem pobieranie, ale kiedy to zrobiłem git diff master origin/master, nadal porównywałem z wersją zatwierdzoną (oczywiste z perspektywy czasu). Ale pominięcie wzorca porównuje teraz lokalne zmiany z wersją pobraną.
Chaitanya,
@Chaitanya Dobrze, mógłbym pomóc. Właściwie uważam, że różne style, których używa Git, są nieco irytujące: kiedy trzeba już pisać origin masteri gdzie indziej origin/master. Nadal jest do zrobienia, IMHO.
JJD,
Wydaje się, że to nie działa: master git diff origin/masterzwrotów fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.istnieje na początku, np. git fetch origin masterDziała dobrze,
mikemaccana
42

Wiem, że to nie jest odpowiedź na dokładnie zadane pytanie, ale znalazłem to pytanie, szukając porównania pliku w gałęzi z niezatwierdzonym plikiem lokalnym i pomyślałem, że udostępnię

Składnia:

git diff <commit-ish>:./ -- <path>

Przykłady:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Dzięki Ericowi Boehsowi za sposób, aby nie musieć dwukrotnie wpisywać nazwy pliku)

Nate
źródło
Ogólne rozwiązanie podoba mi się bardziej niż wąskie, konkretne powyżej. Dzielenie się myślami, gdzie to znalazłeś?
fbicknel
Nie mogę znaleźć dokumentacji dotyczącej szczegółów commit-ishi separatora dwukropka. Dokumentacja na git-diff chyba o tym nie wspomina. Używałem go tak długo, że nie pamiętam, gdzie go znalazłem. Prawdopodobnie przykłady innych poleceń dotyczące innych poleceń i właśnie z nimi eksperymentowałem git-diff. Obawiam się, że inna odpowiedźcommit-ish jest najlepsza, jaką mogę w tej chwili wymyślić.
Nate
3
Miłym dodatkiem do tego jest git diff master:./ -- README.md. W ten sposób nie musisz wpisywać README.mddwa razy i możesz łatwiej dodać go do aliasu.
Eric Boehs
Dzięki @EricBoehs, to świetna sugestia.
Nate
1
Że składnia nie działa dla mnie ... raczej tworzy źródła, zamiast pilota oddziału. Korzystanie z gita w wersji 2.19.0git diff master: -- README.md.//dev/null
rustyDev
21

Aby zobaczyć niestopniowe (nie dodane) zmiany w istniejących plikach

git diff

Pamiętaj, że to nie śledzi nowych plików. Aby zobaczyć etapowe, niezatwierdzone zmiany

git diff --cached

pepestar
źródło
9

Jeśli chcesz wizualnie porównać pliki, możesz użyć:

git difftool

Uruchomi twoją aplikację porównującą automatycznie dla każdego zmienionego pliku.

PS: Jeśli nie ustawiłeś aplikacji porównującej , możesz to zrobić jak w poniższym przykładzie (ja używam Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
Caner
źródło
czy ta zmiana obowiązuje natychmiast?
Dilip Raghunathan
Jestem po prostu ciekawy, jak to się ma do zadanego pytania? Czy git difftool nie porównałby po prostu lokalnych zmian z głównym? Jednak OP chce tego między lokalnymi zmianami a zdalnym serwerem głównym.
poinformował
Zdecydowanie najłatwiejsze rozwiązanie
Chris Johnson,