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?
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:
merge_target=$(git config --get branch.${branch}.merge)
). Überprüfen Sie das Zusammenführungsziel. --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. --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. 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. 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.
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.
Tags und Links git github branch branching-and-merging squash