wake-up-neo.com

Anzeigen nicht gedrückter Git-Commits

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?

1591
Josh Buhler
git log Origin/master..HEAD

Sie können den Unterschied auch mit derselben Syntax anzeigen

git diff Origin/master..HEAD
1655
Peter B

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
654
cxreg

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

297
Ben Lings
152

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.

60
Greg Hewgill

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.

37
takeshin

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.

Git 2.5+ (2. Quartal 2015) führt eine neue Verknüpfung ein: <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}_ Kurzform

In 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
_
36
VonC

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

33
Justin Ohms

git branch -v zeigt für jeden lokalen Zweig an, ob er "voraus" ist oder nicht.

28
Aurelien

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
20
CCC

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.

15
Olaia

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}^..'
12
Giorgos Kylafas
git cherry -v

Dadurch wird Ihr lokaler Kommentarverlauf (noch nicht gepusht) mit der entsprechenden Nachricht aufgelistet

9
adswebwork

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 statusX 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
9
Igor Zevaka

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 enter image description here

9
Bruno Adelé

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.

7
nailgun

Das hat bei mir besser funktioniert:

git log --oneline @{upstream}..

oder:

git log --oneline Origin/(remotebranch)..
7
VaTo

Ä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

4

Um alle nicht gelöschten Commits aufzulisten in allen Zweigen können Sie einfach diesen Befehl verwenden:

 git log --branches  @{u}..
4
Mohsen Kashi

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.

3
Kaz

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
2
Alex

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.

0
bimlas