Finden Sie heraus, welchen Remote-Zweig ein lokaler Zweig verfolgt

842

Siehe auch:
Wie kann ich sehen, welche Git-Zweige welchen Remote- / Upstream-Zweig verfolgen?

Wie kann ich herausfinden, welchen Remote-Zweig ein lokaler Zweig verfolgt?

Muss ich die git configAusgabe analysieren oder gibt es einen Befehl, der dies für mich erledigt?

Schreibgeschützt
quelle
18
Meine Güte. Dies ist kein genaues Duplikat. Dies ist eine Teilmenge der anderen, aber es gibt auch andere Möglichkeiten, die Frage zu beantworten git remote show origin. Die Hauptantwort in der anderen Frage ist ein Bash-Skript, das sich um die einfache Antwort hier dreht, was für einige nützlich sein könnte. Hoffentlich wird diese Frage nicht vollständig geschlossen.
cdunn2001
5
Einverstanden, das sollte definitiv kein Betrug sein. Es stellt etwas völlig anderes als die verknüpfte Frage
Adam Batkin

Antworten:

1003

Hier ist ein Befehl, der Ihnen alle Tracking-Zweige gibt (konfiguriert für 'Pull'), siehe:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Sie müssen durch die SHA und alle langwierigen Commit-Nachrichten waten, aber es ist schnell zu tippen und ich bekomme die Tracking-Zweige vertikal in der 3. Spalte ausgerichtet.

Wenn Sie Informationen zur Konfiguration "Ziehen" und "Drücken" pro Zweig benötigen, lesen Sie die andere Antwort unter git remote show origin.


Aktualisieren

Ab Git Version 1.8.5 können Sie den Upstream-Zweig mit git statusund anzeigengit status -sb

jdsumsion
quelle
6
Diese Ausgabe ist direkter als git branch -avoder git remote show origin, was Ihnen eine
Menge
60
Übrigens, die neuesten Versionen von git (1.8.5.x) zeigen jetzt auch den Upstream-Zweig während git statusund git status -sb- sobald Sie auf 1.8.5.x aktualisieren, ist diese Frage (und Antwort) irrelevant.
jdsumsion
11
Dies gibt Ihnen zwar die gewünschten Informationen, aber ich würde dem nicht zustimmen, da dies die richtige Antwort ist. Es ist eine Antwort auf die gleiche Weise, wie man jemandem ein Wörterbuch gibt und antwortet: "Wie schreibt man XYZ?". In diesem Fall möchten Sie die resultierende Antwort (den Filialnamen) für eine Operation verwenden. Diese Antwort hilft mir nur, sie visuell zu sehen. Sie erhalten in einem nachfolgenden Befehl nichts, was Sie verwenden können.
UpAndAdam
Die Ausgabe dieses Befehls kann irreführend sein, da eine Festschreibungsnachricht leicht mit beispielsweise "[my-feature] ..." beginnen kann. Bitte lesen Sie die Antwort von @ cdunn2001, in der nur der Upstream-Zweig (falls vorhanden) und sonst nichts angezeigt wird.
Jonas Berlin
1
Ich stimme @ jonas-berlin zu - die Antwort von cdunn2001 ist besser, wenn Sie das Ergebnis analysieren möchten - meine Antwort ist gut, wenn Sie nach einem einfachen Befehl suchen und bereit sind, die Ausgabe visuell zu scannen
jdsumsion
372

Zwei Möglichkeiten:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

oder

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline
cdunn2001
quelle
12
Nett! Der erste gibt hässliche Fehler, falls nichts verfolgt wird, während der zweite besonders für die Skripterstellung hilfreich ist. Übrigens %(refname:short)ist der Name der aktuellen Referenz innerhalb --format.
Tino
9
git help revisions(einer der wenig bekannten, aber nützlichsten Teile der Dokumente) und suchen nach upstream.
cdunn2001
15
Diese Antwort ist viel besser als die beiden Antworten darüber, besonders wenn Sie etwas tun möchten wiegit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian
2
Das ist wirklich nützlichecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
Albfan
6
Wenn Sie den Upstream für eine andere Filiale herausfinden möchten, ist eine Variante der zweiten Wahl: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)Ersetzen von SOMEBRANCH durch den Filialnamen oder "HEAD" für die aktuelle Filiale
Jonas Berlin
220

Ich denke git branch -av, es sagt Ihnen nur, welche Filialen Sie haben und bei welchem ​​Commit sie sich befinden, sodass Sie ableiten können, welche Remote-Filialen die lokalen Filialen verfolgen.

git remote show originteilt Ihnen explizit mit, welche Zweige welche entfernten Zweige verfolgen. Hier ist eine Beispielausgabe aus einem Repository mit einem einzelnen Commit und einem Remote-Zweig namens abranch:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

gegen

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)
Ajit George
quelle
3
Ich brauche einen Befehl, der den Upstream-Zweig erkennt.
Alexander Mills,
1
Aber das beantwortet das OP. Der Befehl git remote show originzeigt Ihnen lokale Zweige und was sie für Push und Pull verfolgen.
Dudewad
1
@dudewad Ich denke, der Punkt war, dass dieser Befehl davon ausgeht, dass die Fernbedienung aufgerufen wird origin, während es sich tatsächlich um alles handeln kann (z. B. mehrere Fernbedienungen, wobei verschiedene Zweige Zweige von verschiedenen Fernbedienungen verfolgen).
Ruslan
74

Update: Nun, es ist einige Jahre her, seit ich das gepostet habe! Für meinen speziellen Zweck, HEAD mit Upstream zu vergleichen, verwende ich jetzt @{u}eine Verknüpfung, die sich auf den HEAD des Upstream-Tracking-Zweigs bezieht. (Siehe https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Ursprüngliche Antwort: Ich bin auch auf dieses Problem gestoßen. Ich verwende oft mehrere Fernbedienungen in einem einzigen Repository, und es ist leicht zu vergessen, gegen welche Ihre aktuelle Niederlassung verfolgt. Und manchmal ist es praktisch, das zu wissen, beispielsweise wenn Sie sich Ihre lokalen Commits über ansehen möchten git log remotename/branchname..HEAD.

All dieses Zeug ist in Git-Konfigurationsvariablen gespeichert, aber Sie müssen die Git-Konfigurationsausgabe nicht analysieren. Wenn Sie git config gefolgt vom Namen einer Variablen aufrufen, wird nur der Wert dieser Variablen gedruckt, ohne dass eine Analyse erforderlich ist. In diesem Sinne finden Sie hier einige Befehle, um Informationen zum Tracking-Setup Ihrer aktuellen Niederlassung zu erhalten:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

In meinem Fall mache ich Folgendes, da ich nur daran interessiert bin, den Namen meiner aktuellen Fernbedienung herauszufinden:

git config branch.`git name-rev --name-only HEAD`.remote
Aaron Wells
quelle
2
Dies war sehr nützlich, um einen Alias ​​zu erstellen, um die Basis meines aktuellen Zweigs neu zu bestimmen. Vielen Dank!
Justin Spahr-Summers
Ebenso nützlich für unseren Alias ​​"Schnellvorlauf", mit dem der lokale Verfolgungszweig zur Fernbedienung weitergeleitet wird, solange es sich um einen Schnellvorlauf handelt.
Altreus
4
Eigentlich habe ich festgestellt, dass dies git name-rev --name-only HEADIhnen nicht sagt, auf welchem ​​Zweig Sie sich tatsächlich befinden. Dafür habe ich gerade verwendetgit branch | grep '^\*' | cut -d' ' -f2
Altreus
1
Vielen Dank! Andere Antworten auf ähnliche Fragen erwähnten keinen @{u}Alias ​​/ keine Verknüpfung und genau das suchte ich! Kein Grund zum Vergleich mit dem Hauptzweig, wenn Sie nur feststellen möchten, ob Sie ziehen müssen oder nicht.
Dan M.
1
@{u}ist die Bombe. Und gibt es seit 1.7.0, was bedeutet, dass wenn es nicht in einem Git verfügbar ist, das jemand im Jahr 2018 verwendet, wahrscheinlich ein Upgrade ansteht.
Chris Cleeland
48

Die lokalen Niederlassungen und ihre Fernbedienungen.

git branch -vv 

Alle Filialen und Tracking-Fernbedienungen.

git branch -a -vv

Sehen Sie, wo die lokalen Zweige explizit für Push und Pull konfiguriert sind.

git remote show {remote_name}
nikkypx
quelle
21

Dies zeigt Ihnen den Zweig, in dem Sie sich befinden:

$ git branch -vv

Dies zeigt nur den aktuellen Zweig an, in dem Sie sich befinden:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

zum Beispiel:

myremote/mybranch

Sie können die URL der Fernbedienung ermitteln , die von dem aktuellen Zweig verwendet wird, in dem Sie sich befinden:

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

zum Beispiel:

https://github.com/someone/somerepo.git
rubo77
quelle
19

Sie können verwenden git checkout, dh "Überprüfen Sie den aktuellen Zweig". Dies ist ein No-Op mit Nebenwirkungen, um die Tracking-Informationen für den aktuellen Zweig anzuzeigen, falls vorhanden.

$ git checkout 
Your branch is up-to-date with 'origin/master'.
Eugene Yarmash
quelle
17

Ich weiß nicht, ob dies als Analyse der Ausgabe von git config gilt, aber dies bestimmt die URL der Fernbedienung, die der Master verfolgt:

$ git config remote. $ (git config branch.master.remote) .url
William Pursell
quelle
Oder git config branch.$(git symbolic-ref -q HEAD).remotewenn Sie nur den Namen der Fernbedienung des aktuellen Zweigs verfolgen möchten - git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlfür die URL.
Anakhand
Ich musste eine --shortOption hinzufügen, damit es funktioniert. Also, um den Remote-Namen des aktuellen Zweigs zu erhalten: git config branch.$(git symbolic-ref -q --short HEAD).remoteund um die URL der Remote des aktuellen Zweigs zu erhalten:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson
13

Noch ein anderer Weg

git status -b --porcelain

Das wird dir geben

## BRANCH(...REMOTE)
modified and untracked files
FragLegs
quelle
10

Eine andere einfache Möglichkeit ist die Verwendung

cat .git/config in einem Git Repo

Hier werden Details für lokale Niederlassungen aufgelistet

Trickmaster
quelle
Funktioniert gut unter Linux. Funktioniert unter Windows nur in einer Unix-ähnlichen Eingabeaufforderung (z. B. Cygwin oder Git Bash).
Contango
In Windows einfach type .git/configanstelle von cat .git/confignatürlich auf einfacher Befehlszeile verwenden ..
khmarbaise
9

Eine andere Methode (danke osse), wenn Sie nur wissen möchten, ob sie existiert oder nicht:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
Wayne Walker
quelle
Welche Sprache? Dies sieht aus wie ein Linux-Shell-Skript, enthält jedoch keine weiteren Informationen oder Zusammenhänge.
Suncat2000
8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : In diesem Teil werden alle lokalen Niederlassungen zusammen mit ihrer vorgelagerten Niederlassung angezeigt.

grep 'BRANCH_NAME' : Es wird der aktuelle Zweig aus der Zweigliste gefiltert.

Sabyasachi Ghosh
quelle
7
git branch -r -vv

listet alle Zweige einschließlich Remote auf.

Ranushka Goonesekere
quelle
5

Listet sowohl lokale als auch entfernte Zweigstellen auf:

$ git branch -ra

Ausgabe:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
joseluisq
quelle
3

Die Ausgabe von g2-status porcelain (maschinenlesbar) v2 sieht folgendermaßen aus:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

Und um den Zweig nur stromaufwärts zu bringen:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

Wenn der Zweig keinen Upstream hat, erzeugt der obige Befehl eine leere Ausgabe (oder schlägt mit fehl set -o pipefail).

AndiDog
quelle
2

Wenn Sie den Upstream für einen Zweig finden möchten (im Gegensatz zu dem, in dem Sie sich gerade befinden), finden Sie hier eine geringfügige Änderung der Antwort von @ cdunn2001:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

Dadurch erhalten Sie den Namen des Remote-Zweigs für den genannten lokalen Zweig YOUR_LOCAL_BRANCH_NAME.

Jeremy Thomerson
quelle
2

Sie können dies versuchen:

git remote show origin | grep "branch_name"

branch_name muss durch Ihre Niederlassung ersetzt werden

xpioneer
quelle
Was passiert, wenn Ihr Filialname auch mit anderen Filialen übereinstimmt? Was passiert, git remote show originwenn Ihr Filialname mit einem anderen Text in der Ausgabe von übereinstimmt - wenn er aufgerufen wird mergesoder configure?
Tom Swirly
habe dich nicht verstanden.
Meinst
1

Ich benutze diesen Alias

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

dann

git track

Beachten Sie, dass das Skript auch zum Einrichten der Nachverfolgung verwendet werden kann.

Weitere großartige Aliase unter https://github.com/orefalo/bash-profiles

Olivier Refalo
quelle
0

Ich benutze EasyGit (auch bekannt als "eg") als superleichtes Wrapper auf (oder neben) Git. EasyGit verfügt über einen Unterbefehl "info", der Ihnen alle Arten von äußerst nützlichen Informationen bietet, einschließlich der aktuellen Zweigstelle für die Fernverfolgung. Hier ist ein Beispiel (wobei der aktuelle Filialname "foo" ist):

pknotz @ s883422: (foo) ~ / workspace / bd
$ zB info
Commits insgesamt: 175
Lokales Repository: .git
Benannte Remote-Repositorys: (Name -> Speicherort)
  origin -> git: //sahp7577/home/pknotz/bd.git
Aktueller Zweig: foo
  Kryptografische Prüfsumme (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Standard-Pull / Push-Repository: Ursprung
  Standardoptionen zum Ziehen / Drücken:
    branch.foo.remote = Ursprung
    branch.foo.merge = refs / Heads / aal_devel_1
  Anzahl der Mitwirkenden: 3
  Anzahl der Dateien: 28
  Anzahl der Verzeichnisse: 20
  Größte Dateigröße in Byte: 32473 (pygooglechart-0.2.0 / COPYING)
  Commits: 62
Pat Notz
quelle
0

Um diese Antwort zu verbessern , habe ich folgende .gitconfigAliase gefunden:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf
Tom Hale
quelle
Welche Sprache ist das?
Daniel Farrell
3
@ Dan Farrell: Shell. Aliase beginnend mit a! benutze / bin / sh. Die doppelten Anführungszeichen werden für die Konfigurationsdatei von git in Anführungszeichen gesetzt.
Tom Hale
0

Wenn Sie Gradle verwenden,

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }
Ravikanth
quelle
-2

Der folgende Befehl bezieht sich auf die aktuelle Gabel des Remote-Ursprungs

Git Remote -v

Zum Hinzufügen eines Remote-Pfads

git remote add origin path_name

Nagaraja G Devadiga
quelle
hier finden Sie keinen entfernten Pfad - Sie fügen hinzu
serup