web-dev-qa-db-fra.com

Git tire une certaine branche de GitHub

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, j'ai besoin de retirer leurs branches de GitHub. Cela fonctionne bien en maître. Mais disons que quelqu'un a créé une branche xyz. Comment puis-je extraire une branche xyz de GitHub et le fusionner en une branche xyz sur ma localhost?

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

Mais je reçois une erreur "! [Rejeté]" et quelque chose à propos de "non-avance rapide".

Aucune suggestion?

491
tybro0103

Mais je reçois une erreur "! [Rejeté]" et quelque chose à propos de "non-avance rapide"

En effet, Git ne peut pas fusionner les modifications des branches dans votre maître actuel. Supposons que vous ayez extrait la branche master et que vous souhaitiez fusionner dans la branche distante other-branch. Quand tu fais ça:

$ git pull Origin other-branch

Git fait essentiellement ceci:

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

Autrement dit, une pull est simplement une fetch suivie par une merge. Cependant, lorsque pulling, Git va seulement fusionner other-branchsi il pourra effectuer une fusion avance rapide. Une fusion {avance rapide} est une fusion dans laquelle la tête de la branche dans laquelle vous essayez de fusionner est un descendant direct de la tête de la branche que vous souhaitez fusionner. Par exemple, si vous avez cet arbre historique, la fusion de other-branch entraînerait une fusion rapide:

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

Cependant, ceci serait pas une fusion rapide:

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

Pour résoudre votre problème, commencez par récupérer la branche distante:

$ git fetch Origin other-branch

Puis fusionnez-le dans votre branche actuelle (je supposerai que c'est master) et corrigez les conflits de fusion:

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

Suivez simplement vos succursales distantes de manière explicite 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

Ce dernier est une opération locale.

Ou encore plus en accord avec la documentation GitHub sur le forking :

git branch -f new_local_branch_name upstream/remote_branch_name
268
innaM

Vous pouvez tirer une branche sur 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 commander une branche telle que:

git checkout -b xyz

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

Alors tu fais:

git pull Origin xyz

Cela ramène la nouvelle branche à votre branche xyz locale.

100
Robert Cabri

Le meilleur moyen est:

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

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

Maintenant vous pouvez git checkout MyNewBranch 

Terminé :)


Pour plus d'informations, voir docs: git fetch

32
Bradley Flood

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 branche locale est créée à partir de l’origine/BRANCH.

29
Alex N.

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

git fetch repo xyz:xyz
git checkout xyz
11
anatoly techtonik
git pull <gitreponame> <branchname>

Habituellement, si vous n'avez affecté que du référentiel à votre code, le nom de domaine est alors Origine.

Si vous travaillez sur deux référentiels, l'un étant local et l'autre distant, vous pouvez consulter la liste des référentiels depuis git remote -v . Cela indique combien de dépôts sont affectés à votre code actuel.

BranchName devrait 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>
2
prathap

vous pouvez aussi faire

git pull -r Origin master

résoudre les conflits de fusion, le cas échéant

git rebase --continue

-r est pour rebase . Cela vous donnera une 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. Remarque: Si vous avez déjà poussé votre autre branche vers Origin (ou toute autre télécommande), vous devrez peut-être forcer Push votre branche après le rebasement.

git Push -f Origin other-branch
1
PKV

En termes simples, si vous voulez extraire 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
0
Adrien Renaud

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’utilisais la version amont, il était écrit 'fatal: nom d’objet non valide:' upstream/remote_branch_name '' Je n'ai pas fait git fetch Origin comme commentaire suggéré, mais plutôt simplement remplacé upstream par Origin. Je suppose qu'ils sont équivalents.

0
Vicky