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?
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 pull
ing, Git va seulement fusionner other-branch
si 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!
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
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.
Le meilleur moyen est:
git checkout -b <new_branch> <remote repo name>/<new_branch>
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
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.
Cela m'a aidé à obtenir une branche distante avant de la fusionner en une autre:
git fetch repo xyz:xyz
git checkout xyz
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>
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
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
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.