Sie haben mich gebeten, zu ziehen, ohne mir zu sagen, mit welchem ​​Zweig Sie fusionieren möchten

125

TL; DR: Ich habe einen "verfolgten" Zweig, den ich nicht ziehen kann.

Also hier bin ich in "Bucket-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Ich möchte Änderungen von meiner Fernbedienung übernehmen:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, seltsam, ich dachte, ich hätte bereits "Bucket-4" als Tracking-Zweig hinzugefügt. Mal schauen:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:abcd/main.git
  Push  URL: [email protected]:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

In der Tat ist Bucket-4 als "verfolgt" markiert, aber irgendwie ist es für Push, aber nicht für Pull konfiguriert.

Wenn ich .git/configmir meine Datei ansehe, sehe ich, dass ich für die meisten meiner Zweige "Remote" - und "Merge" -Einträge habe, aber nicht für Bucket-4. Wie wird es ohne dies überhaupt als "verfolgt" betrachtet?

[remote "origin"]
    url = [email protected]:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Ich sehe, dass die wahrscheinliche Lösung hier darin besteht, remote/mergeEinträge für Bucket-4 in meine Konfigurationsdatei einzufügen. Aber wie wird es ohne dies als "verfolgt" betrachtet? Bucket-4 wurde lokal erstellt und dann von diesem Repo auf den Server übertragen. Ich vermute also, dass ich das Tracking für diesen Zweig irgendwie nicht richtig eingerichtet habe.

Gibt es eine Konfiguration, die ich hinzufügen kann, damit alle lokalen Niederlassungen ihre Fernbedienungen in Zukunft ordnungsgemäß verfolgen können?

George Armhold
quelle
2
Diese Frage wies mich in die richtige Richtung. Ich musste nur einen Eintrag in meine .git / config-Datei für den Zweig einfügen, den ich abrufen wollte, dann funktionierte es einwandfrei.
Mr. Bungle
Yup ich auch, und der Weg, um das zu tun, ist wie Mark Longair unten beschrieben mit Git-Zweig - Set-Upstream Bucket-4 Ursprung / Bucket-4
Jonathon Horsman

Antworten:

191

Es sagt bucket-4 pushes to bucket-4nur , weil der Standard beim Schieben eines Zweig mit einem passenden Namen auf der Fernbedienung , um einen zu schieben ist. (Beachten Sie, dass dies immer noch die Standardeinstellung ist, auch wenn der lokale Zweig einen Remote-Tracking-Zweig verfolgt und der Remote-Tracking-Zweig einem Zweig mit einem anderen Namen im Remote-Repository entspricht.)

Der einfachste Weg, um die Zuordnung zwischen Ihrem bucket-4und bucket-4in einzurichten, originbesteht darin, sicherzustellen, dass Sie beim nächsten Druck Folgendes tun:

git push -u origin bucket-4

Alternativ können Sie Folgendes tun:

git branch --set-upstream-to origin/bucket-4

Um einige Ihrer Fragen direkt zu beantworten:

Wie wird es ohne dies überhaupt als "verfolgt" betrachtet?

In diesem Fall ist dies nicht der Fall - es wird in keiner Weise der Remote-Tracking-Zweig verfolgt, wenn keine branch.bucket-4.mergeoder branch.bucket-4.remotein Ihrer Git-Konfiguration vorhanden ist. Die Ausgabe von git remote show originzeigt Ihnen nur, wohin der Zweig standardmäßig verschoben wird.

Gibt es eine Konfiguration, die ich hinzufügen kann, damit alle lokalen Niederlassungen ihre Fernbedienungen in Zukunft ordnungsgemäß verfolgen können?

Ich glaube nicht, dass es das gibt. Wenn Sie bucket-4lokal erstellt haben , wie ich annehme, war der Remote-Tracking-Zweig nicht vorhanden, sodass er zu diesem Zeitpunkt nicht eingerichtet werden kann - dies wäre ein sehr verwirrendes Standardverhalten. Sie müssen nur daran denken, -uIhren ersten git pushZweig zu seinem Upstream-Repository hinzuzufügen .

Ich hoffe das hilft.

Mark Longair
quelle
7
git branch --set-upstreamarbeitete perfekt für mich vor den Zug zu tun
ohaal
Git Branch - Set-Upstream Bucket-4 Herkunft / Bucket-4 hat bei mir funktioniert :-)
Aliza
Was ist, wenn Sie nicht pushen wollen? Ich habe das gleiche Problem, möchte aber nicht aus dem Repo pushen, auf dem dieses Problem auftritt. Ich habe gerade den Remote-Ursprung gewechselt und möchte den neuesten HEAD für den Zweig abrufen, der anscheinend nicht mehr verfolgt wird (obwohl er verfolgt wurde, bevor ich den Remote-Ursprung gewechselt habe). Am Ende habe ich den problematischen Klon gelöscht und aus dem neuen Ursprung neu geklont.
Geoidesic
1
Tatsächlich erhalten Sie beim Versuch git --set-upstream <branch> origin/<branch>eine Fehlermeldung, da das Flag veraltet ist. Es wird empfohlen, git branch --track origin/<branch>oder --set-upstream-toals zweite Antwort vorgeschlagen. Ich denke, die Antwort könnte aktualisiert werden, @MarkLongair?
AymDev
Vielen Dank für den Vorschlag, @AymDev - ich habe diese Änderung vorgenommen.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> wurde mindestens ab 1.8.2.3 (meine Version) veraltet.

Verwenden Sie git branch --set-upstream-to=origin/<branch> <branch>stattdessen.

d_roge
quelle
2
Meinten Sie damit einen Kommentar zu Marks Antwort ? Außerdem war es in Git Version 1.8.0 veraltet .