Wie kann ich alle von mir vorgenommenen lokalen Commits anzeigen, die noch nicht in das Remote-Repository übertragen wurden? Ab und zu, git status
wird ausdrucken, dass mein Zweig X Commits vor sich hat origin/master
aber nicht immer.
Ist das ein Fehler bei meiner Git-Installation oder übersehe ich etwas?
Dies ergibt ein Protokoll aller Commits zwischen Origin/Master und HEAD:
git log origin/master..HEAD
Wenn sich HEAD im Master-Zweig befindet, wird ein Protokoll der nicht gepushten Commits angezeigt.
Um den Unterschied anzuzeigen, gehen Sie wie folgt vor:
git diff origin/master..HEAD
So sehen Sie alle Commits für alle Zweige, die noch nicht gepusht wurden:
git log --branches --not --remotes
So sehen Sie den neuesten Commit für jeden Zweig sowie die Zweignamen:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
Zeigen Sie alle Commits an, die Sie lokal, aber nicht im Upstream haben, mit:
git log @{u}..
@{u}
oder @{upstream}
bedeutet den Upstream-Zweig des aktuellen Zweigs (siehe git rev-parse --help
oder git help revisions
für Details).
git log origin/master..
Dies setzt das voraus origin
ist der Name Ihrer Upstream-Fernbedienung und master
ist der Name Ihres Upstream-Zweigs. Lassen Sie danach den Revisionsnamen weg ..
impliziert HEAD
das die neuen Commits auflistet, die nicht gepusht wurden. [git log
]
In allen anderen Antworten geht es um „Upstream“ (den Zweig, aus dem Sie ziehen).
Aber a Lokale Niederlassung dürfen drücken zu einem anders Zweig als der, aus dem es zieht.
A master
wird möglicherweise nicht an den Remote-Tracking-Zweig weitergeleitet.origin/master
“.
Der stromaufwärts Zweig für master
mag sein origin/master
aber es könnte an den Remote-Tracking-Zweig weitergeleitet werden origin/xxx
oder auch anotherUpstreamRepo/yyy
.
Diese werden von festgelegt branch.*.pushremote
für den aktuellen Zweig zusammen mit dem global remote.pushDefault
Wert.
Es ist Das Remote-Tracking-Zweig, der bei der Suche nach nicht gepushten Commits zählt: derjenige, der die verfolgt branch at the remote
bei dem die Lokale Niederlassung würde dazu gedrängt werden.
Der branch at the remote
kann wieder sein, origin/xxx
oder auch anotherUpstreamRepo/yyy
.
Git 2.5+ (Q2 2015) führt dafür eine neue Verknüpfung ein: <branch>@{push}
Sehen Commit 29bc885, Commit 3dbe9db, begehen Sie adfe5d0, Commit 48c5847, Commit a1ad0eb, e291c75 begehen, Commit 979cb24, 1ca41a1 begehen, Commit 3a429d0, Commit a9f9f8c, Commit 8770e6f, Commit da66b27, Commit f052154, Commit 9e3751d, Commit ee2499f [all from 21 May 2015]Und Commit e41bf35 [01 May 2015] von Jeff King (peff
).
(Zusammengeführt von Junio C Hamano — gitster
— In c4a8354 begehen05.06.2015)
Commit adfe5d0 erklärt:
sha1_name
: implementieren @{push}
Kurzschrift
In einem dreieckigen Workflow kann jeder Zweig zwei unterschiedliche Interessenpunkte haben: den @{upstream}
von dem Sie normalerweise ziehen, und das Ziel, zu dem Sie normalerweise pushen. Für Letzteres gibt es keine Abkürzung, aber es ist nützlich, sie zu haben.
Zum Beispiel, Vielleicht möchten Sie wissen, welche Commits Sie noch nicht gepusht haben:
git log @{push}..
Oder stellen Sie sich als komplizierteres Beispiel vor, dass Sie normalerweise Änderungen vornehmen origin/master
(die Sie als Ihre festgelegt haben @{upstream}
) und Änderungen an Ihren Fork übertragen (z. B. as myfork/topic
).
Sie können von mehreren Maschinen aus auf Ihren Fork pushen, wenn dies erforderlich ist Integrieren Sie die Änderungen vom Push-Ziel und nicht vom Upstream.
Mit diesem Patch können Sie einfach Folgendes tun:
git rebase @{push}
anstatt den vollständigen Namen einzugeben.
Commit 29bc885 fügt hinzu:
for-each-ref
: akzeptieren “%(push)
” Format
So wie wir es getan haben“%(upstream)
„zu melden“@{upstream}
„Für jede Referenz fügt dieser Patch hinzu:“%(push)
” passen “@{push}
“.
Es unterstützt die gleichen Tracking-Formatmodifikatoren wie Upstream (weil Möglicherweise möchten Sie beispielsweise wissen, welche Zweige Commits zum Pushen haben).
Wenn Sie sehen möchten, wie viele Commits Ihre lokalen Niederlassungen haben vor/hinten im Vergleich zu der Branche, zu der Sie pushen:
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
Ich habe zuvor einen Commit durchführen lassen, der weder an einen Zweig noch an eine entfernte Stelle oder lokal gepusht wurde. Nur das Commit. Nichts aus anderen Antworten hat bei mir funktioniert, aber mit:
git reflog
Dort habe ich mein Commit gefunden.
Beginnend mit Git 2.5+ (Q2 2015) wäre die eigentliche Antwort
git log @{push}..
. Sehen Sie sich die neue Verknüpfung an@{push}
(unter Bezugnahme auf den Remote-Tracking-Zweig, zu dem Sie pushen) in meiner Antwort unten– VonC
8. Juni 2015 um 22:44
@Torek – noch eine einfache Aufgabe, die Git erschwert. Jedes Mal, wenn eine Git-Frage mit Hunderten oder Tausenden von Upvotes und Millionen von Aufrufen auftaucht, sollte jemand denken: Wow, wir haben diesen Workflow wirklich vermasselt. Leider haben die Git-Entwickler den Feedback-Schritt im Entwicklungslebenszyklus ausgelassen, sodass das Feedback nicht berücksichtigt wird. Stattdessen machen sie immer wieder die gleichen Fehler. Zu dieser Frage:
git status --all
hätte 2010 erscheinen sollen; odergit status -v
sollte eigentlich die ausführliche Ausgabe liefern, die die zusätzlichen Informationen enthält.– jww
10. Juli 2016 um 19:32 Uhr
Ich bin nicht der Meinung, dass „git status -v“ diese Informationen bereitstellen sollte, da sie den Status des Arbeitsbaums anzeigen sollen, da sie sich nur auf den ausgecheckten Zweig beziehen. Sehen Sie sich jedoch die Antwort unten zu „git branch -v“ an, die meiner Meinung nach die akzeptierte Antwort sein sollte
– JoelFan
31. Januar 2017 um 19:38
Diese spezielle StackOverflow-Frage hat die meisten richtigen Antworten, die alle funktionieren, aber keinen Sinn ergeben.
– Pete Alvin
11. Januar 2018 um 21:20 Uhr
@jww: Ich stimme zu. Nach der Verwendung von Mercurial bin ich wieder zur Verwendung von Git übergegangen. Verglichen mit der Benutzerfreundlichkeit und Eleganz von Mercurial ist Git ein verfälschtes Durcheinander
– Paul
24. November 2020 um 14:11 Uhr