wake-up-neo.net

Wann werden Zweige in Git gelöscht?

Angenommen, wir haben eine Anwendung, die stabil ist. 

Morgen meldet jemand einen großen Fehler, den wir sofort für ein Hotfix beschließen. Also erstellen wir aus "master" einen Zweig für diesen Hotfix, nennen ihn "2011_Hotfix" und treiben es hoch, 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ücken Sie "Master".

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

Was wird mit seiner Geschichte geschehen, falls es gelöscht werden sollte? Wird das beibehalten, auch wenn der eigentliche Zweig nicht mehr verfügbar ist? Wie würde ich auch einen entfernten Zweig entfernen?

237
Anthony Compton

Sie können einen Zweig mit git branch -d yourbranch sicher entfernen. Wenn es nicht zusammengeführte Änderungen enthält (dh Sie würden durch das Löschen des Zweigs Commits verlieren), wird git es Ihnen mitteilen und wird es nicht löschen.

Das Löschen eines zusammengeführten Zweigs ist also billig und führt nicht dazu, dass Sie Geschichte verlieren.

Um einen entfernten Zweig zu löschen, verwenden Sie git Push Origin :mybranch, vorausgesetzt, Ihr entfernter Name ist Origin und der entfernte Zweig, den Sie löschen möchten, heißt mybranch.

152
Artefact2

Was Sie tun müssen, ist das zu kennzeichnen, was Sie freigeben. Behalten Sie Zweige herum, wenn Sie sich aktiv entwickeln. 

Alte Äste mit löschen

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

das liest sich als "Push-Objekt in Origin".

Solange die DAG (gerichteter azyklischer Graph) darauf zeigen kann, werden die Commits in der Geschichte vorhanden sein.

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

45
Adam Dymitruk

Da die Frage das "github" -Tag hat, würde ich auch folgendes hinzufügen: insbesondere in Github , wenn Sie pull-request einen Zweig machen und dieser zusammengeführt wird (entweder über die Benutzeroberfläche oder durch Zusammenführen des Pulls) Anforderungszweig) verlieren Sie die Pull-Anforderungsdaten (einschließlich Kommentare) nicht, , auch wenn Sie den Zweig entfernen.

Eine Folge davon: Wenn Sie Pull-Anforderungen als Teil Ihres Workflows verwenden (was sich wunderbar mit Code-Reviews verbindet), können Sie Verzweigungen 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 die Schaltfläche "Zweig löschen" direkt nach dem Zusammenführen einer Pull-Anforderung anzeigt.

Es sollte jedoch beachtet werden, dass jede Gruppe den Workflow verwenden sollte, der am besten zu ihr passt (und dies kann zum Löschen solcher Zweige führen oder auch nicht). Mein aktuelles Arbeitsteam beschneidet zum Beispiel alle Zweige, die nicht Master- oder Deployment-relevant sind (z. B. Produktion, Bereitstellung usw.), sobald ihre Pull-Anforderungen zusammengeführt werden, und wir haben immer noch die vollständige Verfolgung der Form der zugehörigen Commits jede inkrementelle Verbesserung jedes Produkts.

Natürlich ersetzt keine Verlaufsverwaltung (Pull-Anfragen oder andere) das ordnungsgemäße Versehen von Versionen (was Sie vorzugsweise mit demselben Tool/Skript automatisieren, das/das eine Version bereitstellt/packt), so dass Sie jederzeit schnell auf das umstellen können, wo sich Ihre Benutzer gerade befinden zu einem bestimmten Zeitpunkt. Tagging ist auch der Schlüssel zum Lösen Ihres ursprünglichen Problems: Wenn Sie feststellen, dass ein Zweig, der zu den "Arbeits" -Zweigen zusammengefügt wird, gelöscht werden kann und sollte, und dass jeder, der zu einem Versions-Tag zusammengefügt wird, "Produktion" usw. nicht sollte Sie haben die Hotfixes immer aktiv, bis sie in eine zukünftige Version integriert werden.

28
chesterbr

Ich möchte hinzufügen, dass der Nachteil des Löschens von Verzweigungen darin besteht, dass Sie alle Hyperlinks zu diesen Verzweigungen auf GitHub aufheben (diese Frage ist mit github gekennzeichnet). Sie erhalten einen 404 Not Found-Fehler für diese Links. Deshalb ändere ich meine Links, um auf ein Commit oder ein Tag zu verweisen, nachdem ich einen Zweig in GitHub gelöscht habe.

Da einige Verknüpfungen nicht geändert werden können, wie zum Beispiel in E-Mails, vermeide ich es, Hyperlinks zu GitHub-Zweigen vollständig zu erstellen und von Anfang an auf ein Commit oder ein Tag zu verlinken.

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

Zuerst lösche ich meine Filiale. Dies verhindert, dass es versehentlich später gedrückt wird.

git branch -d branchName

Dann lösche ich den Remote-Tracking-Zweig

git branch -dr remoteName\branchName

Dann lösche ich den Zweig auf GitHub. Ich benutze das Webinterface, aber der entsprechende Befehl ist unten.

git Push remoteName :branchName

Selbst wenn der Zweig niemals zusammengeführt wird, möchte ich normalerweise die Verpflichtungen für die Nachwelt behalten. Ich mag es aber immer noch, den Zweig zu löschen. Um die Commits zu verbreiten und zu verhindern, dass sie vom Garbage Collector verzehrt werden, mache ich ein kommentiertes Tag, das auf das gleiche Commit verweist wie der gelöschte Zweig.

git tag -a tagName commitOrBranchName

Dann schiebe ich den Tag zu github

git Push remoteName tagName
6
Mark F Guerra

Es scheint, dass Sie den Zweig 2011_Hotfix löschen möchten, ohne seine Historie zu verlieren. Ich werde zuerst auf das Löschen und dann auf die Geschichte eingehen. 

Die üblichen Verzweigungsmethoden von git wurden bereits oben beschrieben und funktionieren erwartungsgemäß. git hat keinen Befehl für ein oder zwei Wörter, dh "Hey git, lösche sowohl den lokalen Zweig als auch den Remote-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

Legen Sie dies in einer ausführbaren Datei (z. B. git-nuke) in einem Ihrer $PATH-Verzeichnisse ab. Wenn Sie sich nicht im Zweig 2011_Hotfix befinden, können Sie einfach git-nuke 2011_Hotfix ausführen, um sowohl den lokalen Zweig als auch den entfernten Zweig zu löschen. Dies ist viel schneller und einfacher - wenn auch vielleicht gefährlicher - als die Standardbefehle git

Ihre Sorge um den Erhalt der Geschichte ist gut. In diesem Fall brauchen Sie sich keine Sorgen zu machen. Wenn Sie 2011_Hotfix mit master zusammenführen, werden alle Commits von 2011_Hotfix zum Commit-Verlauf von master hinzugefügt. Kurz gesagt, Sie werden durch eine einfache Verschmelzung keine Geschichte verlieren. 

Ich muss noch ein Wort hinzufügen, das vielleicht außerhalb des Rahmens Ihrer Frage liegt, aber dennoch relevant ist. Stellen wir uns vor, dass es 20 winzige "work-in-progress" -Commits für 2011_Hotfix gibt. Sie möchten jedoch nur ein vollständiges Commit für 2011_Hotfix zur Historie von master hinzufügen. Wie kombinieren Sie alle 20 Small Commits zu einem großen Commit? Glücklicherweise können Sie mit git mehrere Commits mithilfe von git-rebase zu einem Commit konsolidieren. Ich werde hier nicht erklären, wie das funktioniert. Wenn Sie jedoch interessiert sind, ist die Dokumentation für git-rebase hervorragend. Beachten Sie, dass git rebase die Historie umschreibt. Daher sollte sie mit Bedacht verwendet werden, insbesondere wenn Sie noch nicht so weit sind. Schließlich geht es in Ihrem 2011_Hotfix-Szenario um ein Entwicklerteam, nicht um ein Solo-Entwicklerteam. Wenn Mitglieder des Projektteams git rebase verwenden, ist es ratsam, dass das Team über explizite Richtlinien für die Verwendung von git rebase verfügt, damit einige Cowboy-Entwickler des Teams die Geschichte des Projekts git nicht unabsichtlich beschädigen. 

3
jfmercer

Wenn es erfolgreich zusammengeführt und vielleicht sogar markiert wurde, würde ich sagen, dass es keinen Nutzen mehr hat. Sie können also git branch -d branchname sicher ausführen.

Sie können Verzweigungen in allen gängigen Web-UIs löschen, z. Nachdem Sie die Zweigstelle online gelöscht haben, können Sie die lokale Zweigstelle mit löschen

git remote Prune Origin
0
tkruse

Wenn Sie lokale Zweige bereinigen möchten, die aus Origin entfernt wurden, können Sie auch bereinigen, indem Sie git fetch verwenden.

git fetch --Prune
0