GitHub Stacked PRs
(github.github.com/gh-stack)- Neue Funktion von GitHub, mit der sich große Codeänderungen in kleine, prüfbare PR-Einheiten aufteilen und nacheinander verwalten lassen
- Jeder PR wird unabhängig geprüft, und der gesamte Stack kann mit einem Klick zusammengeführt werden
- Über die GitHub-UI und die
gh stack-CLI werden Erstellen, Navigieren, Rebasen und Mergen von Stacks unterstützt; eine Stack-Map visualisiert die Hierarchie - Durch die Integration von KI-Coding-Agenten lassen sich große Diffs automatisch in Stack-Einheiten aufteilen oder stackbasierte Entwicklung durchführen
- Ziel ist es, die Komplexität und das Konfliktrisiko großer PRs zu verringern und Review-Effizienz sowie Entwicklungsgeschwindigkeit im Team zu erhöhen
Hauptfunktionen
-
Verwaltung von Stacked PRs
- Mehrere PRs werden in Form eines geordneten Stacks organisiert, wobei jeder PR auf dem Branch des direkt darunterliegenden PR basiert
- Dadurch entsteht eine Kettenstruktur, die am Ende den Main-Branch erreicht
- GitHub erkennt den gesamten Stack und zeigt in der UI eine Stack-Map an, sodass Reviewer jede Ebene leicht durchgehen können
- Branch-Schutzregeln gelten für den endgültigen Ziel-Branch, und CI-Tests werden für alle PRs im Stack ausgeführt
-
Vereinfachtes Stack-Management
- In der GitHub-UI kann man zwischen PRs im Stack wechseln, den Status jeder Ebene prüfen und ein kaskadierendes Rebase für den gesamten Stack ausführen
- Der gesamte Stack oder auch nur ein Teil davon kann mit einem Klick gemergt werden
- Nach dem Merge werden verbleibende PRs automatisch rebased, sodass der unterste noch nicht gemergte PR auf den Standard-Branch ausgerichtet wird
-
Starke CLI-Unterstützung
- Mit der
gh stack-CLI lassen sich Stacks erstellen, rebasen, Branches pushen, PRs erzeugen und zwischen Ebenen wechseln – direkt im Terminal - Beispiele für CLI-Befehle
gh extension install github/gh-stack: Erweiterung installierengh stack alias: Kurzbefehle einrichtengs init <branch>: Ersten Branch erstellengs add <branch>: Neue Ebene hinzufügengs push: Alle Branches pushengs submit: PRs für den gesamten Stack erstellen
- Mit der
-
Integration von KI-Agenten
- Mit dem Befehl
npx skills add github/gh-stackkann ein KI-Coding-Agent dafür eingerichtet werden, Stack-Aufgaben auszuführen - Große Diffs lassen sich automatisch in Stack-Einheiten aufteilen oder von Anfang an stackbasiert entwickeln
- Mit dem Befehl
Warum Stacked PRs nötig sind
- Große PRs führen zu schwierigerem Review, verzögertem Merge und höherem Konfliktrisiko
- Reviewer verlieren den Kontext, die Qualität des Feedbacks sinkt und das gesamte Team wird langsamer
- Stacked PRs lösen das, indem sie Änderungen in kleine, fokussierte PR-Ketten aufteilen
- Jeder PR kann unabhängig geprüft werden, während sich die Gesamtänderung schrittweise aufbaut
Erste Schritte
- Für einen schnellen Einstieg siehe den Quick-Start-Guide oder die Overview-Dokumentation
1 Kommentare
Hacker-News-Kommentare
Was ich brauche, ist nicht „stacked PR“, sondern eine UI zur Verwaltung einzelner Commits
Git hat bereits das Commit-Konzept — ich verstehe nicht, warum man darüber noch die Abstraktion „stacked PR“ legen muss
Damit kann man leichter neue Arbeit auf noch nicht gemergten Änderungen aufbauen, und Reviewer können große Änderungen in kleinen Einheiten unabhängig reviewen
Besonders nützlich war das in großen Monorepos oder Unternehmensumgebungen
Wiederholt squashen, rebasen und force-pushen fühlt sich an, als würde man sich selbst ins Bein schießen
Mit
git merge --no-ff,git log --first-parent,git bisect --first-parentkann man im Grunde denselben Effekt erreichenDie Doku zu interactive smartlog ist öffentlich, und es gibt auch eine VSCode-Erweiterung
Schade, dass es sich überraschenderweise nicht stärker verbreitet hat
Commits dienen dabei als Entwicklungsverlauf, um diesen PR zu vervollständigen
Nach Phabricator und Mercurial fühlt sich die Rückkehr zu GitHub an wie eine Reise zurück in die Steinzeit
Deshalb freue ich mich über jujutsu oder diese neue Funktion, die den stacked-diff-Ablauf wiederherstellen
Nicht nur in Monorepos, sondern auch bei langfristiger Feature-Entwicklung hilft das, Reviews klein und schnell zu halten
Mercurial behauptete immer, „schneller als Git“ zu sein, war in der Praxis aber oft langsamer oder kaputt
Git ist hässlich, aber schnell und zuverlässig
Beim Review großer Änderungen, etwa bei Updates von Vendor-Abhängigkeiten, ist die Dateireview-Erfahrung auf GitHub eher schwach
Endlich ist es da!
Das GitHub-Modell „PR = Branch“ war für mich nie wirklich nachvollziehbar
Stacked Commits im Stil von Phabricator/Gerrit passen viel besser zu meiner Denkweise
Jetzt muss ich wohl die CLI installieren
Ein Branch ist letztlich nur eine Markierung auf Commits, und mehrere Zwischenpunkte zu behalten ergibt nur dann Sinn, wenn frühere Teile unabhängig gemergt werden können
Ich frage mich, ob damit das aktuelle Squash-&-Merge-UX-Problem gelöst ist
Ich staple heute manuell nach dem Muster main <- PR A <- PR B <- PR C,
und wenn PR A zuerst gemergt wird, wird PR B zur Konflikthölle
Die GitHub-UI ändert dann automatisch den Ziel-Branch auf main, wodurch seltsame Konflikte entstehen
Ich brauche einfach ein Tool, das „einfach funktioniert“
Hoffentlich löst
gh stack syncdas perrebase --ontogit rebase --ontobehandeltBeispiel: PR1(main<-A,B), PR2(main<-A,B,C,D), PR3(main<-A,B,C,D,E,F)
Wenn PR1 und PR2 per Squash gemergt werden, ist main danach S1(A+B), S2(C+D)
Danach kann man mit
git rebase --onto S2 D branch3ohne Konflikte aufräumenDas lässt sich mit
git rebase --update-refs --onto origin/main A ClösenDie GH CLI automatisiert diesen Prozess
Aber am Ende bleibt als Lösung nur, die Commits manuell per Rebase aufzuräumen
Wenn man alleine entwickelt, braucht man stacked PRs kaum, aber die Gewohnheit, in kleine Einheiten aufzuteilen, bleibt wichtig
AI-Tools wie Claude Code erzeugen oft auf einmal große Diffs,
daher wäre es interessant, wenn ein Agent seine Arbeit selbst in logische Einheiten zerlegen könnte
git-spice ist ebenfalls einen Blick wert
Es ist mit GitLab usw. kompatibel, und ich nutze inzwischen komplett git-spice statt der üblichen Git-Befehle
Es ist cool, dass GitHub endlich eine Stack-Funktion in die UI eingebaut hat
Ähnlich wie
glab stackbei GitLabDer Merge-Prozess wirkt aber etwas ungelenk — wenn man unten im Stack etwas merged, werden die restlichen Teile neu gerebased und CI läuft erneut
Wenn ich von drei Patches nur die unteren zwei mergen will, muss ich jeweils wieder auf Tests warten
Danach wird der obere Teil des Stacks gerebased und CI kann erneut anlaufen
Dieser Punkt soll in der Dokumentation noch klarer ergänzt werden
Ich verstehe den Bedarf an stacked PRs nicht so recht
In Git kann man Patch-Sets grundsätzlich einzeln reviewen und anwenden
Das PR-Modell macht daraus eher einen einzigen Block
Stacked PRs wirken wie noch eine weitere Abstraktion, um dieses Problem zu umgehen
Interne Commits sind nur Entwicklungshistorie, und beim Mergen wird alles per squash zu einem Commit zusammengeführt
So kann man während der Entwicklung frei Commits stapeln und am Ende trotzdem nur eine saubere Änderung hinterlassen
Die GitHub-Umsetzung fühlt sich ein bisschen wie angeklebte Funktionalität an
Es ist also eine Struktur, in der Arbeit schrittweise in reviewbaren Einheiten gestapelt wird
Es gibt bereits das Startup Graphite, das sich auf stacked PRs konzentriert
Ich nutze Graphite schon länger, und es freut mich, dass GitHub jetzt etwas Ähnliches umgesetzt hat
Ich mag stacked PRs, aber die GitHub-Implementierung fühlt sich diesmal merkwürdig an
Es würde doch reichen, wenn jeder Branch einfach auf seinen Parent zeigen würde
Wichtiger als die CLI wäre für mich UI-Unterstützung
Es wäre gut, wenn die CLI diesen Prozess automatisieren würde
Der Grund für die Branch-Kette ist, dass der Diff nur die Änderungen dieses Branches zeigen soll
Es fehlte nur an UI und Visualisierung