Wie kann man feststellen, welcher lokale Zweig welchen entfernten Zweig in Git verfolgt?

234

Ich würde gerne wissen, ob es eine Möglichkeit gibt, festzustellen, welcher lokale Zweig welchen entfernten Zweig in Git verfolgt.

Ich verwende einen Remote-Server mit dem Namen "origin".

PJ.
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber es ist kein entfernter Zweig, der standardmäßig den Namen origin trägt, und nicht der Server?
Chris Halcrow

Antworten:

196

Am Beispiel meiner Puppet-Kopie, die aus dem Upstream-Git-Repository auf Github.com ausgecheckt wurde ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Wenn ich dann folgendes ausführen würde:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

Führen Sie den git remote show originBefehl zum Schluss erneut aus. Dann wird unten unten Folgendes angezeigt:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
Jeremy Bouse
quelle
1
Das bedeutet also, dass Sie alle entfernten Niederlassungen in Puppet verfolgen können, obwohl Sie einige lokale Niederlassungen haben. Was bedeuten die vielen "verfolgten" Zeichen, die Sie im Ergebnis des Befehls sehen? Von welcher Zweigstelle "verfolgt"?
PJ.
Die entfernten Niederlassungen Verfolgt wird , dass , wenn Sie ein tun git fetchoder git pullAktualisierungen an die Remote - Niederlassungen in Ihrem geklonten Repository verfolgt werden. Die lokalen Zweige sind nur das, lokale Zweige der entfernten Zweige und somit Aktualisierungen der entfernten Zweige werden nachverfolgt und zusammengeführt, wenn der entsprechende Befehl dazu gegeben wird. Ich beziehe explizit die Option '-t' ein, wenn der lokale Zweig erstellt wird, um sicherzustellen, dass er den Zweig verfolgt, von dem er stammt. Denken Sie daran, dass eine lokale Niederlassung auch eine andere lokale Niederlassung nachverfolgen kann und keine entfernte Niederlassung sein muss.
Jeremy Bouse
5
@PJ: Der Begriff „Spur“ hat in Git zwei unterschiedliche Bedeutungen. Die "verfolgten" Zeilen in git remote show remote-namebeziehen sich auf "Verfolgen von Zweigen" (Schnappschüsse von Zweigen aus entfernten Repositorys). Die Zeilen „Zusammenführen mit“ beziehen sich auf lokale Zweige, die eine Konfiguration für „Upstream-Zweige“ aufweisen (erstellt mit der Option --track/ -tvon git branch oder git checkout und daher häufig mit „Tracking-Zweigen“ verwechselt).
Chris Johnsen
" Fernverfolgungszweig " ist der aktuelle Glossareintrag für "Verfolgungszweige", der oben erwähnt wurde. Das Dokument wurde in 8b3f3f84 aktualisiert .
ento
124

Für alle Branchen:

git branch -avv

Nur für lokale Niederlassungen:

git branch -lvv

Nur für entfernte Zweigstellen:

git branch -rvv

Zeigt Ihnen alle Filialen sowie den Namen der vorgelagerten Filiale an.

sunew
quelle
2
Dies ist mit Abstand die einfachste und umfassendste Antwort!
6
In der git-Version 1.7.7.5 werden der lokale Zweig und die sha-1 angezeigt, auf die es verweist, aber der verfolgte entfernte Zweig wird nicht
angezeigt
Funktioniert für mich mit Git-Version 1.7.4.1. Das zweite 'v' ist erforderlich, um den Remote-Tracking-Zweig anzuzeigen.
Peter Johnson
4
um die Ausgabe zu reduzieren, git branch -lvvkann es nützlich sein, nur lokale Zweige mit Upstream anzuzeigen
AB
5
^ Funktioniert git branch -vvfür mich ...
notacouch
52

Jeremy Bouse zeigt, wie git remote showTracking-Informationen angezeigt werden . Das sollte ausreichen, wenn Sie die Informationen nur für den menschlichen Verzehr benötigen.

Wenn Sie die Informationen in einem automatisierten Kontext (z. B. einem Skript) verwenden möchten, sollten Sie git for-each-refstattdessen die niedrigere Ebene („Sanitär“) verwenden.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

Die haben git for-each-refdas %(upstream)Token in Git 1.6.3 gelernt . In früheren Versionen von Git müssen Sie die Tracking-Informationen mit git config branch.<name>.remoteund extrahieren git config branch.<name>.merge(wahrscheinlich git for-each-refzum Erstellen der Befehle für jeden lokalen Zweignamen).

Chris Johnsen
quelle
Ihre Antworten sind viel prägnanter und leichter zu verfolgen, sodass Sie die
höchste Bewertung erhalten
Um es weniger prägnant, aber eine nette Art und Weise zur Verfügung stellen , um visuell zu überprüfen , dass Remote - Namen der gleichen wie die lokalen Zweignamen sind, eine gemeinsame git Gotcha: in bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
Wälzfräser
19

Für einen bestimmten Zweig können Sie git rev-parsemit dem Suffix @{u}oder @{upstream}auf dem Zweignamen Folgendes verwenden:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... oder für die Kurzform hinzufügen --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Sie können die branch@{upstream}Syntax im Allgemeinen überall dort verwenden, wo ein Commit erwartet wird.

Mark Longair
quelle
1
+1 Deine Antwort gab mir genau das, was ich brauchte: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, danke!
Tino
10

Ich verwende das folgende Shell-Skript (benannt git-tracks), um den Remote-Zweig anzuzeigen, der vom aktuellen Zweig verfolgt wird:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Dies könnte auch das erwähnte verwenden git for-each-ref, aber ich fand den direkten Zugriff etwas einfacher als das Filtern der Ausgabe für den aktuellen Zweig.

Ingo Karkat
quelle
Sie könnten erwägen, "set -e" am oberen Rand des Skripts zu verwenden. So können Sie alle Instanzen von "|| exit $?" bei gleichem Fail-Early-Verhalten.
John Whitley
@ JohnWhitley: Danke, ich habe meine Antwort bearbeitet. Ich kenne mich aus, halte mich set -eaber normalerweise an die explizite Prüfung. Aber in diesem Fall ist es wirklich besser.
Ingo Karkat
Ich arbeite nicht an git version 1.9.4. Echos nichts :(
Ain
8

.git/config Die Datei enthält auch die Informationen zum Verfolgungszweig als

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*
Karthik
quelle
5
git branch -vv

zeigt genau das, wonach du fragst. Es zeigt die lokalen Zweige zusammen mit dem entsprechenden Remote-Zweig, den sie verfolgen.

Jarl
quelle
2

Fügen Sie diese Runen zum [alias]Abschnitt Ihrer .gitconfig-Datei hinzu:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'
DaveR
quelle
0

Ich musste den entsprechenden Remote-Zweig (falls vorhanden) für jeden lokalen Zweig in einer Schleife finden, die auf eine Liste der lokalen Zweige reagierte. Am Ende habe ich Folgendes verwendet:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Dies wird nichts (eine leere Zeichenkette) für lokale Zweige ausgeben, die keinen entsprechenden entfernten Zweig haben ("someremote / somebranch").

Ville
quelle
-1

Versuchen Sie es git branch mit Optionen :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

Andernfalls überprüfen Sie Ihre .git/config.

Andrew
quelle
3
Sie zeigen Zweige, aber ich verstehe nicht, welcher welche verfolgt.
PJ.