Wie kann ich alle lokalen Zweige löschen, die zu keinen Änderungen führen würden, wenn sie in den Master eingebunden werden?

8

Ich weiß wie man alle lokalen löscht Zweige, die zusammengeführt wurden . Ich glaube aber, dass dies auf Githubs neues Pull-Request-Squash- und Merge-Feature zurückzuführen ist , Ich finde mich mit einer Menge von lokalen Verzweigungen, die nicht zusammengefügt sind, aber wenn in Master zusammengeführt würde zu keinen Änderungen führen.

Wie kann ich diese lokalen Verzweigungen, d. h. diejenigen lokalen Verzweigungen, die nicht notwendigerweise zusammengeführt wurden, aber keinen Einfluss auf Master (oder generischer den aktuellen Zweig) haben?

    
Claudiu 05.04.2016, 14:15
quelle

2 Antworten

3

Es gibt keine perfekte Lösung, aber Sie können nahe kommen, vielleicht nahe genug.

Achten Sie darauf, mit einem sauberen Arbeitsbaum und Index zu beginnen (siehe require_clean_work_tree in git-sh-setup ).

Für jeden Kandidatenzweig $branch , der möglicherweise gelöscht werden kann:

  1. Finden Sie das Zusammenführungsziel (vermutlich merge_target=$(git config --get branch.${branch}.merge) ). Überprüfen Sie das Zusammenführungsziel.
  2. Führen Sie eine Zusammenführung mit --no-commit durch; oder checken Sie in Schritt 1 mit --detach aus, so dass Sie eine Bestätigung erhalten, die Sie abbrechen können, wenn die Zusammenführung erfolgreich ist.
  3. Prüfe, ob git denkt, dass die Zusammenführung erfolgreich war, und wenn ja, ob der aktuelle Baum mit dem vorherigen Baum übereinstimmt, d. h. keine Änderungen mit sich bringt. Wenn Sie exakte Übereinstimmungen testen können, und wenn Sie das Commit zulassen (über --detach ), können Sie diesen letzten Test sehr einfach und ohne Diffing durchführen: Führen Sie sowohl git rev-parse HEAD^{tree} als auch git rev-parse HEAD^^{tree} 1 aus und sehen, ob sie den gleichen Hash erzeugen. Wenn Sie das Commit nicht zulassen, können Sie weiterhin git diff das aktuelle ( HEAD ) Commit für die vorgeschlagene Zusammenführung ausführen. Wenn Sie etwas Rauschen aus dem diff entfernen müssen (z. B. Konfigurationsdateien, die nicht sein sollten, aber trotzdem in den Commits sind), gibt Ihnen das einen Platz dafür.
  4. Zurücksetzen ( git merge --abort; git reset --hard HEAD; git clean -f oder ähnlich, je nachdem, wie Sie sich entschieden haben, die Schritte 1-3 zu implementieren). Dies dient lediglich dazu, Ihren Arbeitsbaum und den Index für den nächsten Durchlauf wieder sauber zu machen.
  5. Wenn die Zusammenführung in Schritt 3 funktioniert und keine Änderungen eingeführt wurde, können Sie die lokale Verzweigung löschen. Ansonsten, behalte es.

Im Wesentlichen ist dies "tatsächlich tun die Zusammenführung und sehen, was passiert", nur vollständig automatisiert.

1 Diese Notation sieht etwas bizarr aus, aber es ist nur HEAD^ - das erste Elternteil von HEAD - gefolgt von ^{tree} . Alternative Schreibweisen sind möglicherweise einfacher zu lesen: HEAD~1^{tree} oder ${merge_target}^tree , wobei ${merge_target} der Zweig ist, den Sie in Schritt 1 ausgecheckt haben. Beachten Sie, dass davon ausgegangen wird, dass die Zusammenführung erfolgreich war. Das Ergebnis der Zusammenführung befindet sich im Beendigungsstatus von git merge : Null bedeutet erfolgreich, ungleich Null bedeutet fehlgeschlagen und benötigt manuelle Unterstützung, vermutlich aufgrund eines Zusammenführungskonflikts.

    
torek 06.04.2016 01:40
quelle
0

Wenn Sie git "branch -v" ausführen, wird für die Verfolgungszweige, die Änderungen haben, "ahead" neben ihnen geschrieben.

Die anderen zwei Optionen: "dahinter" und wenn nichts geschrieben wird, bedeutet, dass die Zweige keine Änderungen haben, die sich auf die Zweige auswirken, die sie verfolgen.

Sie können daher "git fetch" ausführen, um die Remote-Tracking-Zweige zu aktualisieren, und dann die Ergebnisse "git branch -v" analysieren, um herauszufinden, welche Zweige keine Änderungen aufweisen und welche Zweige sie haben.

    
Yakir Dorani 21.11.2017 09:47
quelle