878 votes

Git pull une certaine branche de GitHub

J'ai un projet avec plusieurs branches. Je les ai poussées vers GitHub et maintenant que quelqu'un d'autre travaille sur le projet, je dois extraire ses branches de GitHub. Cela fonctionne bien dans master. Mais disons que quelqu'un a créé une branche xyz . Comment puis-je tirer la branche xyz de GitHub et le fusionner dans la branche xyz sur mon localhost ?

En fait, j'ai ma réponse ici : Pousser et tirer des branches dans Git

Mais je reçois une erreur " ! [rejected]" et quelque chose à propos de "non fast forward".

Des suggestions ?

4 votes

Quelle est la commande que vous exécutez ?

1 votes

C'est fetch qui peut échouer avec le message 'non fast forward'. Avez-vous modifié la branche de suivi à distance (origin/xyz), ou la branche a-t-elle été remontée / réécrite dans le dépôt distant ? Vous pourriez avoir besoin d'utiliser " git fetch origin --force "mais veuillez lire la documentation avant de le faire.

1014voto

mipadi Points 135410

Mais je reçois une erreur " ! [rejected]" et quelque chose à propos de "non fast forward".

C'est parce que Git ne peut pas fusionner les changements des branches dans votre master actuel. Disons que vous avez extrait la branche master et vous voulez fusionner dans la branche distante. other-branch . Lorsque vous faites cela :

$ git pull origin other-branch

C'est ce que fait Git :

$ git fetch origin other-branch && git merge other-branch

C'est-à-dire qu'un pull est juste un fetch suivi d'un merge . Cependant, lorsque pull -ing, Git will uniquement fusionner other-branch si il peut effectuer un avance rapide fusionner. A avance rapide est une fusion dans laquelle la tête de la branche dans laquelle vous essayez de fusionner est une descendant direct de la tête de la branche que vous voulez fusionner. Par exemple, si vous avez cet arbre d'histoire, alors fusionner other-branch entraînerait une fusion en avance rapide :

O-O-O-O-O-O
^         ^
master    other-branch

Cependant, cela pas être une fusion rapide :

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Pour résoudre votre problème, commencez par aller chercher la branche distante :

$ git fetch origin other-branch

Ensuite, fusionnez-la dans votre branche actuelle (je suppose que c'est la suivante master ), et corrige les éventuels conflits de fusion :

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

0 votes

Non, le problème vient de l'extraction, pas de l'étape de fusion.

3 votes

Normalement, les remotes sont configurés de telle sorte que les fetchs sont forcés, même s'ils ne résultent pas en un commit fast-forward, donc cela ne devrait pas se produire lors d'un fetch, à moins que le PO ait changé quelque chose dans la configuration habituelle. Le problème de fast-forward peut se produire pendant le fetch. ou la fusion. Qu'est-ce qui vous fait dire que le problème se situe définitivement au niveau de la récupération et non de la fusion ?

0 votes

Je suis ces étapes (fetch, merge). Git me dit qu'il n'y a rien à faire. Quand j'essaie de commiter, il tombe en se lamentant sur les avances rapides.

375voto

innaM Points 22831

Il suffit de suivre explicitement vos branches distantes et une simple git pull fera exactement ce que vous voulez :

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Cette dernière est une opération locale.

Ou encore plus en accord avec le Documentation GitHub sur la bifurcation :

git branch -f new_local_branch_name upstream/remote_branch_name

49 votes

Si vous obtenez 'Not a valid object name : 'origin/remote_branch_name', faites d'abord 'git fetch origin'.

208voto

Robert Cabri Points 1445

Vous pouvez tirer une branche vers une branche avec les commandes suivantes.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Lorsque vous êtes sur la branche master, vous pouvez aussi commencer par vérifier une branche comme :

git checkout -b xyz

Cela crée une nouvelle branche, "xyz", à partir du master et la vérifie directement.

Alors vous le faites :

git pull origin xyz

Cela tire la nouvelle branche vers votre local xyz branche.

2 votes

Parfait ! Je ne connaissais pas cette syntaxe : git pull {repo} {remotebranchname}:{localbranchname}. Question : si ce pull ne fonctionne pas (peut-être que quelqu'un a mis à jour la branche et qu'il y a des conflits de fusion), quelles sont mes options ?

11 votes

Je vote contre cette méthode parce qu'elle tente de fusionner la branche distante dans votre branche actuelle (par exemple master). Ce n'est pas ce que la plupart des gens veulent faire, et ce n'est pas ce que le PO a demandé. La réponse de @mohit est le bon choix.

2 votes

Phrogz - il semble que ce comportement ait changé dans les versions récentes de Git. J'ai utilisé cette méthode auparavant et cela fonctionnait parfaitement bien.

119voto

mohit Points 516

Le meilleur moyen est :

git checkout -b <new_branch> <remote repo name>/<new_branch>

2 votes

Après avoir créé une nouvelle branche "dev" sur github, et essayé ce qui précède, j'ai obtenu le message d'erreur suivant : "fatal : origin/dev is not a commit and a branch 'dev' cannot be created from it" La solution a été de "git fetch" selon la solution de Bradley Flood ci-dessous, puis de ré-exécuter la réponse de mohit.

44voto

Alex N. Points 2612

Je ne suis pas sûr de bien comprendre le problème, mais le retrait d'une branche existante se fait de la manière suivante (du moins, cela fonctionne pour moi :)

git pull origin BRANCH

Cela suppose que votre branche locale est créée à partir de l'origine/BRANCH.

2 votes

Cela permettra d'intégrer la branche dans votre branche locale actuelle, de sorte que lorsque vous êtes sur dev et à git pull origin feature il va tirer la branche de fonctionnalité dans dev . La personne qui a posé la question veut créer une nouvelle branche feature et de tirer sur cette branche

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