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.


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

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)


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


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.