Skip to main content
Skip to content

Verwalten von gestapelten Pull Requests

Restrukturieren Sie gestapelte Pull Requests, ordnen Sie ihre Branches neu an, und nehmen Sie Änderungen an unteren Ebenen mithilfe von GitHub CLI.

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.

  1. Navigieren Sie zu dem Branch, der geändert werden muss.

    Shell
    gh stack down
    

    Sie können auch mit gh stack checkout BRANCH-NAME zu einer bestimmten Verzweigung wechseln.

  2. Nehmen Sie die Änderung vor und führen Sie einen Commit aus.

    Shell
    git add .
    git commit -m "helpful-commit-message"
    
  3. Rebasen Sie die obigen Branches, um die Änderung zu übernehmen.

    Shell
    gh stack rebase --upstack
    
  4. Ü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
    

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.

  1. Rebase the stack. Standardmäßig rebaset dies jeden Branch von unten nach oben.

    Shell
    gh stack rebase
    

    Um 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.

  2. Übertragen Sie die aktualisierten Branches. Dabei wird --force-with-lease verwendet, um die neu basierten Verzweigungen sicher zu aktualisieren.

    Shell
    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 add zur Staging-Area hinzu, und führen Sie dann gh stack rebase --continue aus.
  • Um von vorn zu beginnen, führen Sie gh stack rebase --abort aus, 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:

  1. Setzt den gesamten Stack auf den neuesten Trunk zurück, z. B. main.
  2. Setzt jede nicht zusammengeführte Branch auf ihre Basis-Branch zurück, wobei von unten nach oben im Stack gearbeitet wird.
  3. 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.
  1. Öffnen Sie die Oberfläche „Modify Terminal“.

    Shell
    gh stack modify
    
  2. 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öschen
    • d — 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 Cursors
    • r — Branch umbenennen
    • Umschalt+↑ / Umschalt+↓ — Verzweigung neu anordnen
    • z — Rückgängigmachen der letzten vorgemerkten Aktion
  3. 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 --continue aus, oder führen Sie gh stack modify --abort aus, um den Zustand vor dem Ändern wiederherzustellen.

  4. Übertragen Sie die aktualisierten Branches und erstellen Sie den Stack auf GitHub erneut.

    Shell
    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.

Shell
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 modify zuerst 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.

Nächste Schritte