2017-04-19 3 views
4

Seit GitHub Squash and Merge eingeführt hat, verwenden alle coolen Kids an meinem Arbeitsplatz es, wenn Sie Pull-Anfragen zusammenführen. Gibt es eine Möglichkeit, "Squash and Merge" -Abzweige zu bereinigen?Wie kann ich alle Git-Zweige löschen, die über GitHub "Squash and Merge" waren?

Der folgende Befehl von How can I delete all git branches which have been merged? ist für nicht „Squash and Merge“:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d 

Antwort

0

Es gibt keine einfache Möglichkeit, dies zu automatisieren, zumindest nicht vollständig. (Einige Sonderfälle könnten behandelt werden.) Stattdessen ist es das Beste, diese Verzweigungslöschung an die Person zu delegieren, deren Pull-Request zusammengeführt wurde. Dafür gibt es mehrere gute Gründe:

  1. Sie sind die einzigen, die sicher sein können, dass die Zusammenführung korrekt ausgeführt wurde.

    Angenommen, zum Beispiel, dass, um eine Serie von sechs Commits Squash-fusionieren, die Person, die die Squash-merge tat musste, oder wählte in einer Linie oder zwei, ein paar Zeichen irgendwo ändern aus irgendeinem Grund gut oder schlecht. Diese Zeile oder zwei bedeutet, dass die Gesamtänderung im endgültigen Commit anders ist von der Summe der sechs Änderungen in den sechs Commits.

    Aber ist das Gesamtergebnis korrekt? Wenn Sie die Änderungen nicht selbst vorgenommen haben, wie werden Sie das wissen?

  2. Sie sind die einzigen, die wissen, ob sie beabsichtigen, auf diesem Zweig zu entwickeln.

    Nur weil die sechs Commits auf feature/tall wurden in eine zerquetschte commit hinzugefügt devel bedeutet nicht, dass feature/tall ist alles getan. Sie können mehrere weitere Commits hinzufügen. Sie möchten vielleicht erneut feature/tall auf devel zurücksetzen, indem Sie die sechs gedrückten Commits zugunsten des einen Six-Commit-Squash löschen, aber weitere drei Commits behalten, die sie hinzufügen wollen.

Es gibt wahrscheinlich einige weitere Fälle. Diese können alle selten sein; Sie kommen vielleicht niemals in Ihrem Projekt vor; aber der Punkt hier ist, dass Zweig feature/tall ist ihre Zweig, nicht Ihre Zweig, so dass sie - wer auch immer sie sind - sollte diejenigen sein, die es löschen, wenn es fertig ist.

Beachten Sie, dass wenn Sie feature/tall abholen Sie Ihre eigenen Git haben, benennen Sie es in origin/feature/tall (vorausgesetzt, Ihre Fernbedienung heißt origin). Wenn Sie damit experimentieren und git checkout feature/tall, erstellt Ihr Git eine Kopie für Sie. Sobald sie feature/tall löschen und Sie git fetch origin --prune ausführen, löscht Ihr Git Ihre origin/feature/tall. So jetzt ist das Problem einfacher und kann automatisiert werden: find branches whose "upstream" is gone, and delete those. (Das eine Zeilenskript in dieser Antwort hat einige kleinere Fehler; siehe die Kommentare; ein zarteres würde git for-each-ref verwenden und die Upstream-Einstellung jedes Zweiges mit git rev-parse nachschlagen, aber das ist wahrscheinlich zu viel.)

Verwandte Themen