Comment appliquer des demandes d'extraction en amont non fusionnées d'autres fourches dans ma fourchette?


466

Un projet sur GitHub dont j'ai un fork a de nouvelles requêtes de pull que je veux insérer dans mon fork que l'auteur n'a pas encore récupéré.

Existe-t-il un moyen simple d'appliquer la demande de tirage d'autres fourches à ma fourche? Y a-t-il autre chose ici qui me manque?



Cela se reflète-t-il sur le graphe de réseau sur GitHub si vous utilisez des commandes git pour le faire?
ADTC

Cela pourrait aussi être intéressant de trouver toutes les branches aussi: stackoverflow.com/q/47798937/10245
Tim Abell

Réponses:


276

Vous pouvez le faire manuellement assez facilement:

  • ajoutez l'autre fork comme télécommande de votre repo:

    git remote add otherfork git://github.com/request-author/project.git
    
  • récupérer les commits de son repo

    git fetch otherfork
    
  • Vous avez alors deux options pour appliquer la demande de tirage (si vous ne voulez pas choisir le choix 1.)

    1. Si vous ne vous souciez pas d'appliquer également les validations éventuelles qui ont été ajoutées entre l'origine et la demande d'extraction, vous pouvez simplement rebaser la branche sur laquelle la demande d'extraction a été formée.

      git rebase master otherfork/pullrequest-branch
      
    2. Si vous ne voulez que les commits dans la demande de tirage, identifiez leur SHA1 et faites

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
En fait, vous ne devriez pas utiliser la sélection de cerise, cela crée de nouveaux commits ... ce qui à son tour causera de la confusion si vous envoyez une demande de pull en amont. Au lieu de cela, vous devez fusionner, tout comme la demande d'extraction demande de le faire. Vous n'avez pas non plus besoin d'ajouter une télécommande. git pull URL branchname
Tekkub

3
@Tekkub: d'accord, il vaut peut-être mieux éviter la confusion avec les commits nouvellement créés. La fusion est moins élégante dans mon esprit car vous pouvez apporter d'autres changements à la branche avec laquelle vous fusionnez
CharlesB

8
Oui, mais dans ce cas, il a spécifiquement demandé comment tirer la demande de traction dans sa fourchette. Tirez == fusionner.
Tekkub

1
@CharlesB, puisque GitHub ajoute automatiquement de nouvelles validations sur la même branche à une demande de tirage, ne serait-il pas difficile d'obtenir des "autres modifications" (en supposant que le demandeur suit les meilleures pratiques et place les modifications sur une branche distincte du développement continu afin que tous les commits sont pertinents), à moins que vous ne vouliez en arriver à une partie d'une demande de tirage?
neverfox

4
Pour ceux qui partagent mon problème mental, "otherfork" ne fait pas référence au dépôt d'origine, il fait référence au commit de la fourchette qui a émis la demande de tirage au dépôt d'origine. Ignorez le dépôt d'origine et allez directement à la fourche qui a fait la demande de traction. Vous souhaitez extraire manuellement le commit référencé par le pull et le fusionner avec le vôtre.
Michael Khalili

282

Mise à jour: via une page Web

Vous pouvez également le faire via la page Web github.

Je suppose que vous devriez déjà avoir un fork ( MyFork) du repo ( BaseRepo) commun qui a la demande de pull en attente d'un fork ( OtherFork) qui vous intéresse.

  1. Accédez à la fourche ( OtherFork) qui a lancé la demande de tirage que vous souhaitez mettre dans votre fourche (MyFork )
  2. Accédez à la page des demandes d'extraction de OtherFork
  3. Cliquez sur nouvelle demande d'extraction
  4. La ou les demandes d'extraction en attente doivent être proposées. N'oubliez pas de sélectionner OtherForkégalement la branche appropriée . Sélectionnez sur le côté gauche comme fourche de base votre fourche ( MyFork) ( IMPORTANT ).
  5. Maintenant, l'option de View pull requestdevrait devenir Create pull request. Cliquez ici.

Vous devriez maintenant avoir une demande de pull en attente dans votre fork ( MyFork), que vous pouvez simplement accepter.


6
Fonctionne magnifiquement. Beaucoup plus simple que la ligne cmd et facile à examiner les modifications. Je vous remercie.
Alveoli

3
J'ai eu du mal à trouver comment accéder à la "OtherFork" sur l'interface utilisateur. Pour y accéder facilement, il suffit de modifier l'URL avec le nom d'utilisateur github. ie github.com/userName/repoName
Charles

2
Je n'ai pas pu voir les demandes de tirage en attente mentionnées à l'étape 4. Au lieu de cela, j'ai sélectionné la branche qui correspondait à la demande de tirage effectuée par OtherFork, dans la liste déroulante "comparer" de droite. J'ai ensuite sélectionné le côté gauche comme fourche de base comme décrit ci-dessus car j'ai pu créer la demande de traction.
seddonym

Fonctionne sauf s'il n'y a pas de fourche. Par exemple: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Les mots exacts du site githubs peuvent être obsolètes, mais le processus est parfait. Super simple - merci!
kevnk

73

Comme Tekkub l'a dit précédemment, vous pouvez simplement tirer la branche directement. La plupart du temps avec GitHub, la branche est simplement "master" sur le fork de l'utilisateur demandeur du projet.

Exemple: git pull https://github.com/USER/PROJECT/ BRANCH

Et comme exemple pratique:

Supposons que vous ayez créé un projet github appelé safaribooks et qu'il y ait la demande d'extraction suivante, dans le projet d'origine, que vous souhaitez mettre dans votre fork:

entrez la description de l'image ici

Ensuite, dans le dossier de projet cloné de votre fork, exécutez:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
L'inconvénient est que la succursale peut contenir d'autres éléments que la demande de tirage. En outre, vous devez rechercher l'URL appropriée pour la fourchette de l'auteur de la demande d'extraction. Si vous souhaitez utiliser une doublure, mieux vaut utiliser à la git pull https://github.com/{upstream/project} refs/pull/{id}/headplace.
jbyler

1
@jbyler Si la branche contient d'autres éléments, je suis sûr que GitHub aura de toute façon mis à jour la demande de tirage avec eux.
Tim Malone

22

Les demandes d'extraction pour le projet peuvent provenir de nombreux auteurs différents (fourches), et vous ne voulez probablement pas de télécommande distincte pour chaque fork. De plus, vous ne voulez pas faire d'hypothèses sur la branche que l'auteur a utilisée lors de la soumission de la demande d'extraction, ni sur quoi d'autre pourrait se trouver dans la branche principale de l'auteur. Il est donc préférable de référencer la demande d'extraction telle qu'elle apparaît dans le référentiel en amont, plutôt que telle qu'elle apparaît dans les autres fourches.

Étape 1:

git remote add upstream <url>

Vous avez probablement déjà fait cette étape, mais sinon, vous voudrez une télécommande définie pour le projet en amont. L'URL est l'URL clone du projet que vous avez créé. Plus d'informations sur Configuration d'une télécommande pour un fork et Synchronisation d'un fork . upstreamest le nom que vous donnez à la télécommande, et même si cela peut être n'importe quoi, upstream c'est le nom conventionnel.

Étape 2:

git pull upstream refs/pull/{id}/head

... où se {id}trouve le numéro de demande de tirage. upstreamest le nom de la télécommande à extraire, c'est-à-dire juste "en amont" si vous avez suivi exactement l'étape 1. Il peut également s'agir d'une URL, auquel cas vous pouvez ignorer l'étape 1.

Étape 3:

Tapez un message de validation pour la validation de fusion. Vous pouvez conserver la valeur par défaut, bien que je recommande de donner un joli résumé d'une ligne avec le numéro de demande d'extraction, le problème qu'il résout et une courte description:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

Voir également une réponse associée avec une variante qui crée une branche locale avec la demande d'extraction. Et une dernière variante: vous pouvez utiliser git pull upstream refs/pull/{id}/headpour obtenir les commits dans votre référentiel local, puis les référencer comme FETCH_HEAD(par exemple git log ..FETCH_HEADpour voir ce qu'il git merge FETCH_HEAD
contient

comment pourrais-je procéder pour le rebasage, donc la demande de pull est en tête et je peux éviter une bulle de fusion?
Michael Johnston

1
C'était la solution dont j'avais besoin, car l'auteur de la demande de retrait avait retiré son dépôt.
jswetzen

20

Quelques informations plus détaillées qui ont fonctionné pour moi.

Mon fichier .git / config pour le dépôt fourchu ressemble à ceci:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Exécutez ensuite "git fetch source", qui répertorie ensuite toutes les demandes de tirage du dépôt forké.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

Et puis pour fusionner dans une demande de tirage spécifique, exécutez "git merge master origin / pr / 67"


1
J'ai édité mon .git / config et ajouté les lignes [source "distante] mais pour le projet qui m'intéressait, et les instructions fonctionnaient parfaitement. J'adore cette réponse.
philo vivero

3
D'excellents conseils connexes peuvent être trouvés sur news.ycombinator.com/item?id=9051220 et help.github.com/articles/checking-out-pull-requests-locally donne des conseils sur cet (génial) refs/pull/espace de noms distant en lecture seule spécifique à GitHub .
Philip Durbin

Si vous utilisez Smartgit, vous pouvez voir ces demandes d'extraction (et celles fermées) dans le graphique du journal si vous ajoutez smartgit.branch.otherRefs=notes;pullà smartgit.properties conformément à syntevo.com/doc/display/SG/System+Properties - vous pouvez également les fusionner à partir de là .
CAD bloke

btw, vous pouvez également l'essayer sur la ligne de commande avec git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

Ce que je ferais est le suivant;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

J'ai maintenant fusionné les modifications dans une branche de test, nommée test_fork . Pour que tout changement ne salisse pas mon arbre.

En option, vous pouvez utiliser la sélection de cerises comme décrit ci-dessus pour choisir un commit particulier si cela est plus préférable.

Bon voyage :)


0

J'utilise un script dandy pratique pour cela. Je lance le script en tapant:

git prfetch upstream

et il obtient toutes les demandes d'extraction de la branche amont.

Pour créer le script, créez un fichier ~/bin/git-prfetch.

Le fichier doit contenir les éléments suivants:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Assurez-vous que votre chemin inclut le script en définissant:

export PATH="$HOME/bin:$PATH"

Vous pouvez ajouter ce fichier à ~/.bashrcpour rendre la modification permanente.

Maintenant, assurez-vous d'ajouter la fourche à partir de laquelle vous souhaitez obtenir les demandes d'extraction:

git remote add upstream https://github.com/user/repo.git

Et alors

git prfetch upstream
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.