Git tirer une certaine branche de GitHub

j'ai un projet avec plusieurs branches. Je les ai poussés à GitHub , et maintenant que quelqu'un d'autre travaille sur eux je dois faire une traction de GitHub. Il fonctionne très bien en maître. Mais disons que j'ai la branche xyz. Comment puis-je extraire la branche xyz de GitHub et la fusionner en la branche xyz sur mon serveur local?

j'ai en fait ma réponse ici: Pousser et à tirer des branches de Git

Mais j'obtiens une erreur "! "et quelque chose à propos de "non fast forward".

des suggestions?

454
demandé sur Community 2009-11-10 19:18:21

10 réponses

Mais j'obtiens une erreur "! [rejeté] "et quelque chose à propos de" non fast forward "

c'est parce que Git ne peut pas fusionner les changements des branches dans votre maître actuel. Disons que vous avez vérifié la branche master , et que vous souhaitez fusionner dans la branche distante other-branch . Quand vous faites ceci:

$ git pull origin other-branch

Git est essentiellement cela:

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

C'est-à-dire, un pull n'est qu'un fetch suivi d'un merge . Toutefois, lorsque pull -ing, Git sera seulement fusionner other-branch si il peut effectuer une fast-forward fusionner. Un avance rapide", 1519250920" fusion est une fusion dans laquelle la tête de la direction générale, vous êtes en essayant de fusionner en est un descendant direct de la tête de la branche que vous souhaitez fusionner. Par exemple, si vous avoir cet arbre de l'histoire, puis la fusion other-branch se traduirait par une fusion rapide en avant:

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

Cependant, ce serait pas être un fast-forward de fusion:

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

pour résoudre votre problème, d'abord fetch la branche distante:

$ git fetch origin other-branch

alors fusionnez-le dans votre branche actuelle (je suppose que c'est master ), et corrigez tout conflit de fusion:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
535
répondu mipadi 2009-11-10 19:17:47

tracez simplement vos branches distantes explicitement et un simple git pull fera exactement ce que vous voulez:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

ou encore plus conforme à la documentation GitHub sur la fourche :

git branch -f new_local_branch_name upstream/remote_branch_name
259
répondu innaM 2016-02-12 22:26:59

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

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

git pull origin xyz:xyz

quand vous êtes sur la branche principale, vous pouvez également d'abord vérifier une branche comme:

git checkout -b xyz

cela crée une nouvelle branche," xyz", du master et le vérifie directement.

alors vous faites:

git pull origin xyz

cela attire la nouvelle branche vers votre branche locale xyz .

97
répondu Robert Cabri 2016-02-12 22:25:15

La meilleure façon est:

git checkout -b <new_branch> <remote repo name>/<new_branch>
71
répondu mohit 2016-02-12 22:27:40

Je ne suis pas sûr de bien comprendre le problème, mais tirer une branche existante est fait comme ceci (au moins cela fonctionne pour moi:)

git pull origin BRANCH

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

29
répondu Alex N. 2016-02-12 22:23:03

git fetch affichera la dernière liste des succursales.

Maintenant vous pouvez git checkout MyNewBranch

fait :)


pour plus d'informations voir docs: git fetch

27
répondu Bradley Flood 2015-02-27 05:38:00

cela m'a aidé à obtenir la branche distante avant de la fusionner dans une autre:

git fetch repo xyz:xyz
git checkout xyz
8
répondu anatoly techtonik 2016-02-15 21:25:49
git pull <gitreponame> <branchname>

habituellement, si vous n'avez que repo assigné à votre code, alors le nom de gitreponame serait origin.

si vous travaillez sur deux repo comme l'un est local et un autre pour remote comme vous pouvez vérifier la liste de repo de git remote-v . Ceci indique combien de pensions sont attribuées à votre code actuel.

BranchName devrait exister dans gitreponame correspondant.

vous pouvez utiliser ce qui suit deux commandes pour ajouter ou supprimer

"
git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
2
répondu prathap 2017-12-08 04:27:00

, vous pouvez aussi le faire

git pull -r origin master

corriger les conflits de fusion s'il y en a

git rebase --continue

- r pour rebase. Cela vous fera la structure de branche de

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

à

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

cela conduira à une histoire plus propre. Note: dans le cas où vous avez déjà poussé votre autre-branche à l'origine( ou toute autre télécommande), vous devrez peut-être forcer la poussée de votre branche après rebase.

git push -f origin other-branch
1
répondu PKV 2017-08-28 09:10:46

j'ai fait

git branch -f new_local_branch_name origin/remote_branch_name

au lieu de

git branch -f new_local_branch_name upstream/remote_branch_name

comme suggéré par @innaM. Lorsque j'ai utilisé la version en amont, il dit: "fatal: Pas un nom d'objet valide: "en amont/remote_branch_name". Je n'ai pas fait git fetch origin comme un commentaire suggéré, mais simplement remplacé upstream par origin . Je suppose qu'ils sont équivalents.

0
répondu Vicky 2018-07-25 15:44:58