Wie kann ich lokale Commits anzeigen, die noch nicht in das Remote-Repository übertragen wurden? Gelegentlich druckt git status
aus, dass mein Zweig X Commits vor Origin/master
ist, aber nicht immer.
Ist das ein Fehler bei meiner Git-Installation oder fehlt mir etwas?
git log Origin/master..HEAD
Sie können den Unterschied auch mit derselben Syntax anzeigen
git diff Origin/master..HEAD
Wenn Sie alle Commits für alle Zweige anzeigen möchten, für die noch keine Push-Vorgänge ausgeführt wurden, suchen Sie möglicherweise nach:
git log --branches --not --remotes
Und wenn Sie nur die neuesten Festschreibungen für jeden Zweig und die Namen der Zweige anzeigen möchten, gehen Sie wie folgt vor:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
Sie können alle Commits anzeigen, die Sie lokal, jedoch nicht mit Upstream haben
_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).
Das hat bei mir funktioniert:
git cherry -v
Wie unter Git: Alle nicht gelöschten Commits oder Commits anzeigen, die sich nicht in einem anderen Zweig befinden .
Sie können dies mit git log
tun:
_git log Origin..
_
Angenommen, Origin
ist der Name Ihres Upstreams. Wenn Sie nach _..
_ keinen Revisionsnamen angeben, bedeutet dies HEAD
, das die neuen Commits auflistet, die noch nicht übertragen wurden.
Praktischer Git-Alias für die Suche nach nicht gelöschten Commits in current branch:
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log Origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline
Was dies im Grunde tut:
git log Origin/branch..branch
ermittelt aber auch den aktuellen Filialnamen.
Alle anderen Antworten sprechen von "Upstream" (dem Zweig, aus dem Sie ziehen).
Aber ein lokaler Zweig kann Push zu einem anderer Zweig als der, aus dem er gezogen wird.
master
wird möglicherweise nicht an den Remote-Tracking-Zweig "_Origin/master
_" weitergeleitet.
Der Upstream -Zweig für master
könnte _Origin/master
_ sein, er könnte jedoch auf den Remote Tracking-Zweig _Origin/xxx
_ oder sogar pushen _anotherUpstreamRepo/yyy
_.
Diese werden von _branch.*.pushremote
_ für den aktuellen Zweig zusammen mit dem Wert _global remote.pushDefault
_ festgelegt.
Es ist dieser Remote-Tracking-Zweig, der bei der Suche nach nicht gelöschten Commits zählt: derjenige, der den _branch at the remote
_ verfolgt, in dem der lokale Zweig würde an gedrückt werden.
Der _branch at the remote
_ kann wiederum _Origin/xxx
_ oder sogar _anotherUpstreamRepo/yyy
_ sein.
<branch>@{Push}
Siehe Festschreiben 29bc885 , Festschreiben 3dbe9db , Festschreiben adfe5d , Festschreiben 48c5847 , Festschreiben a1ad0eb , Festschreiben von e291c75 , Festschreiben von 979cb24 , Festschreiben von 1ca41a1 , Festschreiben von 3a429d , Festschreiben von a9f9f8c , Festschreiben 8770e6f , Festschreiben da66b27 , Festschreiben f052154 , Festschreiben 9e3751d , Festschreiben ee2499f [alle ab dem 21. Mai 2015] und commit e41bf35 [01. Mai 2015] von Jeff King (peff
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Festschreiben von c4a8354 , 05. Juni 2015)
Commit adfe5d erklärt:
_
sha1_name
_: Implementiere _@{Push}
_ KurzformIn einem dreieckigen Workflow kann jeder Zweig zwei unterschiedliche Interessenpunkte haben: den _
@{upstream}
_, von dem Sie normalerweise abrufen, und das Ziel, zu dem Sie normalerweise pushen. Für Letzteres gibt es keine Abkürzung, aber es ist nützlich, diese zu haben.Zum Beispiel möchten Sie vielleicht wissen, welche Commits Sie noch nicht gepusht haben :
_git log @{Push}..
_
Oder stellen Sie sich als komplizierteres Beispiel vor, Sie ziehen normalerweise Änderungen aus _
Origin/master
_ (das Sie als _@{upstream}
_ festgelegt haben) und übertragen Änderungen an Ihre persönliche Gabel (z. B. als _myfork/topic
_). .
Sie können von mehreren Computern aus auf Ihre Abzweigung pushen. Dabei müssen Sie die Änderungen vom Push-Ziel einbinden und nicht von der Upstream-Seite .
Mit diesem Patch können Sie einfach Folgendes tun:
_git rebase @{Push}
_
anstatt den vollständigen Namen einzutippen.
Commit 29bc885 fügt hinzu:
_
for-each-ref
_: Akzeptieren Sie das Format "%(Push)
"Genau wie wir "
%(upstream)
" haben, um das "_@{upstream}
_" für jeden Verweis zu melden, fügt dieser Patch "%(Push)
" hinzu, um "_@{Push}
_" zu entsprechen.
Es unterstützt die gleichen Tracking-Format-Modifikatoren wie Upstream (weil Sie möglicherweise wissen möchten, welche Zweige Commits für Push haben ) .
Wenn Sie sehen möchten, wie viele Commits Ihre lokalen Niederlassungen vor/hinter der Niederlassung liegen, auf die Sie pushen:
_git for-each-ref --format="%(refname:short) %(Push:track)" refs/heads
_
Du könntest es versuchen....
gitk
Ich weiß, es ist keine reine Befehlszeilenoption, aber wenn Sie es installiert haben und sich auf einem GUI-System befinden, ist es eine großartige Möglichkeit, genau zu sehen, wonach Sie suchen, und eine ganze Menge mehr.
(Eigentlich wundert es mich, dass es bisher noch niemand erwähnt hat.)
git branch -v
zeigt für jeden lokalen Zweig an, ob er "voraus" ist oder nicht.
Ich verwende den folgenden Alias, um nur die Liste der Dateien (und den Status) abzurufen, die festgeschrieben, aber nicht weitergeleitet wurden (für den aktuellen Zweig).
git config --global alias.unpushed \
"diff Origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
dann mach einfach:
git unpushed
Ich hatte zuvor ein Commit ausgeführt, das weder an eine Zweigstelle noch an eine entfernte oder lokale Stelle weitergeleitet wurde. Nur das Festschreiben. Nichts aus anderen Antworten hat für mich funktioniert, aber mit:
git reflog
Dort habe ich mein Commit gefunden.
Ich glaube, die typischste Art, dies zu tun, ist so etwas wie:
git cherry --abbrev=7 -v @{upstream}
Ich persönlich bevorzuge jedoch das Laufen:
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
dies zeigt die Festschreibungen von alle Zweigen, die nicht stromaufwärts zusammengeführt wurden, plus die letzte Festschreibung in stromaufwärts (die als angezeigt wird Wurzelknoten für alle anderen Commits). Ich benutze es so oft, dass ich dafür den Alias noup
erstellt habe.
git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
git cherry -v
Dadurch wird Ihr lokaler Kommentarverlauf (noch nicht gepusht) mit der entsprechenden Nachricht aufgelistet
Es ist kein Fehler. Was Sie wahrscheinlich sehen, ist der Git-Status nach einer fehlgeschlagenen automatischen Zusammenführung, bei der die Änderungen von der Fernbedienung abgerufen, aber noch nicht zusammengeführt werden.
Gehen Sie wie folgt vor, um die Commits zwischen lokalem Repo und Remote zu sehen:
git fetch
Dies ist 100% sicher und wird Ihre Arbeitskopie nicht verspotten. Bei Änderungen wird git status
X commits ahead of Origin/master
angezeigt.
Sie können jetzt das Protokoll der Commits anzeigen, die sich auf der Remote-Seite, aber nicht auf der lokalen befinden:
git log HEAD..Origin
Ich schlage vor, Sie schauen sich das Skript an https://github.com/badele/gitcheck , ich habe dieses Skript zum Einchecken in einem Durchgang für alle Ihre Git-Repositorys codiert und es zeigt, wer noch keinen Commit ausgeführt hat und wer hat nicht geschoben/gezogen.
Hier ein Beispielergebnis
Es gibt ein Tool namens npushed , das alle Git-, Mercurial- und Subversion-Repos im angegebenen Arbeitsverzeichnis durchsucht und eine Liste der freigegebenen Dateien und nicht freigegebenen Commits anzeigt. Die Installation ist unter Linux einfach:
$ easy_install --user unpushed
oder
$ Sudo easy_install unpushed
systemweit zu installieren.
Die Verwendung ist ebenfalls einfach:
$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)
Siehe unpushed --help
oder offizielle Beschreibung für weitere Informationen. Es gibt auch ein Cronjob-Skript unpushed-notify
für die Bildschirmbenachrichtigung über nicht festgeschriebene und nicht festgeschriebene Änderungen.
Das hat bei mir besser funktioniert:
git log --oneline @{upstream}..
oder:
git log --oneline Origin/(remotebranch)..
Ähnlich: So zeigen Sie nicht zusammengeführte Zweige an:
git branch --all --no-merged
Die können verdächtig sein, aber ich empfehle die Antwort von cxreg
Um alle nicht gelöschten Commits aufzulisten in allen Zweigen können Sie einfach diesen Befehl verwenden:
git log --branches @{u}..
Wenn die Anzahl der Commits, die nicht veröffentlicht wurden, eine einstellige Zahl ist, was häufig der Fall ist, ist der einfachste Weg:
$ git checkout
git antwortet, indem es Ihnen mitteilt, dass Sie in Bezug auf Ihren Ursprung "Ahead-N-Commits" sind. Denken Sie also beim Anzeigen von Protokollen nur an diese Nummer. Wenn Sie "3 Commits voraus" sind, sind die Top-3-Commits in der Historie immer noch privat.
eine Möglichkeit besteht darin, Festschreibungen aufzulisten, die in einem Zweig, aber nicht in einem anderen Zweig verfügbar sind.
git log ^Origin/master master
Hier ist meine portable Lösung (Shell-Skript, das auch unter Windows ohne zusätzliche Installation funktioniert), die die Unterschiede zu Origin für alle Zweige zeigt: git-fetch-log
Eine Beispielausgabe:
==== branch [behind 1]
> commit 652b883 (Origin/branch)
| Author: BimbaLaszlo <[email protected]>
| Date: 2016-03-10 09:11:11 +0100
|
| Commit on remote
|
o commit 2304667 (branch)
Author: BimbaLaszlo <[email protected]>
Date: 2015-08-28 13:21:13 +0200
Commit on local
==== master [ahead 1]
< commit 280ccf8 (master)
| Author: BimbaLaszlo <[email protected]>
| Date: 2016-03-25 21:42:55 +0100
|
| Commit on local
|
o commit 2369465 (Origin/master, Origin/HEAD)
Author: BimbaLaszlo <[email protected]>
Date: 2016-03-10 09:02:52 +0100
Commit on remote
==== test [ahead 1, behind 1]
< commit 83a3161 (test)
| Author: BimbaLaszlo <[email protected]>
| Date: 2016-03-25 22:50:00 +0100
|
| Diverged from remote
|
| > commit 4aafec7 (Origin/test)
|/ Author: BimbaLaszlo <[email protected]>
| Date: 2016-03-14 10:34:28 +0100
|
| Pushed remote
|
o commit 0fccef3
Author: BimbaLaszlo <[email protected]>
Date: 2015-09-03 10:33:39 +0200
Last common commit
Für das Protokoll übergebene Parameter, z. --oneline
oder --patch
können verwendet werden.