Wann lösche ich Zweige in Git?

284

Angenommen, wir haben eine stabile Anwendung.

Morgen meldet jemand einen großen alten Fehler, den wir sofort beheben möchten. Also erstellen wir einen Zweig für diesen Hotfix aus "master", nennen ihn "2011_Hotfix" und drücken ihn nach oben, damit alle Entwickler bei der Behebung zusammenarbeiten können.

Wir beheben den Fehler und führen "2011_Hotfix" in "master" sowie in den aktuellen Entwicklungszweig ein. Und drücke "Meister".

Was machen wir jetzt mit "2011_Hotfix"? Sollte es bis zum Ende der Zeit für immer als Zweig da draußen bleiben oder sollten wir es jetzt löschen, da es seinen Zweck erfüllt hat? Es scheint unrein, nur überall Zweige herumliegen zu lassen, da die Liste der Zweige wahrscheinlich sehr lang wird, von denen die meisten nicht einmal mehr notwendig sind.

Was passiert mit der Historie, falls es gelöscht werden sollte? Wird das beibehalten, obwohl die eigentliche Filiale nicht mehr verfügbar ist? Wie würde ich einen Remote-Zweig entfernen?

Anthony Compton
quelle
33
Es ist oft hilfreich, sich Branchen als Ideen vorzustellen. Eine ziemlich gute Faustregel lautet: Wenn Sie mit der Arbeit an den Ideen des Zweigs fertig sind - einschließlich des Testens und Einbeziehens dieser Änderungen (Zusammenführen in den Master) -, sind Sie mit dem Zweig selbst fertig.
Cascabel
3
Was ich gerne wissen würde: Wenn der Remote-Hotfix entfernt wird, wird er dann für alle Entwickler, die zusammengearbeitet haben, lokal entfernt? Wenn nicht; Wie kann man das erreichen? Ich würde denken, dass eine Person den Hotfix auf Master migriert, aber danach sollte er auch für alle Mitarbeiter bereinigt werden, um zu verhindern, dass sie diesem Zweig Commits hinzufügen.
Rolandow
1
Sie können die lokalen Repositorys Ihrer Mitarbeitercomputer nicht beeinflussen. Sie müssen ihn entweder anweisen, den Zweig lokal zu löschen, oder Sie können diese Serverseite auch mit Git-Hooks / Zweigstellensicherheit erzwingen, um
Pushs

Antworten:

183

Sie können einen Zweig mit sicher entfernen git branch -d yourbranch. Wenn es nicht zusammengeführte Änderungen enthält (dh Sie würden Commits verlieren, wenn Sie den Zweig löschen), wird git Sie darüber informieren und ihn nicht löschen.

Das Löschen eines zusammengeführten Zweigs ist also billig und lässt Sie keinen Verlauf verlieren.

Um einen Remote-Zweig zu löschen, verwenden Sie git push origin :mybranch, vorausgesetzt, Ihr Remote-Name ist Ursprung und der Remote-Zweig, den Sie löschen möchten, heißt mybranch.

Artefakt2
quelle
35
"Das Löschen eines zusammengeführten Zweigs ist billig", aber es bleibt auch so. Es gibt keinen signifikanten Leistungseinbruch in Bezug auf die Zeit oder den Raum, den Git verwendet, wenn Sie ihn beibehalten. Das heißt, ich würde den Zweig löschen, weil alle Commits bereits in der Geschichte von vorhanden sind master, so dass die Dinge viel sauberer werden.
MatrixFrog
22
Einer meiner Gründe, Zweige löschen zu wollen, ist: Wir nehmen viele Änderungen an Zweigen vor (eigentlich alle Änderungen), sodass Sie schließlich eine lange Liste erhalten, wenn Sie den Befehl 'git branch' verwenden. Zur Übersicht möchte ich diese Liste kürzen. So werden alte Zweige gelöscht. Reale-Veröffentlichungen sind mit Tags versehen, daher sind sie für mich nicht in dieser Diskussion enthalten.
michel.iamit
7
Ich bin zwar damit einverstanden, bereits zusammengeführte Zweige zu löschen, aber wenn Sie eine Liste von Zweigen
anzeigen
51
@MatrixFrog Es ist billig, in Bezug auf Git zu bleiben, aber die menschlichen Kosten können teuer werden. Ich habe gerade ein Projekt mit ungefähr 40 Zweigen eingegeben, alle mit numerischen Zweignamen. Ich habe keine Ahnung, was was ist, und fast jeder dieser Zweige ist abgestanden. Der Aufwand, diese Zweige zu durchsuchen und herauszufinden, was anstrengend ist und Zeit braucht. Also ja, technisch ist es billig, aber es ist wirklich nicht. Ich mag es, meine Git-Repo-Schiffsform zu behalten. Wenn es nicht in Active Dev ist und zusammengeführt wurde, löschen Sie es. Aber das ist nur mein MO und ich respektiere, dass andere etwas anderes machen könnten.
Dudewad
1
Was ist der Befehl, um --no-mergeddie Standardeinstellung festzulegen? Ich habe es versucht git config --global --add branch.noMerged trueund es wurde hinzugefügt, aber es machte keinen Unterschied.
Craig Silver
55

Was Sie tun müssen, ist alles zu markieren, was Sie freigeben. Behalten Sie Zweige bei, wenn Sie sich aktiv entwickeln.

Löschen Sie alte Zweige mit

git branch -d branch_name

Löschen Sie sie vom Server mit

git push origin --delete branch_name

oder die alte Syntax

git push origin :branch_name

Dies lautet "Push nichts in branch_name am Ursprung".

Das heißt, solange die DAG (gerichteter azyklischer Graph) darauf hinweisen kann, werden die Commits in der Geschichte vorhanden sein.

Google "git-flow" und das kann mehr Einblick in Release-Management, Verzweigung und Tagging geben.

Adam Dymitruk
quelle
31

Da die Frage das "github" -Tag hat, möchte ich auch Folgendes hinzufügen: Insbesondere in Github wird dies nicht der Fall sein , wenn Sie einen Zweig per Pull-Request anfordern und dieser zusammengeführt wird (entweder über die Benutzeroberfläche oder durch Zusammenführen des Zweigs der Pull-Anfrage) Verlieren Sie die Pull-Anforderungsdaten (einschließlich Kommentare), auch wenn Sie den Zweig entfernen .

Eine Folge davon: Wenn Sie Pull-Anforderungen als Teil Ihres Workflows einbeziehen (der sich hervorragend in Codeüberprüfungen einfügt), können Sie Zweige sicher löschen, sobald sie zusammengeführt werden. Dies ist so alltäglich, dass Github kürzlich eine (süße) Funktion hinzugefügt hat, die direkt nach dem Zusammenführen einer Pull-Anforderung die Schaltfläche "Zweig löschen" öffnet.

Es ist jedoch zu beachten, dass jede Gruppe den Workflow übernehmen sollte, der am besten zu ihr passt (und dies kann dazu führen, dass solche Zweige gelöscht werden oder nicht). Mein aktuelles Arbeitsteam beschneidet beispielsweise alle Zweige, die nicht mit dem Master oder der Bereitstellung zusammenhängen (z. B. Produktion, Staging usw.), sobald ihre Pull-Anforderungen zusammengeführt werden, und wir haben immer noch die vollständige Verfolgung, wie sich die zugehörigen Commits gebildet haben jede schrittweise Verbesserung jedes Produkts.

Natürlich ersetzt keine Verlaufsverwaltung (Pull-Anforderungen oder auf andere Weise) das ordnungsgemäße Markieren von Versionen (die Sie vorzugsweise mit demselben Tool / Skript automatisieren, das eine Version bereitstellt / verpackt), sodass Sie jederzeit schnell zu den Benutzern wechseln können, auf denen sich Ihre Benutzer gerade befinden zu einem bestimmten Zeitpunkt. Das Taggen ist auch der Schlüssel zur Lösung Ihres ursprünglichen Problems: Wenn Sie feststellen, dass ein Zweig, der mit den "Arbeits" -Zweigen zusammengeführt wurde, gelöscht werden kann und sollte, und jeder Zweig, der mit einem Versions-Tag zusammengeführt wird, sollte "Produktion" usw. dies nicht tun Sie haben die Hotfixes immer aktiv, bis sie in eine zukünftige Version integriert sind.

chesterbr
quelle
2
Vielen Dank für die Erklärung, warum Github mir die Schaltfläche "Zweig löschen" angezeigt hat.
Todd Owen
Wir verwenden Sourcetree und es gibt die Möglichkeit, den lokalen Hotfix-Zweig und den Remote-Hotfix-Zweig offen zu halten. Ich dachte, dass das Schließen eines Hotfix-Zweigs das Löschen bedeutet und Sie ihn nicht wiederverwenden können. zB Wir müssen in den nächsten 5 Tagen jeden Tag Hotfixes veröffentlichen. Dann schließen wir es. Aber sagen wir am 6. Tag, wir brauchen einen weiteren Hotfix. Erstellen wir einen neuen Hotfix-Zweig?
Gefahr 14
Es ist das, was die Leute normalerweise tun. Wenn eine individuelle Benennung nicht möglich ist, können Sie sie anhand des Tages oder anhand der Referenz für das Ticketsystem, das sie verwaltet (falls vorhanden), benennen. Natürlich sollten Git-Workflows auf der Basis "Was auch immer für Ihr Team am besten funktioniert" angewendet werden. Machen Sie sich also keine Sorgen, wenn Sie sich für eine andere Arbeitsweise entscheiden.
Chesterbr
7

Ich würde hinzufügen, dass der Nachteil des Löschens von Zweigen darin besteht, dass Sie alle Hyperlinks zu diesen Zweigen auf GitHub unterbrechen (diese Frage ist mit github gekennzeichnet). Sie erhalten eine 404 Not FoundFehlermeldung für diese Links. Aus diesem Grund ändere ich meine Links so, dass sie auf ein Commit oder Tag verweisen, nachdem ich einen Zweig auf GitHub gelöscht habe.

Da einige Links nicht geändert werden können, z. B. in E-Mails, vermeide ich jetzt, Hyperlinks zu GitHub-Zweigen vollständig zu erstellen und vom ersten Tag an auf ein Commit oder Tag zu verlinken.

Ich ziehe es vor, Zweige nach dem Zusammenführen zu löschen. Dies verhindert das visuelle Durcheinander einer langen Liste von Zweigen in Ihrem Repository. Diese Zweige werden auch an alle Gabeln des Repositorys weitergegeben.

Zuerst lösche ich meinen lokalen Zweig. Dies verhindert, dass es später versehentlich gedrückt wird.

git branch -d branchName

Dann lösche ich den Fernverfolgungszweig

git branch -dr remoteName\branchName

Dann lösche ich den Zweig auf GitHub. Ich benutze die Weboberfläche, aber der entsprechende Befehl ist unten.

git push remoteName :branchName

Selbst wenn der Zweig nie zusammengeführt wird, möchte ich die Commits normalerweise für die Nachwelt behalten. Ich möchte jedoch immer noch den Zweig löschen. Um die Commits zu verteilen und zu verhindern, dass sie vom Garbage Collector gefressen werden, erstelle ich ein mit Anmerkungen versehenes Tag, das auf dasselbe Commit wie der gelöschte Zweig verweist.

git tag -a tagName commitOrBranchName

Dann schiebe ich das Etikett auf Github

git push remoteName tagName
Mark F. Guerra
quelle
Wann frisst der Müllsammler die Commits der Filiale? Müssen Sie das Tag markieren und verschieben, bevor Sie den Zweig löschen?
Jared Thirsk
4

Es scheint, dass Sie den 2011_HotfixZweig löschen möchten, ohne seinen Verlauf zu verlieren. Ich werde zuerst die Löschung und dann die Geschichte besprechen.

Die üblichen gitMethoden zum Löschen von Zweigen wurden bereits oben beschrieben und funktionieren wie erwartet. githat keinen Befehl mit einem oder zwei Wörtern, der bedeutet: "Hey git, lösche sowohl den lokalen als auch den entfernten Zweig." Dieses Verhalten kann jedoch über ein Shell-Skript nachgeahmt werden. Nehmen Sie zum Beispiel Zach Holmans Shell-Skript 'git-nuke' . Es ist sehr einfach:

#!/bin/sh
git branch -D $1
git push origin :$1

Fügen Sie dies in eine ausführbare Datei (z. B. git-nuke) in einem Ihrer $PATHVerzeichnisse ein. Wenn Sie sich nicht in der 2011_HotfixVerzweigung befinden, werden durch einfaches Ausführen git-nuke 2011_Hotfixsowohl die lokalen als auch die Remote-Zweige gelöscht. Dies ist viel schneller und einfacher - wenn auch gefährlicher - als die Standardbefehle git.

Ihre Sorge um die Erhaltung der Geschichte ist gut. In diesem Fall brauchen Sie sich keine Sorgen zu machen. Sobald Sie verschmelzen 2011_Hotfixauf master, von allen Commits 2011_Hotfixhinzugefügt werden , um master‚Geschichte zu begehen. Kurz gesagt, Sie verlieren durch eine einfache Zusammenführung nicht den Verlauf.

Ich muss noch ein Wort hinzufügen, das vielleicht den Rahmen Ihrer Frage sprengt, aber dennoch relevant ist. Stellen wir uns vor, es gibt 20 winzige "Work-in-Progress" -Verpflichtungen 2011_Hotfix. Sie möchten jedoch, dass nur ein vollständiges Commit 2011_Hotfixzum Verlauf hinzugefügt wird master. Wie kombinieren Sie alle 20 kleinen Commits zu einem großen Commit? Glücklicherweise gitkönnen Sie mithilfe von mehrere Commits zu einem Commit zusammenfassen git-rebase. Ich werde hier nicht erklären, wie das funktioniert; Wenn Sie interessiert sind, ist die Dokumentation fürgit-rebase ausgezeichnet. Beachten Sie, dass der Verlauf neu geschrieben wird. git rebaseDaher sollte er mit Bedacht verwendet werden, insbesondere wenn Sie neu in diesem Bereich sind. Schließlich handelt Ihr 2011_HotfixSzenario von einem Entwicklerteam, nicht von einem Solo-Entwickler. Wenn Projektteammitglieder verwendengit rebaseEs ist ratsam, dass das Team explizite Richtlinien für die Verwendung von hat git rebase, damit ein Cowboy-Entwickler im Team die gitGeschichte eines Projekts nicht unabsichtlich beschädigt .

jfmercer
quelle
3

Wenn es erfolgreich wieder zusammengeführt und vielleicht sogar markiert wurde, würde ich sagen, dass es keine Verwendung mehr hat. So können Sie sicher tun git branch -d branchname.

Michael Fürstenberg
quelle
2

Wenn Sie lokale Zweige beschneiden möchten, die vom Ursprung entfernt wurden, können Sie sie auch während der Verwendung beschneiden git fetch

git fetch --prune
huch
quelle
0

Sie können Zweige in allen wichtigen Web-Benutzeroberflächen wie Github und BitBucket löschen. Nachdem Sie den Zweig online gelöscht haben, können Sie den lokalen Zweig mit löschen

git remote prune origin
tkruse
quelle