web-dev-qa-db-fra.com

Comment extraire une branche distante du dépôt de quelqu'un d'autre

J'ai un projet hébergé sur GitHub que quelqu'un a créé. Sur leur fourche, ils ont créé une nouvelle branche "foo" et apporté quelques modifications. Comment puis-je tirer leur "foo" dans une nouvelle branche également appelée "foo" dans mon repo?

Je comprends qu’ils pourraient me soumettre une demande d’attraction, mais j’aimerais lancer ce processus moi-même.

Supposons ce qui suit:

  1. Parce qu'ils ont lancé mon projet, nos deux pensions partagent la même "histoire"
  2. Bien que GitHub montre que son projet provient du mien, mon référentiel local ne contient aucune référence au projet de cette personne. Dois-je ajouter la leur comme télécommande?
  3. Je n'ai pas encore de branche appelée "foo" - je ne sais pas si je dois la créer manuellement au préalable.
  4. Je veux vraiment que cela soit inséré dans une branche distincte et non par mon maître.
211
Colin O'Dell
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Cela va configurer une branche locale foo, en suivant la coworker/foo de la branche distante. Ainsi, lorsque votre collègue a apporté des modifications, vous pouvez facilement les extraire:

git checkout foo
git pull

Réponse aux commentaires:

Cool :) Et si je voudrais faire le mien changements à cette branche, devrais-je créer une deuxième "barre" de branche locale de "foo" et y travailler au lieu de directement sur mon "foo"?

Vous n'avez pas besoin de créer une nouvelle branche, même si je le recommande. Vous pouvez aussi vous engager directement dans foo et demander à votre collègue de tirer votre succursale. Mais cette branche existe déjà et votre branche foo doit être configurée comme une branche en amont de celle-ci:

git branch --set-upstream foo colin/foo

en supposant que colin est votre référentiel (distant du référentiel de vos collègues) défini de la même manière:

git remote add colin git://path/to/colins/repo.git
277
ralphtheninja

Non, vous n'avez pas besoin de les ajouter en tant que télécommande. Ce serait fastidieux et pénible à faire à chaque fois.

Saisissant leurs commits:

git fetch [email protected]:theirusername/reponame.git theirbranch:ournameforbranch

Cela crée une branche locale nommée ournameforbranch qui correspond exactement à ce que theirbranch était pour eux. Pour l'exemple de question, le dernier argument serait foo:foo.

Remarque: Il est possible d’omettre une partie de :ournameforbranch si le nom d’un nom qui n’entre pas en conflit avec l’une de vos propres branches vous dérange. Dans ce cas, une référence appelée FETCH_HEAD est disponible. Vous pouvez git log FETCH_HEAD voir leurs commits puis faire des choses comme cherry-picked pour sélectionner leurs commits.

Le repoussant à eux:

Souvent, vous voulez réparer quelque chose d’eux et le repousser. C'est possible aussi:

git fetch [email protected]:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git Push [email protected]:theirusername/reponame.git HEAD:theirbranch

Si vous travaillez dans état isolé vous inquiète, créez une branche en utilisant :ournameforbranch et remplacez FETCH_HEAD et HEAD ci-dessus par ournameforbranch.

67
antak

Si antak répond: 

git fetch [email protected]:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

vous donne:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Puis (suivant les conseils de Przemek D) utiliser 

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>
5
Peter

Si le référentiel forké est protégé et que vous ne pouvez pas y accéder directement, et que votre objectif est d'apporter des modifications à leur foo, vous devez alors placer leur branche foo dans votre référentiel comme suit: 

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Vous avez maintenant une copie locale de foo, sans aucun lien en amont. Vous pouvez y apporter des modifications (ou non), puis poussez votre foo vers votre propre dépôt distant. 

git Push --set-upstream Origin foo

Maintenant foo est dans votre dépôt sur GitHub et votre foo local le suit. S'ils continuent à apporter des modifications à foo, vous pouvez aller les chercher et les intégrer à votre foo.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
1
J Smith

GitHub a une nouvelle option par rapport aux réponses précédentes, il suffit de copier/coller les lignes de commande du PR:

  1. Faites défiler vers le bas du PR pour voir le bouton Merge ou Squash and merge
  2. Cliquez sur le lien à droite: view command line instructions
  3. Appuyez sur l’icône Copier située à droite de l’étape 1.
  4. Collez les commandes dans votre terminal
0
Robert Monfera

Ce qui suit est une solution pratique de Nice qui fonctionne avec GitHub pour extraire la branche PR de la branche d’un autre utilisateur. Vous devez connaître l'ID de demande d'extraction (que GitHub affiche avec le titre de PR).

Exemple:

Correction de votre code non sécurisé # 8
alice veut fusionner 1 commit en your_repo:master à partir de her_repo:branch

git checkout -b <branch>
git pull Origin pull/8/head

Remplacez votre télécommande si elle est différente de Origin.
Remplacez 8 par le bon ID de demande d'extraction. 

0
Subfuzion