Lorsque vous effectuez une itération sur une pile de branches, 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 dans GitHub CLI gère ces tâches avec des opérations en cascade qui mettent à jour chaque branche affectée. Consultez « Commandes CLI pour les pull requests 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 à laquelle elle appartient et rebasez, plutôt que de contourner le problème à ce niveau.
-
Accédez à la branche qui a besoin de la modification.
Shell gh stack down
gh stack downVous pouvez également consulter une branche spécifique avec
gh stack checkout BRANCH-NAME. -
Apportez la modification et validez-la.
Shell git add . git commit -m "helpful-commit-message"
git add . git commit -m "helpful-commit-message" -
Rebase les branches ci-dessus pour récupérer la modification.
Shell gh stack rebase --upstack
gh stack rebase --upstack -
Envoyez (push) les branches mises à jour et revenez à l’endroit où vous travailliez.
Shell gh stack push gh stack top
gh stack push gh stack top
Rebasage de votre pile
Une stack doit avoir un historique linéaire entre ses branches avant de pouvoir être fusionnée. L’exécution gh stack rebase effectue une rebase en cascade où chaque branche est rebasée 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.
-
Rebasez la stack. Par défaut, cela rebase chaque branche du bas au haut.
Shell gh stack rebase
gh stack rebasePour limiter la rebase, utilisez cette option
--downstackpour rebaser à partir de la couche la plus basse jusqu’à la branche actuelle, ou--upstackpour rebaser de la branche actuelle vers le haut. -
Poussez les branches mises à jour. Cela utilise
--force-with-leasepour mettre à jour les branches rebasées en toute sécurité.Shell gh stack push
gh stack push
Si un rebase rencontre un conflit, le rebase s’arrête et répertorie les fichiers en conflit.
- Résolvez les marqueurs dans les fichiers affectés, ajoutez-les à l’index avec
git add, puis exécutezgh stack rebase --continue. - Pour recommencer, exécutez
gh stack rebase --abortpour restaurer toutes les branches à leur état de pré-rebase.
Remarque
Vous pouvez également déclencher une rebase côté serveur à partir de la pull request, mais ces commits ne sont pas signés. Si votre référentiel nécessite des validations signées, rebasez à partir de GitHub CLI pour que les validations suivent votre configuration locale de signature de validation Git.
Rebasage depuis le site web GitHub
Lorsqu’une pile n’est pas linéaire, un bouton Rebaser la pile s’affiche dans la zone de fusion. La sélection de celle-ci déclenche un rebasage en cascade côté serveur qui :
- Rebase la pile entière au-dessus du dernier trunk, comme
main. - Rebasez chaque branche non fusionnée au-dessus de sa branche de base, travaillant du bas de la pile vers le haut.
- Force l’envoi (push) de chaque branche rebasée pour mettre à jour la branche distante.
Une fois le rebase terminé, chaque pull request reflète les branches mises à jour et les vérifications CI sont réexécutées.
Remarque
Les commits créés par une rebase côté serveur ne sont pas signés. Si votre référentiel nécessite des validations signées, effectuez un rebase à partir de GitHub CLI avec gh stack rebase afin que les validations suivent votre configuration locale de signature des validations Git, puis envoyez (push) avec gh stack push.
Réorganisation d’une stack
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 interactive gh stack modify.
Avant d’exécuter gh stack modify, vérifiez les éléments suivants :
- Vous disposez d’une stack active ouverte.
- Votre copie de travail est propre.
- Aucun rebase n’est en cours.
- Aucune pull request n’est en attente de fusion.
- L’historique des commits est linéaire.
-
Ouvrez l’interface utilisateur de modification du terminal.
Shell gh stack modify
gh stack modify -
Sélectionnez une branche et indexez une 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 commitsd— plier la branche dans celle du dessousu— fusionner la branche dans celle du dessusi/I— insérer une nouvelle branche en dessous ou au-dessus du curseurr— renommer une branche- Maj+↑ / Maj+↓ — réorganiser une branche
z— annuler la dernière action mise en attente
-
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
gh stack modify --continue, ou exécutezgh stack modify --abortpour restaurer l’état de pré-modification. -
Envoyez (push) les branches mises à jour et recréez la pile sur GitHub.
Shell gh stack submit
gh stack submit
Retirer de la pile depuis le GitHub site web
Pour dissoudre une pile à partir du site web, par exemple pour la réordonner ou la réorganiser, utilisez l’option Unstack sur la pile.
Unstacking supprime les pull requests 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 ne s’appliquent plus à elles.
Les pull requests fusionnées et mises en file d’attente restent dans la stack. Une fois qu’une pull request 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 retirée de la pile. Une pile est entièrement dissoute uniquement lorsqu’aucune de ses pull requests n’a été fusionnée ni n’est en attente de fusion ; sinon, elle persiste avec ces pull requests toujours dedans.
Pour réorganiser ou restructurer une pile sans la dissoudre, utilisez plutôt la commande gh stack modify. Voir Restructuration d’une stack.
Synchroniser votre environnement local après les fusions
Lorsqu’une pull request au bas de la pile fusionne, mettez à jour votre état local avec une seule commande de synchronisation. Pour supprimer automatiquement les branches locales pour les pull requests fusionnées en même temps, ajoutez l’option --prune.
gh stack sync --prune
gh stack sync --prune
Cela extrait les dernières modifications, avance rapidement le trunk, rebase les branches restantes sur celui-ci, envoie (push) les branches mises à jour et synchronise l’état de la pull request à partir de GitHub.
Importation des pull requests ajoutées à la pile sur GitHub
Si quelqu’un d’autre ajoute des pull requests à la pile sur 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 en avance sur le dépôt distant propre comme celle-ci est récupérée automatiquement. Il est donc possible que gh stack sync peut être exécuté sans risque 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 pull requests 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 celle du distant, en récupérant toutes les branches manquantes. Si vous étiez sur une branche que la pile distante ne contient plus, vous êtes déplacé vers la branche survivante la plus proche. Cela nécessite une copie de travail propre sans modifications non validées.
- Supprimez la pile de GitHub. Supprime l’objet de pile sur GitHub et arrête la synchronisation. Vos pull requests et vos branches locales ne sont pas touchées. Recréez la pile avec
gh stack submit, ce qui crée également des demandes de tirage pour toutes les branches que vous n’avez pas encore soumises. Exécutez d’abordgh stack modifysi vous souhaitez modifier sa structure. - Annuler. Abandonne la synchronisation sans envoyer de branches ni mettre à jour les pull requests.
Dans un terminal non interactif, tel que CI, une divergence interrompt la synchronisation sans envoyer de branches ni mettre à jour les pull requests. Résolvez-le en supprimant la pile et en la recréant.