Git vor / hinter Informationen zwischen Master und Branch?

201

Ich habe in meinem lokalen repo ( test-branch) einen Zweig zum Testen erstellt, auf den ich verschoben habe Github.

Wenn ich zu meinem GithubKonto gehe und dieses auswähle test-branch, werden folgende Informationen angezeigt:

This branch is 1 commit ahead and 2 commits behind master

Meine Fragen sind:

  1. Wie kann ich diese Informationen lokal anzeigen (dh einen Befehl, der dies auf dem Terminal anzeigt, anstatt es öffnen Githubzu müssen, um sie anzuzeigen )?
  2. Ich weiß, dass ich die Unterschiede zwischen Zweigen sehen kann, indem ich:

    git diff master..test-branch
    

    oder mit Meld(was ich bevorzuge):

    git difftool master..test-branch
    

    Aber ich habe mich gefragt, ob es eine Möglichkeit gibt, die Commits vor und hinter sich getrennt zu sehen. IE: Gibt es eine Möglichkeit zu zeigen, dass 1 Commit von selbst voraus und dann diese 2 Commits von selbst zurück?

Gabriel
quelle
1
Git 2.5+ (Q2 2015) wird vorgestellt git for-each-ref --format="%(push:track)" refs/heads. Siehe meine Antwort unten
VonC
1
Da ich diese Frage mit den Schlüsselwörtern, die ich gerade schreibe, nicht finden konnte, möchte ich nur darauf hinweisen, dass dies der relativen Ergänzung (oder "Satzdifferenz") zwischen den Commit-Sätzen entspricht, aus denen diese Zweige bestehen (und dann die Elemente zählen). Hoffentlich schafft es das in Suchmaschinenindizes.
pmos

Antworten:

309

Hier ist ein Trick, den ich gefunden habe, um zwei Zweige zu vergleichen und zu zeigen, wie viele Commits jeder Zweig vor dem anderen liegt (eine allgemeinere Antwort auf Ihre Frage 1):

Für lokale Niederlassungen: git rev-list --left-right --count master...test-branch

Für entfernte Filialen: git rev-list --left-right --count origin/master...origin/test-branch

Dies ergibt eine Ausgabe wie die folgende:

1 7

Dieser Ausgang bedeutet: „ Im Vergleich zu master, test-branch7 Commits vor und 1 verpflichten hinter sich .“

Sie können auch lokale Zweige mit entfernten Zweigen vergleichen, z. B. origin/master...masterum herauszufinden, wie viele Commits der lokale masterZweig vor / hinter seinem entfernten Gegenstück liegt.

user1834095
quelle
1
Dies ist eine großartige Lösung für mich, um herauszufinden, ob ich einen Zweig löschen kann oder ob er noch vor der Entwicklung steht.
Maverick1st
1
@ Maverick1st, ja, dieser Befehl ist besonders nützlich, wenn Sie dem Gitflow-Workflow folgen (der ich bin)
user1834095
2
Dies ist das Beste für meinen Anwendungsfall, um herauszufinden, ob sich Ihr aktueller Feature-Zweig hinter remote master ( git rev-list --left-right --count origin/master...@) befindet - vorausgesetzt, der Benutzer tut dies git fetchzuvor. nützlich, um Pull-Anforderungen von veralteten Zweigen zu verhindern.
jakub.g
9
Um zu überprüfen, wie viele Commits dahinter stehen, befindet sich der aktuelle Zweig:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g
8
@ jakub.g Sie müssen nicht schneiden, wenn Sie --left-onlyoder--right-only
jasonkarns
39

git fetchUm zu sehen, wie viele Revisionen Sie lokal hinter sich haben, sollten Sie zunächst eine durchführen , um sicherzustellen, dass Sie die neuesten Informationen von Ihrer Fernbedienung haben.

Die Standardausgabe von git statusgibt an, wie viele Revisionen Sie vor oder hinter sich haben, aber normalerweise finde ich das zu ausführlich:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Ich bevorzuge git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

Tatsächlich alias ich dies einfach git sund dies ist der Hauptbefehl, den ich zum Überprüfen des Status verwende.

Um den Unterschied in den "Voraus-Revisionen" von zu sehen master, kann ich die "Hinter-Revisionen" ausschließen von origin/master:

git diff master..origin/master^

Um den Unterschied in den "Hinterrevisionen" von zu sehen origin/master, kann ich die "Vorausrevisionen" ausschließen von master:

git diff origin/master..master^^

Wenn es 5 Revisionen vor oder hinter sich gibt, ist es möglicherweise einfacher, so zu schreiben:

git diff master..origin/master~5
git diff origin/master..master~5

AKTUALISIEREN

Um die Vorwärts- / Rückwärtsrevisionen zu sehen, muss der Zweig so konfiguriert sein, dass er einen anderen Zweig verfolgt. Für mich ist dies das Standardverhalten, wenn ich ein Remote-Repository klone und nachdem ich einen Zweig mit verschoben habe git push -u remotename branchname. Meine Version ist 1.8.4.3, aber es funktioniert so lange ich mich erinnere.

Ab Version 1.8 können Sie den Tracking-Zweig folgendermaßen einstellen:

git branch --track test-branch

Ab Version 1.7 war die Syntax anders:

git branch --set-upstream test-branch
Janos
quelle
Welche Version von verwenden gitSie? Ich kann weder mit git statusnoch mit reproduzieren, was Sie bekommen git status -sb. Wenn ich einen der Befehle (nach dem Ausführen git fetch) versuche, erhalte ich keine Informationen zu Commits vor / nach.
Gabriel
8
Ihre Art, Commits vor und hinter sich zu sehen, wird auf masterund angewendet, und origin/masterich möchte diese Unterschiede für masterund einen anderen Zweig sehen test-branch. Könnten Sie Ihre Antwort auf dieses Problem neu formatieren?
Gabriel
Der Unterschied in den Revisionen "hinten" und "vorne" funktioniert bei mir nur, wenn ich 3 Punkte zwischen den Zweignamen verwende (nicht 2). Und das ^ und ^^ schien hier keine Rolle zu spielen. ZB: git diff master ... origin / master git diff origin / master ... master Wie auch immer, "git status -sb" war sehr hilfreich.
Vituel
10

Mit Git 2.5+ haben Sie jetzt eine weitere Option, um für alle Zweige, die so konfiguriert sind, dass sie auf einen Zweig übertragen werden, vorwärts / rückwärts zu sehen.

git for-each-ref --format="%(push:track)" refs/heads

Weitere Informationen finden Sie unter " Anzeigen nicht gepusster Git-Commits ".

VonC
quelle
Könnten Sie dies nur für den aktuellen Zweig und seinen Remote-Tracking-Zweig tun?
Spex
@spex ja: komplett refs/headsmit dem Namen der aktuellen Niederlassung ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Sie können es auch verwenden awk, um es etwas schöner zu machen:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Sie können sogar einen Alias ​​erstellen, der immer zuerst den Ursprung abruft und dann die Zweige vergleicht

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
quelle
1

Nach einem Git-Abruf können Sie den Git-Status ausführen, um anzuzeigen, wie viele Commits der lokale Zweig vor oder hinter der Remote-Version des Zweigs liegt.

Dies zeigt Ihnen jedoch nicht, wie viele Commits vor oder hinter einem anderen Zweig liegen. Ihre Optionen sind der volle Unterschied, wenn Sie sich Github ansehen oder eine Lösung wie Vimhsa verwenden, die oben verlinkt ist: Git-Status über alle Repos

Wade Williams
quelle