Comment ouvrir plusieurs pull requests sur GitHub

139

Lorsque j'ouvre une pull request sur GitHub .
Tous les commits depuis ma dernière demande et tous les nouveaux sont automatiquement ajoutés à cette demande .

Je n'arrive pas à contrôler quels commits sont ajoutés et lesquels ne le sont pas.
Lorsque j'essaye d'ouvrir une autre demande d'extraction, j'obtiens une erreur "Oups! Il y a déjà une demande d'extraction".

Existe-t-il un moyen simple d'ouvrir plusieurs demandes d'extraction sans avoir à jouer avec la ligne de commande?

torourke
la source

Réponses:

116

Les demandes d'extraction sont basées sur une branche.
La seule façon d'ouvrir une pull request pour plusieurs commits est:

  1. Isolez-les dans leur propre branche .
  2. Ouvrez les pull requests à partir de là.
mipadi
la source
3
Ok c'est cool, je pensais que c'était seulement avec le maître. Donc ce que vous voulez dire, c'est que je peux créer de nombreuses branches (c'est-à-dire: les fonctionnalités de git flow) et faire des pull requests pour chacune d'elles ... Je vais essayer!
Ziyan Junaideen
8
Je viens de découvrir que la branche a conservé l'historique des commits précédents, donc une pull request contre l'amont inclut toujours tous les commits.
eel ghEEz
2
Salut @ eel-gheez, avez-vous trouvé quoi faire à ce sujet? Comment créer des PR isolés sans afficher les modifications des autres branches?
Jonathan Cross
3
Cela ne résout pas le problème: lorsque j'essaye de créer un PR, les deux branches (avec au moins un commit chacune) sont comparées. Qu'est-ce que je fais mal?
MERose
1
@eelghEEz Vous devriez créer une nouvelle branche, git cherry-pick-up tous les commits que vous voulez dans cette branche et ensuite faire une pull request depuis cette branche. C'est une caractéristique de conception très importante de git que chaque commit dépende de son commit précédent, et les commits dans git ne doivent pas être considérés comme un simple patch, mais comme un patch sachant quel patch a été appliqué avant cela. C'est pourquoi il faut créer une nouvelle branche avec de nouveaux commits, dont les diffs sont peut-être toujours les mêmes, mais dont les liens vers les commits précédents sont différents.
MD
11

Le moyen le plus simple que j'ai trouvé pour le faire est d'utiliser la commande hub ( https://github.com/defunkt/hub ).

À partir de votre branche de rubrique ("fonctionnalité" dans cet exemple) pour laquelle vous souhaitez créer une pull request, vous pouvez simplement exécuter:

git pull-request

(n'oubliez pas de pousser d'abord votre branche!)

Et il ouvrira une nouvelle pull request sur GitHub pour "YOUR_USER: feature".

Si vous avez déjà créé un problème sur GitHub, vous pouvez même joindre une pull request à ce problème existant (ce que vous ne pouvez pas faire à partir de l'interface utilisateur Web):

$ git pull-request -i 123
[ attached pull request to issue #123 ]
Tyler Rick
la source
2

En fait, vous POUVEZ le faire sans créer une autre branche, mais cela demande un peu de jeu.
Voici les étapes:

  1. Identifiez les deux plages de validation que vous souhaitez extraire. Voici ce que je vais utiliser pour un exemple:
    (autre / maître) A -> B -> C -> D -> E (le vôtre / maître)
    Disons que vous voulez tirer B et C en une seule requête, et D & E dans un autre.
  2. Faites une demande de tirage. Faites en sorte que le côté gauche ("Base") soit commit A. Pour le côté droit ("head"), saisissez le numéro de commit C.
  3. Écrivez la description de votre première demande.
  4. Faites une autre demande. Pour la base, tapez le numéro de commit de C, et pour la tête, mettez E (yours / master).
  5. Écrivez la description.

Comme je le vois, la demande d'extraction voit le commit C comme un point de branchement. Ou quelque chose.

Randonnée
la source
Vous devez laisser other / master sur le côté gauche même si vous ajoutez un numéro de commit de votre / master. De plus, cette méthode ne vous permet pas d'ajouter de nouveaux commits à la demande de fusion, au cas où d'autres modifications seraient nécessaires.
frisco
J'ai posté une sorte de suivi de cette réponse, contrairement à certaines informations sur Github, voir stackoverflow.com/questions/23159860
Mark Bennett
Je peux voir que cela créerait deux PR qui semblent corrects, en ce sens qu'ils contenaient chacun exactement les commits souhaités. Mais, pour être explicite, fait-il la bonne chose lorsqu'ils sont fusionnés? Comme dans, je peux voir que le premier PR fusionnerait correctement B & C dans other / master. Mais lorsque le 2e PR fusionne, comment sait-il dans quelle branche fusionner? (Puisqu'il a été créé sur commit 'C', pas sur autre / master) Est-ce que l'ordre dans lequel les PR fusionnent? (vraisemblablement ainsi)
Jonathan Hartley
1

Lorsque vous créez la demande d'extraction pour la première fois, si vous ouvrez deux formulaires distincts pour une nouvelle demande d'extraction, cela vous permettra de les créer tant qu'ils sont pointés vers différentes branches à fusionner. Par exemple, je pourrais faire deux demandes distinctes, une pour fusionner dans master et une autre pour fusionner dans test.

BeanyTheSane
la source
1

Je suis nouveau sur Git et GitHub et j'avais la même question que l'OP.

J'ai trouvé une solution, qui n'était probablement pas disponible au moment de l'OP.

Situation: Vous avez 3 changements et vous voulez que chacun soit construit à partir du précédent, et que chacun ait sa propre pull request (PR).

Problème: lorsque vous créez le premier PR qui essaie de tirer le développement vers le maître, tout semble bien, mais après avoir effectué les modifications pour le deuxième PR et les fusionner (en utilisant la même branche), tous les changements sont dans le même PR .

Mini solution: créer une nouvelle branche

git branch mini_change_2
git checkout mini_change_2

Maintenant, vous poussez le code sur GitHub et créez le PR, mais il est par défaut Pull from mini_change_2 to master, sauf que le master n'a pas encore les changements du premier PR, donc il inclut tous les changements de PR1 et PR2.

Meilleure solution: spécifiez la branche vers laquelle vous fusionnez dans PR2.

N'acceptez pas simplement les valeurs par défaut lors de la création du deuxième PR, disons que vous allez tirer mini_chnage_2 pour Développer, cela affichera uniquement les changements dans mini_change_2

Créez maintenant une nouvelle branche mini_change_3 et PR que vers mini_change_3.

Le problème survient une fois que vous commencez à les fusionner ... mais c'est un exercice différent.

Markwusinich
la source