Vous m'avez demandé de tirer sans me dire avec quelle branche vous souhaitez fusionner

125

TL; DR: J'ai une branche "suivie" que je ne peux pas extraire.

Me voici donc dans "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

Je souhaite apporter des modifications à partir de ma télécommande:

$ 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, bizarre, je pensais avoir déjà ajouté "bucket-4" comme branche de suivi. Voyons voir:

$ 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)

En effet, le bucket-4 est marqué comme "suivi", mais il est configuré pour pousser, mais pas tirer.

En regardant mon .git/configfichier, je vois que j'ai des entrées "remote" et "merge" pour la plupart de mes branches, mais pas pour bucket-4. Comment est-il même considéré comme «suivi» sans cela?

[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

Je vois que la solution probable ici est d'ajouter des remote/mergeentrées pour bucket-4 dans mon fichier de configuration. Mais comment est-il considéré comme «suivi» sans cela? bucket-4 a été créé localement, puis poussé vers le serveur à partir de ce dépôt, donc je soupçonne que d'une manière ou d'une autre, je n'ai pas configuré le suivi correctement pour cette branche.

Y a-t-il une configuration que je peux ajouter pour que toutes les succursales locales suivent correctement leurs télécommandes à l'avenir?

George Armhold
la source
2
Cette question m'a orienté dans la bonne direction, je devais juste ajouter une entrée dans mon fichier .git / config pour la branche que j'essayais de tirer, puis cela a bien fonctionné.
M. Bungle
Oui moi aussi, et la façon de le faire est comme Mark Longair décrit ci-dessous avec git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Réponses:

191

Cela dit bucket-4 pushes to bucket-4simplement parce que la valeur par défaut lors de la poussée d'une branche est de la pousser vers une avec un nom correspondant sur la télécommande. (Notez que c'est toujours la valeur par défaut, même si la branche locale suit une branche de suivi à distance et que la branche de suivi à distance correspond à une branche avec un nom différent dans le référentiel distant.)

Le moyen le plus simple de configurer l'association entre votre bucket-4et bucket-4in originest de vous assurer que la prochaine fois que vous poussez, vous faites:

git push -u origin bucket-4

Alternativement, vous pouvez faire:

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

Pour répondre directement à quelques questions:

Comment est-il même considéré comme «suivi» sans cela?

Dans ce cas, ce n'est pas le cas - il ne suit en aucun cas la branche de suivi à distance s'il n'y en a pas branch.bucket-4.mergeou branch.bucket-4.remotedans votre configuration git. La sortie de git remote show originvous montre simplement où la branche serait poussée par défaut.

Y a-t-il une configuration que je peux ajouter pour que toutes les succursales locales suivent correctement leurs télécommandes à l'avenir?

Je ne pense pas qu'il y en ait. Lorsque vous avez créé bucket-4localement, comme je suppose que cela s'est produit, la branche de suivi à distance n'existait pas, elle ne peut donc pas être configurée à ce stade - ce serait un comportement par défaut très déroutant. Vous devez juste vous rappeler d'ajouter -uvotre première git pushbranche à son référentiel en amont.

J'espère que cela vous aidera.

Mark Longair
la source
7
git branch --set-upstreama parfaitement fonctionné pour moi avant de faire le pull
ohaal
git branch --set-upstream bucket-4 origin / bucket-4 a fonctionné pour moi :-)
Aliza
Et si vous ne voulez pas pousser? J'ai ce même problème mais je ne veux pas pousser du repo sur lequel ce problème se produit. Je viens de changer d'origines distantes et je veux afficher la dernière HEAD pour la branche qui n'est apparemment plus suivie (même si elle a été suivie avant que je change l'origine distante). En fin de compte, j'ai supprimé le clone problématique et re-cloné à partir de la nouvelle origine.
géoidesique du
1
En fait, lorsque git --set-upstream <branch> origin/<branch>vous essayez, vous obtenez une erreur car l'indicateur est obsolète. Il est recommandé d'utiliser git branch --track origin/<branch>ou --set-upstream-tocomme deuxième réponse suggérée. Je suppose que la réponse pourrait être mise à jour, @MarkLongair?
AymDev
Merci pour la suggestion, @AymDev - j'ai fait ce changement.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> était obsolète au moins à partir du 1.8.2.3 (ma version).

Utilisez git branch --set-upstream-to=origin/<branch> <branch>plutôt.

d_roge
la source
2
Vouliez-vous que ce soit un commentaire sur la réponse de Mark ? En outre, il était en fait obsolète dans la version 1.8.0 de Git .