Jak mogę zobaczyć, co mam zamiar naciskać za pomocą git?

587

Czy istnieje sposób, aby sprawdzić, co zostanie popchnięte, gdybym wykonał git pushpolecenie?

To, co wyobrażam, to coś w rodzaju zakładki „Zmieniono pliki” funkcji „żądania ściągnięcia” Githuba. Kiedy wysyłam żądanie ściągnięcia, mogę sprawdzić, co zostanie pobrane, jeśli zaakceptują moje żądanie ściągnięcia:github przykład zagregowanych zmian

Wiersz poleceń jest OK, ale wolałbym jakiś GUI (jak zrzut ekranu powyżej).

cmcculloh
źródło
Wiele powiązanych pytań / odpowiedzi; oto kolejny: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Odpowiedzi:

664

Aby wypchnąć listę plików, uruchom:

git diff --stat --cached [remote/branch]

przykład:

git diff --stat --cached origin/master

Aby kod różnicowy plików, które mają zostać wypchnięte, uruchom:

git diff [remote repo/branch]

Aby zobaczyć pełne ścieżki plików, które ulegną zmianie, uruchom:

git diff --numstat [remote repo/branch]

Jeśli chcesz zobaczyć te różnice w GUI, musisz skonfigurować git. Zobacz Jak wyświetlić wyjście „git diff” za pomocą programu do wizualnego porównywania? .

Ionuț G. Stan
źródło
8
Obie odmiany git diff - cached bez podanego zatwierdzenia będą wyświetlać tylko różnice w / HEAD. Myślę, że miałeś na myśli git diff [--stat] - buforowane pochodzenie / master, zakładając, że główną gałęzią pochodzenia jest master
mfontani
52
To nie jest dokładnie to, czego chcesz. Powinieneś różnicować HEAD, a nie indeks, względem origin ( git diff origin/master HEAD). Zróżnicowanie indeksu da te same wyniki wtedy i tylko wtedy, gdy nie wprowadzono żadnych zmian dla zatwierdzenia. Jeśli wprowadziłeś zmiany, zostaną one uwzględnione w pliku różnic, ale najwyraźniej nie zostaną wprowadzone, ponieważ nie zostały jeszcze zatwierdzone.
Cascabel,
5
Ta odpowiedź wymaga edycji, aby informacje w komentarzu @Jefromi git diff --stat origin/master HEADbyły poprawne.
Tony Topper
2
@mfontani ma dla mnie właściwą odpowiedź. Chcę sprawdzić, co zostanie wypchnięte z tego, co już popełniłem, a nie, co zostanie popełnione, jeśli popełnię wszystko, co zmieniłem. git diff --cached [remote/branch]robi lewę :)
poshaughnessy
2
zamiast pisać origin / master, możesz użyć @ {u} np. git diff @ {u} lub git diff HEAD @ {u} Pamiętaj, że działa to tylko wtedy, gdy masz już utworzoną i połączoną gałąź śledzenia upstream. Przydaje mi się, gdy mam dużo oddziałów i pilotów, więc nie muszę myśleć o tym, co jest z tym związane.
Damien Sawyer
192

Zawsze istnieje suchobieg:

git push --dry-run

Zrobi wszystko oprócz faktycznego wysyłania danych.

Jeśli chcesz uzyskać bardziej graficzny widok, masz wiele opcji.

Tig i skrypt gitk, które są dostarczane z git, wyświetlają zarówno bieżącą gałąź twojej lokalnej kopii, jak i gałąź pilota lub źródła.

alternatywny tekst

Zatem wszelkie zatwierdzenia dokonane po źródle są zatwierdzeniami, które zostaną wypchnięte.

Otwórz gitk z powłoki, gdy jesteś w gałęzi, którą chcesz wcisnąć, pisząc gitk&, a następnie, aby zobaczyć różnicę między tym, co znajduje się na pilocie, a tym, co zamierzasz wcisnąć do pilota, wybierz lokalne nieprzypisane zatwierdzenie i kliknij prawym przyciskiem myszy na pilocie i wybierz „Zróżnicuj to -> wybrane”: alternatywny tekst

Brian Gianforcearo
źródło
18
git push - dry-run nie pokazuje mi niczego, co mam nadzieję zobaczyć. gitk jest bliżej, ale nie pokazuje mi łącznej sumy wszystkich zmian, które zostaną wprowadzone. Więc jeśli wypycham 6 zatwierdzeń do pilota, chcę zobaczyć sumę tego, co zostanie wypchnięte. Nie obchodzi mnie, co każde zatwierdzenie ma indywidualnie, ponieważ jedno zatwierdzenie może być całkowicie zanegowane przez następne.
cmcculloh
1
Jeśli potrzebujesz różnicy w tym, co zostanie popchnięte, zrób git diff --stat HEAD origin/masterlub git diff HEAD origin/master. Ważna jest HEAD , w przeciwnym razie wprowadzisz nieprzewidziane zmiany w swoim pliku różnicowym
Daniel Alder
Czy istnieje jakiś powód, dla którego git nie wykonuje automatycznie suchego cyklu przed próbą wypchnięcia danych do pilota? Jeśli wypychasz dużą ilość danych, przesyła wszystkie dane, a następnie wyświetla błędy. Właśnie zmarnowałeś czas i przepustowość przesyłania danych, które musisz teraz przesłać ponownie. To wydaje się dziwne zachowanie.
zeusstl
1
Problem git push --dry-runpolega na tym, że nadal wymaga uprawnień do zapisu na pilocie. Więc jeśli masz klon bez pozwolenia na przesyłanie danych w górę, ale chcesz zobaczyć, jakie są Twoje lokalne niedomówione zmiany, --dry-runnie zrobisz tego.
Ed Avis,
Jest to dobre rozwiązanie, ale należy zauważyć, że wymaga połączenia z pilotem (w tym wprowadzenia klucza SSH, jeśli dotyczy). Jeśli chcesz po prostu zobaczyć różnicę między branchi origin/branch, pójdę z odpowiedzią Ionuţ G. Stana, ponieważ w rzeczywistości nie wymaga podłączenia do zdalnego repo. Może to być dobre lub złe, w zależności od potrzeb.
Sean the Bean
169

Aby po prostu wymienić zatwierdzenia oczekujące na wypchnięcie: ( to ten, który zapamiętasz )

git cherry -v

Pokaż podmioty zatwierdzające obok SHA1.

Alex Nolasco
źródło
5
Jedną interesującą rzeczą jest to, że możesz określić pilota do porównania: git cherry -v heroku/remotena wypadek, gdybyś trzymał kod w więcej niż jednym pilocie.
fagiani
Jakie jest najlepsze komplementarne polecenie, które pozwala nam faktycznie skorelować różnice, które zawierały te zatwierdzenia?
Hassan Baig
To polecenie jest fajne, ale chciałbym uzyskać więcej szczegółów, takich jak nazwy plików, które należy zmienić podczas wypychania.
LS
21

Prawdopodobnie chcesz biec git difftool origin/master.... powinien pokazać zunifikowany plik różnicowy tego, co znajduje się w bieżącej gałęzi, którego jeszcze nie ma w gałęzi źródłowej / głównej i wyświetlić go w wybranym narzędziu graficznym. Aby być najbardziej aktualnym, uruchom git fetchnajpierw.

Scott Chacon
źródło
2
git difftool -d origin/master, Mam ustawiony difftool do połączenia, więc działa świetnie, dzięki!
Aquarius Power
git difftool -djest o wiele lepszy, dzięki Aquarius Power. Jedynym problemem jest to, że nie wykrywa przeniesionych plików i pokazuje je jako usunięte i dodane zamiast tego.
EM0,
8

Jednym ze sposobów porównania lokalnej wersji przed wypchnięciem jej na zdalne repozytorium (rodzaj wypychania w suchym biegu):

Użyj TortoiseGit:
Kliknij prawym przyciskiem myszy projekt folderu głównego> TortoiseGit> Zróżnicuj z poprzednią wersją>
dla wersji 2 wybierzrefs/remotes/origin/master

użytkownik1921207
źródło
8

Spróbuj git diff origin/master..master(zakładając, że origin/masterto twój upstream). W przeciwieństwie do git push --dry-runtego nadal działa, nawet jeśli nie masz uprawnień do zapisu na serwerze.

Ed Avis
źródło
5

Użyj git gui, tam możesz zobaczyć listę zmian w twoim rzeczywistym zatwierdzeniu. Możesz także użyć programu, gitkktóry zapewnia łatwy interfejs do rejestrowania wpisów. Wystarczy porównać remotes/...i masterzobaczyć, co zostanie popchnięte. Zapewnia interfejs podobny do zrzutu ekranu.

Oba programy są zawarte w git.

fuz
źródło
1
Nie widzę w git gui żadnego miejsca, które pokazuje wszystko, co zostało popełnione, ale nie zostało wypchnięte.
cmcculloh
W git gui możesz zobaczyć, co zostało zmodyfikowane, ale nie zostało zatwierdzone. W gik (za pośrednictwem gitk --allotrzymujesz pełną listę wszystkich komentarzy. Teraz możesz porównać rzeczywisty stan swojej gałęzi
deweloperskiej
4

Aby zobaczyć, które pliki zostały zmienione i zobaczyć rzeczywiste zmiany kodu w porównaniu z mastergałęzią, której możesz użyć:

git diff --stat --patch origin master

UWAGA : Jeśli zdarzy ci się użyć któregoś z IDE firmy Intellij, możesz kliknąć prawym przyciskiem myszy swój projekt najwyższego poziomu, wybrać Git > Porównaj z gałęzią > i wybrać żądane źródło, np origin/master. W drzewie plików, które się pojawi, możesz dwukrotnie kliknąć pliki, aby zobaczyć różnicę wizualną. W przeciwieństwie do powyższej opcji wiersza polecenia, możesz edytować lokalne wersje z okna różnic.

ccpizza
źródło
3

Możesz wyświetlić listę zatwierdzeń według:

git cherry -v

A następnie porównaj z następującą komendą, gdzie liczba ^ jest równa liczbie zatwierdzeń (w przykładzie jej 2 zatwierdzenia):

git diff HEAD^^
DavidS
źródło
Po prostu dobrze jest zobaczyć listę najnowszych zatwierdzeń. To nie poda nazwy pliku (ów). Dlatego, jak ktoś odpowiedział przy użyciu opcji suchego uruchamiania i opcji łaty, jest lepszy. git diff --stat --patch origin master git push --dry-run
Sree Rama
2

Jeśli używasz Mac OS X, polecam Ci Tower, to wspaniały program, który sprawił, że praca z Git była dla mnie przyjemnością. Teraz muszę już pamiętać polecenia terminala i oferuje świetny GUI do przeglądania, śledzenia i rozwiązywania różnic w plikach.

I nie, nie jestem z nimi związany, po prostu korzystam z ich oprogramowania i bardzo mi się podoba.

http://www.git-tower.com/

kakubei
źródło
2
Korzystam z Tower, ale jak możesz zobaczyć pliki, które zostały zatwierdzone, ale nie zostały wypchnięte?
Michael Irey
To nie odpowiada na pytanie.
reinierpost
1

Żeby dodać moje dwa centy ... Chciałem to zaimplementować, uruchamiając zadania w potoku gitlab na runnerie gitlab. Najlepszym sposobem na to było użycie tego skryptu:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Również w moim przypadku chciałem filtrować pliki według rozszerzenia, aby to osiągnąć, użyłem:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Potem możesz na przykład przesłać tę listę gdzie indziej, być może linijkę;)

Mam nadzieję, że to komuś pomoże.

Michał Mikołajczyk
źródło
1
  1. Jeśli masz uprawnienia do zapisu na pilocie
git push --dry-run
  1. Jeśli nie masz uprawnień do zapisu na pilocie
git diff --stat HEAD remote/branch
vkg
źródło
0

Po git commit -m "{your commit message}"tym otrzymasz hash zatwierdzenia przed wypchnięciem. Aby zobaczyć, co zamierzasz przekazać git, uruchom następujące polecenie:

git diff origin/{your_branch_name} commit hash

na przykład: git diff origin/master c0e06d2

Chandra
źródło
Dziękuję za odpowiedź, ale myślę, że ten wysiłek nie był wymagany, ponieważ pytanie jest dość stare i wysoko głosowane. Lepiej jest wydawać wysiłki na różne pytania.
Pbd