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).



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? .


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


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.


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.


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


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.


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.


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.


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^^

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/


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.


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

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


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
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.