Fusionner la demande d'extraction vers une branche différente de celle par défaut, dans Github

122

Une pull request arrive dans mon dépôt hébergé sur Github. Par défaut, il est fusionné dans la masterbranche.

Y a-t-il un moyen pour moi de changer la branche dans laquelle les modifications seraient fusionnées?

eoinoc
la source

Réponses:

86

Depuis le 15.08.2016, GitHub permet de changer la branche cible d'une pull request via l'interface graphique. Cliquez sur à Editcôté du titre, puis sélectionnez la branche dans la liste déroulante.

capture d'écran

Vous pouvez maintenant modifier la branche de base d'une demande d'extraction ouverte. Après avoir créé une demande d'extraction, vous pouvez modifier la branche de base afin que les modifications de la demande d'extraction soient comparées à une branche différente. En changeant la branche de base de votre pull request d'origine plutôt qu'en en ouvrant une nouvelle avec la branche de base correcte, vous pourrez conserver un travail et des discussions précieux.

maliayas
la source
1
Cela devrait être la bonne réponse à cette question (après la mise à niveau vers GitHub ie).
stuxnetting
Cette fonctionnalité ne semble plus exister (à partir du 15/02/2018), n'est-ce pas? Dans une demande d'extraction récente, la branche cible est affichée dans la même police bleue sur fond bleu clair que le référentiel / branche source et non plus un bouton.
cgogolin
12
Ah! Cela fait! Il faut d'abord cliquer sur "Modifier" (ce qui n'est pas évident sur la capture d'écran ci-dessus). J'ai oublié cela. Désolé.
cgogolin
@cgogolin Merci de l'avoir signalé - j'étais également confus jusqu'à ce que je lis votre commentaire et clique sur le bouton Modifier.
mhucka
Github avertit que "Lorsque vous modifiez la branche de base de votre pull request, certains commits peuvent être supprimés de la chronologie." et "Certains commits de l'ancienne branche de base peuvent être supprimés de la chronologie." Une idée de ce que cela signifie?
Matthias Fripp
55

L'émetteur peut changer cela lorsqu'il émet la demande d'extraction, mais une fois qu'il l'a émise, vous ne pouvez pas le changer.

D'un autre côté, vous pouvez fusionner manuellement leur branche et pousser, ce que je fais semi-régulièrement pour les demandes d'extraction mal ciblées.

Vous pouvez trouver la hubgemme utile pour travailler avec les composants de la demande d'extraction.

Ce joyau termine le processus manuel, qui est:

  1. Ajoutez une télécommande pour la fourche à votre caisse locale.
  2. Récupérez cette télécommande.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...
Daniel Pittman
la source
1
Si je fusionne et envoie manuellement, Github se rendra-t-il compte que la demande d'extraction a été effectivement exécutée? Des pointeurs sur la façon de fusionner à partir d'un dépôt séparé distant (le fork)?
eoinoc
3
Je ne suis pas sûr, mais pas directement - parce que la modification n'a pas fusionné dans la branche cible, donc la demande d'extraction n'est pas terminée comme défini. Vous devez le fermer manuellement. Quant aux pointeurs, voir le commentaire édité.
Daniel Pittman le
Je recommanderais d'utiliser git merge --no-ff ...comme @GuillermoMansilla mentionne dans sa réponse.
jjmontes
3
"Une fois qu'ils l'ont émis, vous ne pouvez pas le changer" - Ce n'est plus le cas depuis août 2016! Voir la réponse de @maliayas ci-dessous: stackoverflow.com/a/38985999/12484
Jon Schneider
1
J'ai suivi cette procédure aujourd'hui (3 mars 2017). J'ai téléchargé pull request dans une autre branche et y ai apporté des correctifs supplémentaires, puis fusionné avec master. Une fois que les validations de la demande d'extraction se sont terminées dans master, GitHub a automatiquement fermé la demande d'extraction.
Ivan Krivyakov
14

Une alternative à l'utilisation du gem hub mentionné par d'autres réponses consiste à utiliser la ligne de commande pour fusionner localement les pull requests , ce qui vous permet de faire:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Les commandes ci-dessus ne fonctionnent directement que si vous ajoutez d'abord la ligne suivante à votre .git/configfichier:

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

Cela vous permet de télécharger TOUTES les demandes d'extraction. Étant donné que cela n'est peut-être pas souhaité pour les dépôts volumineux, GitHub a modifié les instructions pour inclure la git fetch origin pull/ID/head:BRANCHNAMEsyntaxe, ce qui évite la modification du fichier de configuration et ne télécharge que cette seule demande d'extraction.

Grzegorz Adam Hankiewicz
la source
8

Bien que vous ne puissiez pas modifier la pull request existante car elle n'est pas la vôtre, vous pouvez facilement en créer une nouvelle si le référentiel source associé existe toujours - oui, même s'il appartient à quelqu'un d'autre.

Accédez au référentiel de l'émetteur puis créez une nouvelle pull request dans son référentiel en utilisant les mêmes validations mais assurez-vous de définir correctement la bonne branche cible.

Revenez ensuite à votre propre référentiel et acceptez la nouvelle demande d'extraction. Voila!

Deckard
la source
Cela fonctionne-t-il s'ils ont changé leur référentiel? Comment s'assurer que ce sont «les mêmes commits»?
ragerdl
@ragerdl - Si vous développez en utilisant un modèle «fonctionnalité par branche», vous pouvez créer un PR avec une branche contre une branche en amont, et il doit contenir les mêmes commits.
geerlingguy
2
Le seul moyen de le faire directement sur GitHub, sans accès à un dépôt local.
kopischke
8

Il n'y a rien de mal avec la solution de Daniel Pittman, mais je traiterais ces fusions comme "pas d'avance rapide", c'est-à-dire en changeant l'étape 3 pour:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

En utilisant --no-ff, l'historique sera plus facile à lire. Cela indiquera clairement que les $ncommits proviennent de $branch, et cela vous facilitera également la vie si vous devez annuler quelque chose qui a été fait dans cette branche.

Pour répondre également à la question d'eoinoc et donner un conseil supplémentaire:

Après avoir effectué la fusion, votre git cli vous invitera à écrire un message, généralement un message générique apparaîtra disant quelque chose comme

Fusionner la branche de suivi à distance `` utilisateur / leur-branche '' dans votre branche

Assurez-vous de modifier ce message et d'inclure une référence au numéro de demande d'extraction. Autrement dit: (en supposant que le numéro de demande d'extraction est 123)

Fusionner la branche de suivi à distance `` utilisateur / leur-branche '' dans votre branche

refs # 123 résoudre quoi que ce soit ...

Ainsi, la prochaine fois que vous visiterez votre page de problèmes / demandes d'extraction github et que vous vérifierez cette demande d'extraction particulière, vous verrez votre message avec un lien pour valider l'endroit où vous avez effectué la fusion.

Voici une capture d'écran de ce que je veux dire.

entrez la description de l'image ici

Guillermo Mansilla
la source
6

Pour ce faire, allez sur la page d'accueil de votre référentiel, cliquez sur les branches, et changez la branche par défaut de master en autre chose, dans mon cas "dev".

Après cela, chaque fois que quelqu'un crée une pull request, le mergebouton fusionnera automatiquement la requête dans "dev" plutôt que master.

entrez la description de l'image ici

abbood
la source
merci pour la correction de faute de frappe @the Tin Man je l'apprécie
abbood
4
Il n'est pas nécessaire de nous remercier pour les ajustements / modifications. C'est quelque chose que nous faisons pour le site. Continuez à écrire de bonnes réponses, c'est assez merci.
the Tin Man