Git tire une certaine branche de GitHub

631

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

J'ai en fait ma réponse ici: pousser et tirer des branches dans Git

Mais je reçois une erreur "! [Rejeté]" et quelque chose sur "pas d'avance rapide".

Aucune suggestion?

tybro0103
la source
3
quelle est la commande réelle que vous exécutez?
Alex N.10
1
C'est une extraction qui peut échouer avec un message «pas d'avance rapide». Avez-vous modifié la branche de suivi à distance (origine / xyz), ou la branche a-t-elle été rembobinée / réécrite dans le référentiel distant? Vous devrez peut-être utiliser " git fetch origin --force", mais veuillez lire la documentation avant de le faire.
Jakub Narębski

Réponses:

758

Mais je reçois une erreur "! [Rejeté]" et quelque chose sur "pas d'avance rapide"

C'est parce que Git ne peut pas fusionner les modifications des branches dans votre master actuel. Supposons que vous ayez extrait la branche masteret que vous souhaitiez fusionner dans la branche distante other-branch. Lorsque vous faites cela:

$ git pull origin other-branch

Git fait essentiellement ceci:

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

Autrement dit, un pullest juste un fetchsuivi d'un merge. Cependant, lorsque pull-ing, Git ne fusionnera que other-branch s'il peut effectuer une fusion à avance rapide . Une fusion à avance rapide est une fusion dans laquelle le chef de la branche dans laquelle vous essayez de fusionner est un descendant direct du chef de la branche dans laquelle vous souhaitez fusionner. Par exemple, si vous avez cet arbre d'historique, la fusion other-branchentraînerait une fusion rapide:

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

Cependant, ce ne serait pas une fusion rapide:

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

Pour résoudre votre problème, récupérez d' abord la branche distante:

$ git fetch origin other-branch

Ensuite, fusionnez-le dans votre branche actuelle (je suppose que c'est le cas 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!
mipadi
la source
Non, le problème vient de l'extraction, pas de l'étape de fusion.
Jakub Narębski
3
Normalement, les télécommandes sont configurées de telle sorte que les récupérations sont forcées, même si elles n'entraînent pas de validation d'avance rapide, donc elles ne devraient pas se produire lors de la récupération, sauf si l'OP a changé quelque chose avec la configuration habituelle. Le problème d'avance rapide peut se produire lors de l'extraction ou de la fusion. Qu'est-ce qui vous fait dire que le problème réside définitivement dans la récupération, et non dans la fusion?
mipadi
Je suis ces étapes (chercher, fusionner). Git me dit qu'il n'y a rien à faire. Quand j'essaye de m'engager, ça tombe sur des gémissements d'avance rapide.
Jean Jordaan
1
@mipadi J'ai eu le même problème que Jean et, même si je ne peux pas dire que la télécommande est configurée de la manière non par défaut que vous avez mentionnée, je peux dire que l'utilisation git fetch -fa résolu mon problème! Merci!
cregox
1
Cela fusionne la branche distante en branche xzylocale master, ce qui n'est pas ce qu'impliquait la question d'origine; "Comment puis-je extraire la branche xyz de GitHub et la fusionner dans la branche xyz sur mon hôte local?"
user5359531
302

Suivez simplement vos succursales distantes de manière explicite et un simple git pullfera exactement ce que vous voulez:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Ce dernier est une opération locale.

Ou encore plus en accord avec la documentation GitHub sur la fourche :

git branch -f new_local_branch_name upstream/remote_branch_name
innaM
la source
40
Si vous obtenez 'Nom d'objet non valide:' origin / nom_branche_distant ', faites d'abord' git fetch origin '.
Martin Konicek
131

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 principale, vous pouvez également d'abord extraire une branche comme:

git checkout -b xyz

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

Ensuite, vous faites:

git pull origin xyz

Cela tire la nouvelle branche vers votre xyzbranche locale .

Robert Cabri
la source
1
Parfait! Je ne connaissais tout simplement 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 aurait des conflits de fusion) quelles sont mes options?
Costa
7
Je downvoting cela parce qu'il tente de fusionner la branche distante dans votre branche actuelle (par exemple maître). 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.
Phrogz
1
Phrogz - on dirait que ce comportement a changé dans les versions récentes de Git. Je l'ai utilisé auparavant et cela a parfaitement fonctionné.
Pawan
89

La meilleure façon est:

git checkout -b <new_branch> <remote repo name>/<new_branch>
mohit
la source
1
Après avoir créé une nouvelle branche "dev" sur github et essayé ce qui précède, j'ai reçu le message d'erreur suivant: "fatal: origin / dev n'est pas un commit et une branche 'dev' ne peut pas être créée à partir de lui" La solution était de "git chercher "selon la solution de Bradley Flood ci-dessous, puis relancer la réponse de mohit.
TomEberhard
46

git fetch va récupérer la dernière liste de branches.

Maintenant vous pouvez git checkout MyNewBranch

Terminé :)


Pour plus d'informations, consultez la documentation: git fetch

Bradley Flood
la source
37

Je ne suis pas sûr de bien comprendre le problème, mais tirer une branche existante se fait comme ça (au moins ça marche pour moi :)

git pull origin BRANCH

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

Alex N.
la source
15

Cela m'a aidé à obtenir une branche distante avant de la fusionner dans d'autres:

git fetch repo xyz:xyz
git checkout xyz
anatoly techtonik
la source
8

Autrement dit, si vous voulez tirer de GitHub la branche the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want
Adrien Renaud
la source
3
git pull <gitreponame> <branchname>

Habituellement, si vous n'avez qu'un repo affecté à votre code, le gitreponame serait l'origine.

Si vous travaillez sur deux repo comme un local et un autre pour remote comme vous pouvez vérifier la liste des repo depuis git remote -v . cela montre combien de dépôts sont affectés à votre code actuel.

BranchName doit exister dans le gitreponame correspondant.

vous pouvez utiliser les deux commandes suivantes pour ajouter ou supprimer des repo

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
prathap
la source
2

vous pouvez aussi faire

git pull -r origin master

corriger les conflits de fusion, le cas échéant

git rebase --continue

-r est pour rebase. Cela vous fera une structure de branche

        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. Remarque: Si vous avez déjà poussé votre autre branche vers l'origine (ou toute autre télécommande), vous devrez peut-être forcer la poussée de votre branche après le rebase.

git push -f origin other-branch
PKV
la source
1

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. Quand j'ai utilisé la version en amont, il a dit 'fatal: Pas un nom d'objet valide:' upstream / remote_branch_name ''. Je n'ai pas fait git fetch origincomme un commentaire suggéré, mais plutôt simplement remplacé upstreampar origin. Je suppose qu'ils sont équivalents.

Vicky
la source
0

pour tirer la branche de GitHub, vous pouvez utiliser

git checkout --track origin/the-branch-name

Assurez-vous que le nom de la branche est exactement le même.

Fradely Code
la source