Mi hai chiesto di tirare senza dirmi con quale ramo vuoi unirti


125

TL; DR: ho un ramo "tracciato" che non riesco a tirare.

Quindi eccomi qui 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

Vorrei inserire le modifiche dal mio telecomando:

$ 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, strano, pensavo di aver già aggiunto "bucket-4" come ramo di tracciamento. Vediamo:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:abcd/main.git
  Push  URL: git@github.com: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 effetti, bucket-4 è contrassegnato come "tracciato", ma in qualche modo è configurato per push, ma non pull.

Guardando il mio .git/configfile, vedo che ho voci "remote" e "merge" per la maggior parte dei miei rami, ma non per bucket-4. Come viene addirittura considerato "tracciato" senza questo?

[remote "origin"]
    url = git@github.com: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

Vedo che la probabile soluzione qui è aggiungere remote/mergevoci per bucket-4 nel mio file di configurazione. Ma come viene considerato "tracciato" senza questo? bucket-4 è stato creato localmente, quindi trasferito al server da questo repository, quindi sospetto che in qualche modo non abbia impostato correttamente il tracciamento per questo ramo.

C'è qualche configurazione che posso aggiungere per fare in modo che tutte le filiali locali seguano correttamente i telecomandi in futuro?


2
Questa domanda mi ha indicato la giusta direzione, dovevo solo aggiungere una voce nel mio file .git / config per il ramo che stavo cercando di estrarre, quindi ha funzionato bene.
Mr. Bungle,

Anche a me, e il modo per farlo è come Mark Longair ha descritto di seguito con git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman,

Risposte:


191

Dice bucket-4 pushes to bucket-4solo perché l'impostazione predefinita quando si spinge un ramo è di spingerlo a uno con un nome corrispondente sul telecomando. (Si noti che questo è ancora il valore predefinito, anche se il ramo locale sta monitorando un ramo di tracciamento remoto e il ramo di tracciamento remoto corrisponde a un ramo con un nome diverso nel repository remoto.)

Il modo più semplice per impostare l'associazione tra il tuo bucket-4e bucket-4in originè quello di assicurarsi che la prossima volta che si preme, si fa:

git push -u origin bucket-4

In alternativa, puoi fare:

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

Per rispondere direttamente a un paio di domande:

Come viene addirittura considerato "tracciato" senza questo?

In questo caso non lo è - non sta monitorando il ramo di tracciamento remoto in alcun senso se non c'è branch.bucket-4.mergeo branch.bucket-4.remotenella tua configurazione git. L'output di git remote show originsta solo mostrando dove il ramo verrebbe spinto di default.

C'è qualche configurazione che posso aggiungere per fare in modo che tutte le filiali locali seguano correttamente i telecomandi in futuro?

Non penso che ci sia. Quando hai creato bucket-4localmente, come suppongo sia accaduto, il ramo di tracciamento remoto non esisteva, quindi non può essere impostato a quel punto - sarebbe un comportamento predefinito molto confuso. Devi solo ricordare di aggiungere -ual tuo primo git pushdi quel ramo al suo repository a monte.

Spero che sia di qualche aiuto.


7
git branch --set-upstreamha funzionato perfettamente per me prima di fare il pull
ohaal il

git branch --set-upstream bucket-4 origin / bucket-4 ha funzionato per me :-)
Aliza

E se non vuoi spingere? Ho questo stesso problema ma non voglio spingere dal repository su cui si verifica questo problema. Ho appena cambiato origine remota e voglio eliminare l'ultima HEAD per il ramo che apparentemente non è più rintracciato (anche se è stato rintracciato prima di cambiare origine remota). Alla fine ho eliminato il clone problematico e ri-clonato dalla nuova origine.
geoidesic,

1
In realtà, quando provi git --set-upstream <branch> origin/<branch>, ricevi un errore perché il flag è deprecato. Si consiglia di utilizzare git branch --track origin/<branch>o --set-upstream-tocome suggerito dalla seconda risposta. Immagino che la risposta possa essere aggiornata, @MarkLongair?
AymDev,

Grazie per il suggerimento, @AymDev - Ho apportato questa modifica.
Mark Longair,

6

git branch --set-upstream <branch> origin/<branch> è stato deprecato almeno a partire dalla 1.8.2.3 (la mia versione).

Usa git branch --set-upstream-to=origin/<branch> <branch>invece.


2
Intendevi che questo fosse un commento sulla risposta di Mark ? Inoltre, in realtà era obsoleto in Git versione 1.8.0 .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.