GitHub Stacked PRs
(github.github.com/gh-stack)- Novo recurso do GitHub que permite dividir grandes mudanças de código em PRs pequenos e revisáveis para gerenciá-las em sequência
- Cada PR é revisado de forma independente, e toda a pilha pode ser mesclada com um clique
- Com a interface do GitHub e a CLI
gh stack, há suporte para criar, navegar, rebasear e mesclar pilhas, além de visualizar a hierarquia com o stack map - Com a integração de agentes de codificação com IA, é possível dividir automaticamente grandes diffs em pilhas ou desenvolver com base em pilhas
- O objetivo é reduzir a complexidade e o risco de conflitos em PRs grandes e aumentar a eficiência da revisão e a velocidade de desenvolvimento da equipe
Principais recursos
-
Gerenciamento de PRs em pilha
- Vários PRs podem ser organizados na forma de uma pilha ordenada (stack), em que cada PR se baseia no branch do PR imediatamente abaixo
- Isso forma uma estrutura em cadeia que, no fim, chega ao branch principal
- O GitHub reconhece toda a pilha e exibe um stack map na interface, permitindo que revisores naveguem facilmente por cada camada
- As regras de proteção de branch se aplicam ao branch de destino final, e os testes de CI são executados para todos os PRs da pilha
-
Gerenciamento simplificado de pilhas
- Na interface do GitHub, é possível navegar entre os PRs da pilha, verificar o estado de cada camada e executar um cascading rebase em toda a pilha
- É possível mesclar toda a pilha ou apenas parte dela com um clique
- Após a mesclagem, os PRs restantes são rebaseados automaticamente, e o PR não mesclado mais abaixo passa a ser ajustado para o branch base
-
Suporte robusto de CLI
- Com a CLI
gh stack, é possível criar pilhas, rebasear, fazer push de branches, criar PRs e navegar entre camadas pelo terminal - Exemplos de comandos da CLI
gh extension install github/gh-stack: instala a extensãogh stack alias: configura comandos de atalhogs init <branch>: cria o primeiro branchgs add <branch>: adiciona uma nova camadags push: faz push de todos os branchesgs submit: cria os PRs de toda a pilha
- Com a CLI
-
Integração com agente de IA
- Com o comando
npx skills add github/gh-stack, é possível ensinar um agente de codificação com IA a executar tarefas de pilha - Grandes diffs podem ser divididos automaticamente em pilhas, ou o desenvolvimento baseado em pilhas pode ser adotado desde o início
- Com o comando
Por que PRs em pilha são necessários
- PRs grandes causam maior dificuldade de revisão, atraso na mesclagem e risco de conflitos
- Os revisores perdem o contexto, a qualidade do feedback cai e a velocidade de toda a equipe diminui
- O Stacked PRs resolve isso ao dividir o trabalho em uma cadeia de PRs pequenos e focados
- Cada PR pode ser revisado independentemente, enquanto o conjunto completo de mudanças se acumula em sequência
Como começar
- Para começar rapidamente, consulte o guia Quick Start ou a documentação Overview
1 comentários
Comentários do Hacker News
O que eu preciso não é de "stacked PR", e sim de uma UI para gerenciar commits individuais
O Git já tem o conceito de commit; não entendo por que colocar outra abstração chamada “stacked PR” por cima disso
Ele facilita começar um novo trabalho em cima de algo que ainda não foi mergeado e permite que revisores façam revisões independentes em partes menores de uma mudança grande
Era especialmente útil em monorepos grandes ou em ambientes corporativos
Ficar repetindo squash, rebase e force push parece apontar uma arma para o próprio pé
git merge --no-ff,git log --first-parent,git bisect --first-parentjá conseguem produzir praticamente o mesmo efeitoEstá disponível publicamente na documentação do interactive smartlog e também tem extensão para VSCode
É uma pena que não tenha se espalhado mais
Os commits servem como o processo de evolução para concluir aquele PR
Depois de usar Phabricator e Mercurial, voltar para o GitHub dá a sensação de voltar para a Idade da Pedra
Fico feliz em ver o jujutsu e esse novo recurso recriando o fluxo de stacked diff
Isso ajuda não só em monorepos, mas também no desenvolvimento de funcionalidades de longo prazo, permitindo revisões pequenas e rápidas
O Mercurial sempre dizia que era “mais rápido que o git”, mas na prática era lento ou quebrava
O Git é feio, mas rápido e confiável
Ao revisar mudanças grandes (por exemplo, atualização de dependências vendorizadas), a experiência de revisão de arquivos no GitHub deixa a desejar
Finalmente saiu!
O modelo do GitHub de “PR = branch” nunca fez sentido para mim
O stacked commit no estilo Phabricator/Gerrit combina muito mais com a forma como eu penso
Agora vou ter que instalar a CLI
Uma branch é só uma bandeira fincada em um commit, e manter vários pontos só faz sentido quando dá para fazer merge das partes anteriores de forma independente
Queria saber se isso resolve o atual problema de UX do Squash & Merge
Eu empilho manualmente como main <- PR A <- PR B <- PR C,
e quando o PR A é mergeado primeiro, o PR B vira um inferno de conflitos
A UI do GitHub muda automaticamente a branch alvo para main e isso gera conflitos estranhos
Eu só preciso de uma ferramenta que “simplesmente funcione”
Espero que
gh stack syncresolva isso comrebase --ontogit rebase --ontona CLI e no servidorEx.: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
Se PR1 e PR2 forem mergeados com squash, a main vira S1(A+B), S2(C+D)
Depois,
git rebase --onto S2 D branch3reorganiza tudo sem conflitosDá para resolver com
git rebase --update-refs --onto origin/main A CA GH CLI automatiza esse processo
Mas, no fim, a solução continua sendo reorganizar os commits manualmente com rebase
Quando se desenvolve sozinho, quase não há necessidade de stacked PR, mas o hábito de dividir em unidades pequenas continua importante
Como ferramentas de IA (ex.: Claude Code) geram diffs grandes de uma vez,
seria interessante se o agente soubesse dividir o trabalho por conta própria em unidades lógicas
Vale a pena conferir o git-spice também
É compatível com GitLab e outros, e eu uso git-spice para tudo no lugar dos comandos git tradicionais
É legal ver o GitHub finalmente colocando uma função de stack na UI
É parecido com o
glab stackdo GitLabMas o processo de merge parece um pouco estranho — se você mergear a parte de baixo da pilha, o resto é rebaseado e a CI roda de novo
Se eu quiser mergear só os dois patches de baixo entre três, vou ter que esperar os testes de cada um
Depois disso, a pilha de cima pode ser rebaseada e a CI talvez rode de novo
Vamos deixar essa parte mais clara na documentação
Não entendo muito bem a necessidade de stacked PR
No git, já é possível revisar e aplicar conjuntos de patches individualmente
O modelo de PR, na verdade, acaba juntando tudo em um bloco só
Stacked PR parece outra abstração para contornar esse problema
Os commits internos eram só histórico de desenvolvimento; na hora do merge, tudo era unido em um único commit com squash
Assim, durante o desenvolvimento você pode empilhar commits livremente, e no merge fica só uma mudança limpa
A implementação do GitHub dá a sensação de ser uma função colada por cima
Ou seja, é uma estrutura para empilhar o trabalho em etapas, mantendo unidades revisáveis
Existe uma startup chamada Graphite já focada em stacked PR
Eu usava Graphite, então fico feliz em ver o GitHub implementando algo parecido
Eu gosto de stacked PR, mas essa implementação do GitHub parece feita de um jeito estranho
Bastaria cada branch apontar para sua branch pai
Mais do que CLI, o que faz falta é suporte na UI
Seria bom se a CLI automatizasse esse processo
A razão para usar uma cadeia de branches é que o diff mostra apenas as mudanças daquela branch
O que faltava era UI e visualização