Skip to main content

Gestion des demandes de tirage empilées

Restructurez les demandes de tirage empilées, rebasez leurs branches et apportez des modifications aux couches inférieures à l’aide GitHub CLIde .

Remarque

Cette fonctionnalité est disponible en préversion publique et peut être modifiée.

Lorsque vous effectuez une itération sur une pile, vous devez souvent apporter des modifications dans une couche inférieure, rebaser pour conserver un historique linéaire ou restructurer ses branches. L’extension gh stack de GitHub CLI gestion de ces tâches avec des opérations en cascade qui mettent à jour chaque branche affectée. Consultez « Commandes CLI des demandes de tirage empilées ».

Apporter des modifications à une couche inférieure

Lorsque vous travaillez sur la couche supérieure et que vous devez modifier quelque chose de plus bas dans la pile, apportez la modification dans la branche dans laquelle elle appartient et rebasez, plutôt que de travailler autour de celle-ci au niveau de la couche active.

  1. Accédez à la branche qui a besoin de la modification.

    Shell
    gh stack down
    

    Vous pouvez également consulter une branche spécifique avec gh stack checkout BRANCH-NAME.

  2. Apportez la modification et validez-la.

    Shell
    git add .
    git commit -m "helpful-commit-message"
    
  3. Rebasez les branches ci-dessus pour récupérer la modification.

    Shell
    gh stack rebase --upstack
    
  4. Envoyez (push) les branches mises à jour et revenez à l’endroit où vous travaillez.

    Shell
    gh stack push
    gh stack top
    

Rebasing de votre pile

Une pile doit avoir un historique linéaire entre ses branches avant de pouvoir fusionner. L’exécution gh stack rebase effectue une rebase en cascade où chaque branche est rebase en haut de la branche située en dessous, en commençant par main, de sorte que chaque branche récupère les dernières modifications de toutes les couches inférieures.

  1. Rebasez la pile. Par défaut, cela rebase chaque branche du bas au haut.

    Shell
    gh stack rebase
    

    Pour limiter la rebase, utilisez cette option --downstack pour rebaser à partir de la couche la plus basse jusqu’à current Branch, ou --upstack pour rebaser de la branche actuelle vers le haut.

  2. Envoyez (push) les branches mises à jour. Cela permet --force-with-lease de mettre à jour les branches rebase en toute sécurité.

    Shell
    gh stack push
    

Si une nouvelle base rencontre un conflit, gh stack rebase arrête et répertorie les fichiers en conflit.

  • Résolvez les marqueurs dans les fichiers affectés, mettez-les en scène avec git add, puis exécutez gh stack rebase --continue.
  • Pour recommencer, exécutez gh stack rebase --abort pour restaurer toutes les branches à leur état de pré-rebase.

Remarque

Vous pouvez également déclencher une rebase côté serveur à partir de la demande de tirage, mais ces validations ne sont pas signées. Si votre référentiel nécessite des validations signées, rebasez-les GitHub CLI pour que les validations suivent votre configuration de signature de validation Git locale.

Rebasing à partir du GitHub site web

Lorsqu’une pile n’est pas linéaire, un bouton De base de pile s’affiche dans la zone de fusion. La sélection de celle-ci déclenche une rebase en cascade côté serveur qui :

  1. Rebase la pile entière au-dessus de la dernière jonction, par mainexemple .
  2. Rebase chaque branche non fusionnée au-dessus de sa branche de base, travaillant du bas de la pile vers le haut.
  3. Force l’envoi (push) de chaque branche rebase pour mettre à jour la branche distante.

Une fois la nouvelle base terminée, chaque demande de tirage reflète les branches mises à jour et les vérifications CI sont réexécurées.

Remarque

Les validations créées par une rebase côté serveur ne sont pas signées. Si votre référentiel nécessite des validations signées, rebasez-les pour GitHub CLIgh stack rebase que les validations suivent votre configuration de signature de validation Git locale, puis envoyez (push) avec gh stack push.

Restructuration d’une pile

Vous pouvez modifier la composition d’une pile. Par exemple, si vous devez supprimer une branche, combiner des branches, insérer une branche, réorganiser ou renommer, utilisez la commande gh stack modifyinteractive.

Avant d’exécuter gh stack modify, vérifiez les éléments suivants :

  • Vous disposez d’une pile active extraite.
  • Votre arbre de travail est propre.
  • Aucune nouvelle base n’est en cours.
  • Aucune demande de tirage n’est mise en file d’attente pour fusionner.
  • L’historique des validations est linéaire.
  1. Ouvrez l’interface utilisateur de modification du terminal.

    Shell
    gh stack modify
    
  2. Sélectionnez une branche et effectuez une étape d’opération. La réorganisation et les modifications structurelles (drop, fold, insert, rename) ne peuvent pas être mélangées dans la même session.

    • x — supprimer une branche et ses validations
    • d — plier la branche dans celle-ci-dessous
    • u — plier la branche dans celle ci-dessus
    • i / I — insérer une nouvelle branche en dessous ou au-dessus du curseur
    • r — renommer une branche
    • Période de travail+ / Période de travail+ — réorganiser une branche
    • z — annuler la dernière action intermédiaire
  3. Appliquez vos modifications intermédiaires en enregistrant. Rien n’est modifié tant que vous n’avez pas enregistré.

    Utilisez ctrl/cmd+s.

    Si un conflit se produit lors de l’application, résolvez-le et exécutez-le gh stack modify --continueou exécutez gh stack modify --abort pour restaurer l’état de pré-modification.

  4. Envoyez (push) les branches mises à jour et recréez la pile sur GitHub.

    Shell
    gh stack submit
    

Décompresser à partir du GitHub site web

Pour dissolution d’une pile à partir du site web, par exemple pour réorganiser ou réorganiser celle-ci, utilisez l’option Unstack sur la pile.

Unstacking supprime les demandes d’extraction ouvertes, brouillons et fermées de la pile. Chacune conserve sa branche de base actuelle, mais n’est plus liée aux autres, et les exigences de mappage de pile et de fusion de pile disparaissent de celles-ci.

Les demandes de tirage fusionnées et mises en file d’attente restent dans la pile. Une fois qu’une demande de tirage a été fusionnée ou qu’elle est mise en file d’attente pour la fusion, dans le cadre d’une pile, elle ne peut pas être empilée. Une pile est entièrement dissoute uniquement lorsqu’aucune de ses demandes de tirage n’a été fusionnée ou qu’elle est mise en file d’attente pour la fusion ; sinon, il persiste avec ces demandes de tirage toujours dans celui-ci.

Pour réorganiser ou restructurer une pile sans la résoudre, utilisez plutôt la gh stack modify commande. Voir Restructuration d’une pile.

Synchronisation de votre environnement local après fusion

Lorsqu’une demande de tirage (pull request) en bas de la pile fusionne, mettez à jour votre état local avec une seule commande de synchronisation. Pour supprimer automatiquement les branches locales pour les demandes de tirage fusionnées en même temps, ajoutez l’option --prune .

Shell
gh stack sync --prune

Cela extrait les dernières modifications, transfère rapidement la jonction, rebase les branches restantes sur celle-ci, envoie (push) les branches mises à jour et synchronise l’état de la demande de tirage à partir de GitHub.

Extraction des demandes de tirage ajoutées à la pile sur GitHub

Si quelqu’un d’autre ajoute des demandes de tirage à la pile GitHub, gh stack sync récupère les nouvelles branches et les ajoute à votre pile locale afin qu’elle reflète la pile distante. Une mise à jour à distance propre comme celle-ci est extraite automatiquement. Il est donc gh stack sync sûr de s’exécuter dans l’automatisation.

Résolution d’une pile divergente

Vos piles locales et distantes diffèrent quand aucune d’entre elles n’est une extension propre de l’autre, par exemple lorsque vous ajoutez une branche localement, tandis que différentes demandes de tirage sont ajoutées à la même pile sur GitHub. Lorsque cela se produit, gh stack sync ne peut pas fusionner les deux automatiquement. Dans un terminal interactif, il offre trois choix :

  • Utilisez la pile distante comme source de vérité. Remplace la composition de votre pile locale par les branches manquantes par les branches distantes. Si vous étiez sur une branche de la pile distante ne contient plus, vous êtes déplacé vers la branche la plus proche survivante. Cela nécessite une arborescence de travail propre sans modification non validée.
  • Supprimez la pile sur GitHub. Supprime l’objet de pile activé GitHub et arrête la synchronisation. Vos demandes de tirage et vos branches locales ne sont pas touchées. Recréez la pile avec gh stack submitlaquelle vous créez également des demandes de tirage pour toutes les branches que vous n’avez pas encore envoyées. Exécutez d’abord gh stack modify si vous souhaitez modifier sa structure.
  • Annuler. Abandonne la synchronisation sans envoyer de branches ou mettre à jour les demandes de tirage( pull request).

Dans un terminal non interactif, tel que CI, une divergence abandonne la synchronisation sans envoyer de branches ou de mettre à jour les demandes de tirage. Résolvez-le en déstacking et recréez la pile.

Étapes suivantes