web-dev-qa-db-fra.com

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

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

Alors me voilà 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

J'aimerais intégrer les modifications 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" en tant que branche de tracking. 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, Bucket-4 est marqué comme "suivi", mais il est en quelque sorte configuré pour Push, mais pas pour tirer.

En regardant mon .git/config, je vois que j’ai des entrées "distantes" et "fusionnées" pour la plupart de mes branches, mais pas pour le compartiment 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 remote/merge entré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 référentiel. Je suppose donc 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 afin de permettre à toutes les branches locales de suivre leurs télécommandes correctement à l'avenir?

123
George Armhold

Ça dit bucket-4 pushes to bucket-4 simplement parce que le choix par défaut lorsqu’une branche est poussé est de la pousser dans une branche avec un nom correspondant sur la télécommande. (Notez qu'il s'agit toujours de la valeur par défaut, même si la branche locale suit une branche de suivi à distance et la branche de suivi à distance correspond à une branche portant un nom différent dans le référentiel distant.)

La manière la plus simple de configurer l'association entre votre bucket-4 et bucket-4 dans Origin consiste à s'assurer que la prochaine fois que vous appuyez, vous effectuez les opérations suivantes:

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 - la trace de la branche de télé-suivi n'est en aucun cas suivie s'il n'y a pas de branch.bucket-4.merge ou branch.bucket-4.remote dans votre config git. La sortie de git remote show Origin montre simplement où la branche serait poussée par défaut.

Y a-t-il une configuration que je peux ajouter afin de permettre à toutes les branches locales de suivre leurs télécommandes correctement à l'avenir?

Je ne pense pas qu'il existe. Quand vous avez créé bucket-4 Localement, comme je suppose est arrivé, la branche de suivi à distance n'existait pas, il ne peut donc être mis en place à ce moment-là - il serait très déroutant comportement par défaut. Vous devez juste vous rappeler d'ajouter -u à votre premier git Push de cette branche vers son référentiel en amont.

J'espère que cela vous aidera.

187
Mark Longair

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

Utilisation git branch --set-upstream-to=Origin/<branch> <branch> au lieu.

5
d_roge