123 votes

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 retirer.

Me voici donc dans le "seau 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 que les changements soient effectués à 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: 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)

En effet, bucket-4 est marqué comme "tracked", mais il est configuré pour le push, mais pas pour le pull.

En regardant mon .git/config 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 = 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

Je vois que la solution probable ici est d'ajouter remote/merge 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 puisse ajouter pour que toutes les branches locales suivent correctement leurs télécommandes à l'avenir ?

188voto

Mark Longair Points 93104

Il est dit bucket-4 pushes to bucket-4 juste parce que le défaut quand on pousse une branche est de la pousser vers une branche avec un nom correspondant sur le distant. (Notez que c'est toujours 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 avec un nom différent dans le référentiel distant).

La façon la plus simple de mettre en place l'association entre vos bucket-4 y bucket-4 en origin est de s'assurer que la prochaine fois que tu pousses, tu le fais :

git push -u origin bucket-4

Vous pouvez aussi le faire :

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

Pour répondre directement à quelques-unes de vos questions :

Comment peut-on considérer qu'il y a des "traces" sans ça ?

Dans ce cas, ce n'est pas le cas - il ne suit pas la branche de suivi à distance dans aucun sens s'il n'y a pas de branch.bucket-4.merge o branch.bucket-4.remote dans votre configuration git. La sortie de git remote show origin vous montre juste où la branche sera poussée par défaut.

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

Je ne pense pas qu'il y en ait. Quand vous avez créé bucket-4 localement, 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 moment-là - ce serait un comportement par défaut très déroutant. Vous devez juste vous rappeler d'ajouter -u à votre première git push de cette branche vers son dépôt amont.

J'espère que cela vous aidera.

6voto

d_roge Points 1

git branch --set-upstream <branch> origin/<branch> a été déprécié au moins à partir de la version 1.8.2.3 (ma version).

Utilisez git branch --set-upstream-to=origin/<branch> <branch> à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X