Stacked PRs de GitHub
(github.github.com/gh-stack)- Nueva función de GitHub que permite dividir grandes cambios de código en PR pequeños y revisables para gestionarlos de forma secuencial
- Cada PR se revisa de manera independiente, y toda la pila puede fusionarse con un solo clic
- A través de la UI de GitHub y la CLI
gh stack, ofrece soporte para crear, navegar, hacer rebase y fusionar pilas, y visualiza su estructura jerárquica con un mapa de pila - Mediante la integración con agentes de codificación con IA, es posible dividir automáticamente un diff grande en unidades de pila o trabajar con desarrollo basado en pilas
- Su objetivo es reducir la complejidad y el riesgo de conflictos de los PR grandes, y mejorar la eficiencia de revisión y la velocidad de desarrollo del equipo
Funciones principales
-
Gestión de PR en pila
- Se pueden organizar varios PR en una pila ordenada (stack), donde cada PR se basa en la rama del PR inmediatamente inferior
- Al final, se forma una estructura en cadena que llega hasta la rama principal
- GitHub reconoce toda la pila y muestra un mapa de pila (stack map) en la UI, para que quienes revisan puedan navegar fácilmente por cada nivel
- Las reglas de protección de ramas se aplican a la rama de destino final, y las pruebas de CI se ejecutan para todos los PR dentro de la pila
-
Gestión simplificada de pilas
- Desde la UI de GitHub se puede mover entre los PR de una pila, revisar el estado de cada nivel y ejecutar un rebase en cascada (cascading rebase) sobre toda la pila
- Es posible fusionar toda la pila o solo una parte con un solo clic
- Después de la fusión, los PR restantes se reajustan automáticamente con rebase, de modo que el PR no fusionado más inferior vuelva a apuntar a la rama base
-
Soporte sólido de CLI
- Con la CLI
gh stackse puede crear pilas, hacer rebase, hacer push de ramas, crear PR y moverse entre niveles desde la terminal - Ejemplos de comandos CLI
gh extension install github/gh-stack: instalar la extensióngh stack alias: configurar comandos abreviadosgs init <branch>: crear la primera ramags add <branch>: agregar un nuevo nivelgs push: hacer push de todas las ramasgs submit: crear los PR de toda la pila
- Con la CLI
-
Integración con agentes de IA
- Con el comando
npx skills add github/gh-stack, se puede preparar a un agente de codificación con IA para que realice tareas relacionadas con pilas - Puede dividir automáticamente un diff grande en unidades de pila o iniciar desde cero un flujo de desarrollo basado en pilas
- Con el comando
Por qué se necesitan los PR en pila
- Los PR grandes provocan mayor dificultad de revisión, demoras en la fusión y riesgo de conflictos
- Las personas revisoras pierden contexto, baja la calidad del feedback y se ralentiza la velocidad de todo el equipo
- Stacked PRs busca resolver esto dividiendo el trabajo en una cadena de PR pequeños y enfocados
- Cada PR puede revisarse de forma independiente, mientras que el cambio completo se acumula de manera secuencial
Cómo empezar
- Para comenzar rápido, consulta la guía de Quick Start o el documento Overview
1 comentarios
Comentarios de Hacker News
Lo que necesito no es un "stacked PR", sino una UI para gestionar commits individuales
Git ya tiene el concepto de commit, así que no entiendo por qué poner encima otra abstracción llamada “stacked PR”
Facilita seguir trabajando sobre cambios que todavía no se han mergeado, y permite que los reviewers hagan revisiones independientes en unidades pequeñas de cambios grandes
Era especialmente útil en monorepos grandes o en entornos corporativos
Repetir squash, rebase y force push se siente como apuntarte al pie con una pistola
Con
git merge --no-ff,git log --first-parent,git bisect --first-parenttambién se puede conseguir básicamente el mismo efectoEstá publicado en la documentación de interactive smartlog y también tiene extensión para VSCode
Es una pena que no se haya difundido más
Los commits los uso como el proceso de evolución para completar ese PR
Después de usar Phabricator y Mercurial, volver a GitHub se siente como regresar a la Edad de Piedra
Me alegra ver jujutsu y esta nueva función recreando otra vez el flujo de stacked diff
No solo ayuda en monorepos, también permite hacer revisiones pequeñas y rápidas en desarrollos de funcionalidades de largo plazo
Mercurial siempre decía que era “más rápido que git”, pero en la práctica era más lento o se rompía
Git es feo, pero rápido y confiable
Al revisar cambios grandes (por ejemplo, actualizaciones de dependencias vendor), la experiencia de revisión de archivos en GitHub no me convence
¡Por fin salió!
El modelo de GitHub de “PR = branch” no me hacía sentido
El enfoque de stacked commit al estilo Phabricator/Gerrit encaja mucho mejor con mi forma de pensar
Ahora tendré que instalar el CLI
Una branch solo pone una bandera sobre un commit, y dejar varios puntos solo tiene sentido cuando las partes anteriores se pueden mergear de forma independiente
Me pregunto si ya resolvieron el problema de UX de Squash & Merge
Yo los apilo manualmente como main <- PR A <- PR B <- PR C,
y cuando PR A se mergea primero, PR B se convierte en un infierno de conflictos
La UI de GitHub cambia automáticamente la branch objetivo a main y aparecen conflictos raros
Solo necesito una herramienta que “simplemente funcione”
Ojalá
gh stack synclo resuelva conrebase --ontogit rebase --ontoEjemplo: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
Si PR1 y PR2 se mergean con squash, main queda como S1(A+B), S2(C+D)
Luego
git rebase --onto S2 D branch3lo reordena sin conflictosSe puede resolver con
git rebase --update-refs --onto origin/main A CEl GH CLI automatiza ese proceso
Pero al final la solución sigue siendo reorganizar commits con rebase manual
Cuando desarrollas solo, casi nunca necesitas stacked PR, pero el hábito de dividir en unidades pequeñas sigue siendo importante
Como las herramientas de IA (por ejemplo, Claude Code) generan diffs grandes de una sola vez,
sería interesante que apareciera una función donde el agente pudiera dividir el trabajo por su cuenta en unidades lógicas
También vale la pena revisar git-spice
Es compatible con GitLab y otros, y yo uso git-spice para todo en lugar de los comandos normales de git
Está genial que GitHub por fin haya agregado una función de stack a la UI
Es similar a
glab stackde GitLabAun así, el proceso de merge parece un poco incómodo: si haces merge de la parte baja del stack, el resto se rebasea y el CI vuelve a correr
Si quieres mergear solo los dos de abajo de tres parches, tienes que esperar las pruebas de cada uno
Después de eso, el stack superior se rebasea y el CI puede ejecutarse de nuevo
Vamos a añadir esa parte con más claridad en la documentación
No termino de ver la necesidad de stacked PR
En git originalmente ya se pueden revisar y aplicar patch sets por separado
El modelo de PR más bien los termina agrupando en un solo bloque
Stacked PR me parece otra abstracción más para esquivar ese problema
Los commits internos eran solo historial de desarrollo, y al mergear se juntaba todo con squash en uno solo
Así puedes apilar commits libremente durante el desarrollo y, al mergear, solo dejas un cambio limpio
La implementación de GitHub se siente un poco como una función pegada encima
O sea, es una estructura para apilar trabajo por etapas en unidades revisables
Ya hay una startup llamada Graphite enfocada en stacked PR
Yo he usado Graphite, y me da gusto que GitHub haya implementado algo parecido
Me gustan los stacked PR, pero esta implementación de GitHub me parece extraña
Bastaría con que cada branch apuntara a su padre
Más que CLI, hace falta soporte en la UI
Estaría bien que el CLI automatizara ese proceso
La razón de tener una cadena de branches es que el diff solo muestre los cambios de esa branch
Lo que faltaba era UI y visualización