Wie kann ich sehen, was ich mit git pushen werde?

588

Gibt es eine Möglichkeit zu sehen, was gedrückt wird, wenn ich einen git pushBefehl ausführen würde ?

Was ich mir vorstelle, ist so etwas wie die Registerkarte "Dateien geändert" in Githubs Funktion "Pull Request". Wenn ich eine Pull-Anfrage stelle, kann ich sehen, was eingezogen wird, wenn sie meine Pull-Anfrage akzeptieren:Github-Beispiel für aggregierte Änderungen

Die Befehlszeile ist in Ordnung, aber ich würde eine Art GUI bevorzugen (wie der Screenshot oben).

cmcculloh
quelle
Viele verwandte Fragen / Antworten; Hier ist eine andere: stackoverflow.com/questions/2176278/preview-a-git-push/…
Michael

Antworten:

665

Führen Sie Folgendes aus, um eine Liste der zu übertragenden Dateien anzuzeigen:

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

Beispiel:

git diff --stat --cached origin/master

Führen Sie Folgendes aus, um den Codedifferenz der zu übertragenden Dateien zu ermitteln:

git diff [remote repo/branch]

Führen Sie Folgendes aus, um die vollständigen Dateipfade der zu ändernden Dateien anzuzeigen:

git diff --numstat [remote repo/branch]

Wenn Sie diese Unterschiede in einer GUI sehen möchten, müssen Sie git dafür konfigurieren. Siehe Wie kann ich die Ausgabe von 'git diff' mit einem visuellen Diff-Programm anzeigen? .

Ionuț G. Stan
quelle
8
Beide Variationen von Git, die ohne Commitish zwischengespeichert wurden, zeigen nur die Unterschiede in Bezug auf HEAD an. Ich denke, Sie meinten git diff [--stat] --cached origin / master, vorausgesetzt, der Hauptzweig des Ursprungs ist master
mfontani
52
Das ist nicht genau das, was du willst. Sie sollten HEADnicht den Index, sondern den Ursprung ( git diff origin/master HEAD) unterscheiden. Wenn Sie den Index unterscheiden, erhalten Sie genau dann dieselben Ergebnisse, wenn Sie keine Änderungen für das Festschreiben vorgenommen haben. Wenn Sie Änderungen vorgenommen haben, werden diese in den Diff aufgenommen, aber eindeutig nicht verschoben, da sie noch nicht festgeschrieben wurden.
Cascabel
5
Diese Antwort muss bearbeitet werden, damit die Informationen in den Kommentar von @Jefromi aufgenommen werden. Dies git diff --stat origin/master HEADist die richtige Antwort.
Tony Topper
2
@mfontani hat die richtige Antwort für mich. Ich möchte überprüfen, was von dem, was ich bereits festgeschrieben habe, gepusht wird, und nicht, was festgeschrieben wird, wenn ich alles festschreibe, was ich geändert habe. git diff --cached [remote/branch]macht den Trick :)
poshaughnessy
2
Anstatt origin / master einzugeben, können Sie @ {u} verwenden, z. B. git diff @ {u} oder git diff HEAD @ {u}. Beachten Sie, dass dies nur funktioniert, wenn Sie bereits einen Upstream-Tracking-Zweig erstellt und verknüpft haben. Ich finde es nützlich, wenn ich viele Zweige und Fernbedienungen habe, damit ich nicht darüber nachdenken muss, was wo verlinkt ist.
Damien Sawyer
192

Es gibt immer Trockenlauf:

git push --dry-run

Es wird alles außer dem tatsächlichen Senden der Daten tun.

Wenn Sie eine grafischere Ansicht wünschen, haben Sie eine Reihe von Optionen.

Tig und das mit git gelieferte Gitk-Skript zeigen beide den aktuellen Zweig Ihrer lokalen Kopie und den Zweig der Fernbedienung oder des Ursprungs an.

Alt-Text

Alle Commits, die Sie nach dem Ursprung vornehmen, sind die Commits, die übertragen werden.

Öffnen Sie gitk aus der Shell, während Sie in dem Zweig, den Sie pushen möchten, durch Eingabe eingeben. Um gitk&den Unterschied zwischen dem, was sich auf der Fernbedienung befindet, und dem, was Sie auf die Fernbedienung pushen möchten , zu sehen, wählen Sie Ihr lokales nicht gepushtes Commit aus und klicken Sie mit der rechten Maustaste auf die Fernbedienung und Wählen Sie "Diff this -> selected": Alt-Text

Brian Gianforcaro
quelle
18
git push --dry-run zeigt mir nicht das, was ich mir erhoffe. gitk ist näher dran, aber es zeigt mir nicht die Gesamtsumme aller Änderungen, die gepusht werden. Wenn ich also 6 Commits an die Fernbedienung drücke, möchte ich die Gesamtsumme der Pushs sehen. Es ist mir egal, was jedes Commit einzeln hat, da ein Commit durch das nächste vollständig negiert werden könnte.
cmcculloh
1
Wenn Sie einen Unterschied brauchen, was geschoben wird, tun Sie git diff --stat HEAD origin/masteroder git diff HEAD origin/master. Wichtig ist der KOPF , ansonsten nehmen Sie nicht
Daniel Alder
Gibt es einen Grund, warum Git nicht automatisch einen Probelauf durchführt, bevor es versucht, Daten auf eine Fernbedienung zu übertragen? Wenn Sie eine große Datenmenge übertragen, werden alle Daten hochgeladen und anschließend werden alle Fehler angezeigt. Sie haben gerade Zeit und Bandbreite beim Hochladen von Daten verschwendet, die Sie jetzt erneut hochladen müssen. Dies scheint ein seltsames Verhalten zu sein.
Zeusstl
1
Das Problem dabei git push --dry-runist, dass weiterhin eine Schreibberechtigung auf der Fernbedienung erforderlich ist. Wenn Sie also einen Klon haben, --dry-runder nicht berechtigt ist, Upstreams zu pushen, aber sehen möchten, wie Ihre lokalen nicht gepushten Änderungen aussehen, tun Sie dies nicht.
Ed Avis
Dies ist eine gute Lösung, es ist jedoch zu beachten, dass eine Verbindung zur Fernbedienung erforderlich ist (einschließlich der Eingabe des SSH-Schlüssels, falls zutreffend). Wenn Sie nur den Unterschied zwischen branchund sehen möchten origin/branch, würde ich mich der Antwort von Ionuț G. Stan anschließen, da keine Verbindung zum Remote-Repo erforderlich ist. Dies kann gut oder schlecht sein, je nachdem, was Sie brauchen.
Sean the Bean
169

Um einfach die Commits Warteliste geschoben zu werden: ( das ist diejenige , die Sie sich erinnern )

git cherry -v

Zeigen Sie die Festschreibungsthemen neben den SHA1s an.

Alex Nolasco
quelle
5
Eine interessante Sache ist, dass Sie eine Fernbedienung angeben können, die wie folgt verglichen werden soll: git cherry -v heroku/remoteFalls Sie Ihren Code in mehr als einer Fernbedienung aufbewahren.
Fagiani
Was ist der beste ergänzende Befehl, mit dem wir die in diesen Commits enthaltenen Unterschiede tatsächlich korrelieren können?
Hassan Baig
Dieser Befehl ist nett, aber ich möchte mehr Details, wie die Namen der Dateien, die während des Pushs geändert werden sollen.
LS
21

Du willst wahrscheinlich rennen git difftool origin/master.... Das sollte den einheitlichen Unterschied von dem anzeigen, was sich in Ihrem aktuellen Zweig befindet, der sich noch nicht im Ursprungs- / Hauptzweig befindet, und ihn im grafischen Diff-Tool Ihrer Wahl anzeigen. Um auf dem neuesten Stand zu sein, führen Sie git fetchzuerst aus.

Scott Chacon
quelle
2
git difftool -d origin/masterIch habe mein Difftool so eingestellt, dass es verschmilzt, damit es großartig funktioniert, danke!
Wassermann Power
git difftool -dist viel besser, danke Aquarius Power. Das einzige Problem ist, dass verschobene Dateien nicht erkannt und stattdessen als gelöscht und hinzugefügt angezeigt werden.
EM0
8

Eine Möglichkeit, Ihre lokale Version zu vergleichen, bevor Sie sie auf das Remote-Repo übertragen (Art des Push-in-Trockenlaufs):

TortoiseGit verwenden:
Klicken Sie mit der rechten Maustaste auf das Stammordnerprojekt> TortoiseGit> Diff mit vorheriger Version>
für Version 2 wählenrefs/remotes/origin/master

user1921207
quelle
8

Versuchen Sie es git diff origin/master..master(vorausgesetzt, dies origin/masterist Ihr Upstream). Im Gegensatz git push --dry-rundazu funktioniert dies auch dann, wenn Sie keine Schreibberechtigung für den Upstream haben.

Ed Avis
quelle
5

Verwenden git guiSie dort, um eine Liste der Änderungen in Ihrem tatsächlichen Commit anzuzeigen. Sie können auch gitkeine einfache Oberfläche für Reflogs verwenden. Vergleichen Sie einfach zwischen remotes/...und um masterzu sehen, was gepusht wird. Es bietet eine Oberfläche ähnlich Ihrem Screenshot.

Beide Programme sind in git enthalten.

fuz
quelle
1
Ich sehe keinen Ort in Git Gui, der alles zeigt, was begangen, aber nicht gepusht wurde.
cmcculloh
In Git GUI können Sie sehen, was geändert, aber nicht festgeschrieben wurde. In gik (Via erhalten gitk --allSie eine vollständige Liste aller Kommentare. Jetzt können Sie den aktuellen Status Ihres Dev-Zweigs mit Ihrer Fernbedienung vergleichen, um zu pushen.
Fuz
4

So sehen Sie, welche Dateien geändert werden, und zeigen die tatsächlichen Codeänderungen im Vergleich zu dem masterZweig an, den Sie verwenden können:

git diff --stat --patch origin master

HINWEIS : Wenn Sie zufällig eine der Intellij-IDEs verwenden, können Sie mit der rechten Maustaste auf Ihr Projekt der obersten Ebene klicken, Git > Mit Zweig vergleichen > auswählen und den gewünschten Ursprung auswählen, z origin/master. In der angezeigten Dateibaumstruktur können Sie auf die Dateien doppelklicken, um einen visuellen Unterschied anzuzeigen. Im Gegensatz zur obigen Befehlszeilenoption können Sie Ihre lokalen Versionen über das Diff-Fenster bearbeiten.

ccpizza
quelle
3

Sie können die Commits auflisten, indem Sie:

git cherry -v

Vergleichen Sie dann mit dem folgenden Befehl, bei dem die Anzahl von ^ der Anzahl der Commits entspricht (im Beispiel die 2 Commits):

git diff HEAD^^
DavidS
quelle
Es ist einfach gut, die Liste der neuesten Commits zu sehen. Dies gibt keinen Namen für die Datei (en). Daher ist es besser, wenn jemand mit Trockenlaufoptionen und Patchoptionen antwortet. git diff --stat --patch origin master git push --dry-run
Sree Rama
2

Wenn Sie Mac OS X verwenden, würde ich Ihnen Tower empfehlen. Es ist ein wunderbares Programm, das mir den Umgang mit Git zum Vergnügen gemacht hat. Ich muss mich jetzt länger an Terminalbefehle erinnern und es bietet eine großartige Benutzeroberfläche zum Anzeigen, Verfolgen und Lösen von Unterschieden in Dateien.

Und nein, ich bin nicht mit ihnen verbunden, ich benutze nur ihre Software und mag sie wirklich.

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

Kakubei
quelle
2
Ich benutze Tower, aber wie können Sie die Dateien sehen, die festgeschrieben, aber nicht gepusht wurden?
Michael Irey
Dies beantwortet die Frage nicht.
Reinierpost
1

Nur um meine zwei Cent hinzuzufügen ... Ich wollte dies implementieren, wenn Jobs in einer Gitlab-Pipeline auf einem Gitlab-Runner ausgeführt werden. Der beste Weg, dies zu tun, war die Verwendung dieses Skripts:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Auch in meinem Fall wollte ich Dateien nach Erweiterung filtern, um dies zu erreichen, habe ich verwendet:

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

Danach können Sie diese Liste zum Beispiel woanders weiterleiten, vielleicht einen Linter;)

Hoffe das wird jemandem helfen.

Michal Mikolajczyk
quelle
1
  1. Wenn Sie Schreibberechtigungen auf Remote haben
git push --dry-run
  1. Wenn Sie keine Remote-Schreibberechtigung haben
git diff --stat HEAD remote/branch
vkg
quelle
0

Danach erhalten git commit -m "{your commit message}"Sie vor dem Push einen Commit-Hash . Sie können also sehen, womit Sie pushen möchten, gitindem Sie den folgenden Befehl ausführen:

git diff origin/{your_branch_name} commit hash

z.B: git diff origin/master c0e06d2

Chandra
quelle
Vielen Dank für die Antwort, aber ich denke, dieser Aufwand war nicht erforderlich, da die Frage ziemlich alt und hoch bewertet ist. Sie sind besser dran, sich um verschiedene Fragen zu kümmern.
Pbd