Github: importer une branche amont dans fork

169

J'ai un fork ( origin) d'un projet ( upstream) sur github. Maintenant, le projet en amont a ajouté une nouvelle branche, je veux importer dans mon fork. Comment je fais ça?

J'ai essayé de vérifier la télécommande et de créer une branche en plus, mais cela configure la branche de la manière qui git pushessaie de pousser vers le upstream:

git checkout upstream/branch
git checkout -b branch

Éditer

Peut-être que ce n'était pas clair, mais je veux ajouter la branche à mon référentiel local, afin que je puisse la pousser vers origin(mon fork) via git push. Parce que les référentiels en amont sont généralement en lecture seule et que vous le divisez pour contribuer.

Donc, je veux essentiellement récupérer une branche inexistante origindont le contenu sera extrait upstream.

poussée
la source

Réponses:

262
  1. Assurez-vous d'avoir intégré la nouvelle branche en amont dans votre dépôt local :

    • Tout d'abord, assurez-vous que votre arbre de travail est propre (valider / cacher / annuler les modifications)
    • Ensuite, git fetch upstreampour récupérer la nouvelle branche amont
  2. Créez et passez à une version locale de la nouvelle branche amont ( newbranch):

    • git checkout -b newbranch upstream/newbranch
  3. Lorsque vous êtes prêt à pousser la nouvelle branche vers l' origine :

    • git push -u origin newbranch

Le commutateur -u configure le suivi vers la télécommande spécifiée (dans cet exemple, origin)

Urschrei
la source
6
Je pense que git fetch upstreamc'est une meilleure option à la première étape, car il git pull upstreamfaut faire plus d'actions après git remote add ...pour le upstream.
Alexander Pavlov
git pull upstream retourne: You asked to pull from the remote 'upstream', but did not specify a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line.L'ajout du nom de la branche à la fin de la commande provoque une fusion entre la branche en amont avec la branche locale courante au lieu de permettre la création d'une nouvelle branche locale. Des idées?
mMontu
1
Le remplacement git pull upstreampar a git fetch upstreamrésolu le problème et les étapes suivantes ont fonctionné.
mMontu
J'obtiens: fatal: impossible de mettre à jour les chemins et de basculer vers la branche «en amont» en même temps. Aviez-vous l'intention de récupérer 'upstream / master' qui ne peut pas être résolu en tant que commit?
sureshvv
1
@sureshvv C'est probablement parce que vous devez avoir une référence distante au référentiel en amont nommé en amont avant de faire quoi que ce soit. Si vous ne le faites pas, c'est ainsi que vous en ajoutez un: git remote add upstream your_git_upstream_repository_url.git . Lisez ceci si vous avez besoin d'éclaircissements à ce sujet.
Gabriel Rainha
7

j'utiliserais

git checkout -b <new_branch> upstream/<new_branch>
Svenito
la source
C'est en fait ce que j'ai essayé avant même ce que j'ai expliqué dans la question; cela conduit aux mêmes résultats.
poke
4

J'ai eu des problèmes avec ça aussi, et Google m'a emmené ici. Les solutions n'ont cependant pas fonctionné. Mon problème était que lorsque j'ai ajouté mon amont, il a configuré ma configuration git pour ne récupérer que le maître, plutôt que toutes les branches. par exemple, ça ressemblait à ça

[remote "somebody"]
        url = [email protected]:somebodys/repo.git
        fetch = +refs/heads/master:refs/remotes/upstream/master

La modification de .git / config comme suit a résolu mon problème

[remote "somebody"]
        url = [email protected]:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
Ian Will
la source
1

Les étapes suivantes ont bien fonctionné pour moi (en supposant que le nom de la branche en amont est branch):

$ git fetch upstream
$ git checkout branch
$ git push origin
Eneko Alonso
la source
1
J'obtiens git fetch upstream fatal: 'upstream' ne semble pas être un dépôt git fatal: impossible de lire à partir du dépôt distant. Veuillez vous assurer que vous disposez des droits d'accès appropriés et que le référentiel existe.
ThinkDigital
0

--track?

git branch --track branch upstream/branch
troelskn
la source
Peut-être que je vous ai mal compris, mais cela mettra en place la succursale de la même manière; avec pushpoussant à upstream.
poke
Non, je pense que je vous ai mal compris.
troelskn
0

J'avais un scénario un peu plus compliqué où j'avais déjà un upstreamdéfini dans mon fork (du repo canonique) mais j'avais besoin de récupérer une branche à partir d'un fork différent. Pour ce faire, le processus est légèrement différent. Voici la configuration avec laquelle j'ai fini:

[remote "origin"]
url = [email protected]:<your_user/org>/<repo>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
[remote "upstream"]
url = [email protected]:<upstream_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[remote "other_user"]
url = [email protected]:<other_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/<other_user>/*

Maintenant, vous pouvez également récupérer une branche à partir de <other_user>fork.

git fetch <other_user> <branch>
git checkout -b <branch> <other_user>/<branch>

Cela vous donnera une branche locale dérivée de la fourche.

Pour pousser cette branche locale, je devais être précis avec ma commande push.

git push origin <branch>
ok ou
la source
C'est à peu près la même chose que la réponse acceptée, juste que la télécommande que vous récupérez n'est pas appelée «en amont».
poke le