Während Sie einen Stack durchlaufen, müssen Sie häufig Änderungen in einer unteren Ebene vornehmen, einen Rebase durchführen, um eine lineare Historie beizubehalten, oder ihre Branches neu strukturieren. Die gh stack Erweiterung in GitHub CLI behandelt diese Aufgaben mit kaskadierenden Vorgängen, die alle betroffenen Branches aktualisieren. Siehe CLI-Befehle für gestapelte Pull Requests.
Vornehmen von Änderungen an einer niedrigeren Ebene
Wenn Sie an der obersten Ebene arbeiten und etwas weiter unten im Stapel ändern müssen, nehmen Sie die Änderung in dem Branch vor, zu dem sie gehört, und führen Sie einen Rebase durch, anstatt das Problem auf der aktuellen Ebene zu umgehen.
-
Navigieren Sie zu dem Branch, der geändert werden muss.
Shell gh stack down
gh stack downSie können auch mit
gh stack checkout BRANCH-NAMEzu einer bestimmten Verzweigung wechseln. -
Nehmen Sie die Änderung vor und führen Sie einen Commit aus.
Shell git add . git commit -m "helpful-commit-message"
git add . git commit -m "helpful-commit-message" -
Rebasen Sie die obigen Branches, um die Änderung zu übernehmen.
Shell gh stack rebase --upstack
gh stack rebase --upstack -
Übertragen Sie die aktualisierten Branches, und kehren Sie an die Stelle zurück, an der Sie gearbeitet haben.
Shell gh stack push gh stack top
gh stack push gh stack top
Stack neu basieren
Ein Stack muss einen linearen Verlauf zwischen seinen Branches aufweisen, bevor er zusammengeführt werden kann. Beim Ausführen von gh stack rebase wird ein kaskadierendes Rebase durchgeführt, wobei jeder Branch, beginnend bei main, auf den darunterliegenden Branch umgebased wird, sodass jeder Branch die neuesten Änderungen aus allen unteren Ebenen übernimmt.
-
Rebase the stack. Standardmäßig rebaset dies jeden Branch von unten nach oben.
Shell gh stack rebase
gh stack rebaseUm den Rebase einzuschränken, verwenden Sie
--downstack, um von der niedrigsten Ebene bis zum aktuellen Branch zu rebasen, oder--upstack, um vom aktuellen Branch bis zum obersten Branch zu rebasen. -
Übertragen Sie die aktualisierten Branches. Dabei wird
--force-with-leaseverwendet, um die neu basierten Verzweigungen sicher zu aktualisieren.Shell gh stack push
gh stack push
Wenn bei einem Rebase ein Konflikt auftritt, stoppt gh stack rebase und listet die Dateien mit Konflikten auf.
- Lösen Sie die Markierungen in den betroffenen Dateien auf, fügen Sie sie mit
git addzur Staging-Area hinzu, und führen Sie danngh stack rebase --continueaus. - Um von vorn zu beginnen, führen Sie
gh stack rebase --abortaus, um alle Branches in ihren Zustand vor dem Rebase wiederherzustellen.
Hinweis
Sie können auch einen serverseitigen Rebase aus dem Pull Request auslösen, aber diese Commits sind nicht signiert. Wenn Ihr Repository signierte Commits erfordert, rebasen Sie ab GitHub CLI, damit die Commits Ihrer lokalen Git-Commit-Signaturkonfiguration folgen.
Von der GitHub Website neu basieren
Wenn ein Stapel nicht linear ist, wird in der Merge-Box eine Schaltfläche für Stapel rebasen angezeigt. Wenn Sie es auswählen, wird ein serverseitiges kaskadierendes Rebase ausgelöst, das:
- Setzt den gesamten Stack auf den neuesten Trunk zurück, z. B.
main. - Setzt jede nicht zusammengeführte Branch auf ihre Basis-Branch zurück, wobei von unten nach oben im Stack gearbeitet wird.
- Erzwingt das Pushen aller rebaseten Branches, um die Remoteversion zu aktualisieren.
Nach Abschluss der Rebase spiegelt jede Pullanforderung die aktualisierten Verzweigungen wider, und CI-Prüfungen werden erneut ausgelöst.
Hinweis
Commits, die von einer serverseitigen Rebase erstellt wurden, sind nicht signiert. Wenn für Ihr Repository signierte Commits erforderlich sind, rebasen Sie von GitHub CLI mit gh stack rebase, damit die Commits Ihrer lokalen Git-Commit-Signaturkonfiguration folgen, und pushen Sie dann mit gh stack push.
Umstrukturierung eines Stacks
Möglicherweise möchten Sie die Zusammensetzung eines Stapels ändern. Wenn Sie beispielsweise einen Branch löschen, Branches kombinieren, einen Branch einfügen, neu anordnen oder umbenennen müssen, verwenden Sie den interaktiven Befehl gh stack modify.
Stellen Sie vor der Ausführung gh stack modifyFolgendes sicher:
- Sie haben einen aktiven Stack ausgecheckt.
- Ihr Working Tree ist sauber.
- Es wird derzeit kein Rebase durchgeführt.
- Kein Pull Request ist zum Zusammenführen in der Warteschlange.
- Der Commitverlauf ist linear.
-
Öffnen Sie die Oberfläche „Modify Terminal“.
Shell gh stack modify
gh stack modify -
Wählen Sie einen Branch und merken Sie einen Vorgang vor. Neuanordnung und strukturelle Änderungen (Entfernen, Falten, Einfügen, Umbenennen) können in derselben Sitzung nicht gemischt werden.
x— einen Branch und seine zugehörigen Commits löschend— Falten Sie den Zweig in den darunter liegenden Zweig.u— Falten Sie den Zweig in den darüberliegenden.i/I— Einfügen einer neuen Verzweigung unterhalb oder oberhalb des Cursorsr— Branch umbenennen- Umschalt+↑ / Umschalt+↓ — Verzweigung neu anordnen
z— Rückgängigmachen der letzten vorgemerkten Aktion
-
Wenden Sie Ihre vorgemerkten Änderungen durch Speichern an. Bis zum Speichern wird nichts geändert.
Verwenden Sie Strg/Befehl+S.
Wenn beim Anwenden ein Konflikt auftritt, lösen Sie ihn und führen Sie
gh stack modify --continueaus, oder führen Siegh stack modify --abortaus, um den Zustand vor dem Ändern wiederherzustellen. -
Übertragen Sie die aktualisierten Branches und erstellen Sie den Stack auf GitHub erneut.
Shell gh stack submit
gh stack submit
Entfernen von der Website GitHub
Um einen Stapel auf der Website aufzulösen, z. B. um ihn neu anzuordnen oder neu zu organisieren, verwenden Sie die Option „Stapelung aufheben“ auf dem Stapel.
Durch das Entstapeln werden die offenen, Entwurfs- und geschlossenen Pull Requests aus dem Stapel entfernt. Jeder behält seinen aktuellen Basis-Branch bei, ist aber nicht mehr mit den anderen verknüpft, und die Stack-Map- und Stack-Merge-Anforderungen entfallen für ihn.
Zusammengeführte und in die Warteschlange eingereihte Pull Requests bleiben im Stack. Sobald eine Pullanforderung zusammengeführt wurde oder für die Zusammenführung als Teil eines Stapels in die Warteschlange gestellt wird, kann sie nicht mehr aus dem Stapel entfernt werden. Ein Stapel wird nur dann vollständig aufgelöst, wenn keine seiner Pull Requests zusammengeführt wurden oder zur Zusammenführung in der Warteschlange sind; andernfalls bleibt er mit den Pull Requests bestehen, die sich noch darin befinden.
Wenn Sie einen Stapel neu anordnen oder neu strukturieren möchten, ohne ihn aufzulösen, verwenden Sie stattdessen den gh stack modify Befehl. Siehe Umstrukturierung eines Stacks.
Synchronisierung Ihrer lokalen Umgebung nach dem Zusammenführen
Wenn ein Pull Request am unteren Rand des Stacks zusammengeführt wird, aktualisieren Sie den lokalen Zustand mit einem einzigen Synchronisierungsbefehl. Um lokale Branches automatisch für zusammengeführte Pull Requests gleichzeitig zu entfernen, fügen Sie die Option --prune hinzu.
gh stack sync --prune
gh stack sync --prune
Dadurch werden die neuesten Änderungen abgerufen, der Trunk per Fast-Forward aktualisiert, die verbleibenden Branches darauf rebaset, die aktualisierten Branches gepusht und der Pull-Request-Status von GitHub synchronisiert.
Pulling in Pull Requests, die dem Stapel auf GitHub hinzugefügt wurden
Wenn eine andere Person Pull Requests zum Stack auf GitHub hinzufügt, ruft gh stack sync die neuen Verzweigungen ab und fügt sie an Ihren lokalen Stack an, sodass er den Remote-Stack widerspiegelt. Ein solches sauberes Remote-Ahead-Update wird automatisch heruntergezogen, daher kann gh stack sync sicher in der Automatisierung ausgeführt werden.
Auflösen eines divergierten Stacks
Ihre lokalen und Remote-Stacks weichen voneinander ab, wenn keiner eine saubere Erweiterung des anderen ist, z. B. wenn Sie lokal einen Branch hinzufügen, während dem gleichen Stack auf GitHub verschiedene Pull Requests hinzugefügt werden. In diesem Fall kann gh stack sync die beiden nicht automatisch zusammenführen. In einem interaktiven Terminal bietet es drei Optionen:
- Verwenden Sie den Remote-Stack als maßgebliche Quelle. Ersetzt Ihre lokale Stack-Zusammensetzung durch die des Remote-Repositorys, wobei alle fehlenden Branches abgerufen werden. Wenn Sie sich auf einem Branch befinden, den der Remote-Stack nicht mehr enthält, werden Sie zum nächstgelegenen verbleibenden Branch verschoben. Dies erfordert ein sauberes Arbeitsverzeichnis ohne nicht festgeschriebene Änderungen.
- Löschen Sie den Stack auf GitHub. Löscht das Stack-Objekt auf GitHub und beendet die Synchronisierung. Ihre Pull Requests und lokalen Branches bleiben unberührt. Erstellen Sie den Stapel neu mit
gh stack submit, der auch Pull Requests für alle Branches erstellt, die Sie noch nicht übermittelt haben.gh stack modifyzuerst ausführen, wenn Sie die Struktur ändern möchten. - Abbrechen. Bricht die Synchronisierung ab, ohne Branches zu übertragen oder Pull Requests zu aktualisieren.
In einem nicht interaktiven Terminal, z. B. CI, wird die Synchronisierung bei einer Divergenz abgebrochen, ohne Branches zu pushen oder Pull Requests zu aktualisieren. Beheben Sie das Problem, indem Sie den Stapel aufheben und neu erstellen.