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?
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!
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
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
.
La meilleure façon est:
git checkout -b <new_branch> <remote repo name>/<new_branch>
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.
git fetch
affichera la dernière liste des succursales.
Maintenant vous pouvez git checkout MyNewBranch
fait :)
pour plus d'informations voir docs: git fetch
cela m'a aidé à obtenir la branche distante avant de la fusionner dans une autre:
git fetch repo xyz:xyz
git checkout xyz
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>
, 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
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.