Wann ist der richtige Zeitpunkt, um einen Git-Feature-Zweig zu löschen?

87

Ich möchte nicht, dass 82 Feature-Zweige herumhängen , also frage ich mich, was die möglichen Nachteile sind, wenn ich den Feature-Zweig einfach lösche, sobald ich ihn zum Master zusammenführe.

Arbeitsablauf:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Irgendwelche Probleme hier?

bstpierre
quelle
1
Ich würde sagen, keine Probleme, denn wenn Sie sie wirklich brauchen, können Sie den gelöschten Zweig später jederzeit wiederbeleben.
Slebetman
@slebetman Soweit ich weiß, kann ein gelöschter Zweig nicht wiederbelebt werden. Wenn der Zweig jedoch vor dem Löschen vollständig mit dem Master zusammengeführt wurde, sollte der Zweig nicht mehr benötigt werden.
Simeon
1
@Simeon Ja, das kannst du. Git löscht niemals Commits. Wenn Sie also Ihren Zweig löschen, löschen Sie nur seinen Namen. Um einen gelöschten Zweig wiederzubeleben, müssen Sie sich nur an das letzte erinnern, was Sie für diesen Zweig festgelegt haben, und Sie können danach suchen git reflog. Dann
checken Sie
@slebetman das wird nur wahr sein, wenn der Zweig schließlich zusammengeführt wurde. Wenn die Commits zurückgelassen werden, sind sie möglicherweise nicht mehr erreichbar und werden nach einer bestimmten Zeit der Speicherbereinigung unterzogen. Selbst wenn die Einträge im Reflog gelöscht werden, haben Sie standardmäßig etwa 90 Tage Zeit.
Goldenratio
@goldenratio: Irgendeine Referenz dafür?
Slebetman

Antworten:

60

Löschen nach dem Zusammenführen ist der übliche Weg. Aus diesem Grund wird git branch -d yourbranchnameüberprüft, ob der Zweig vollständig zusammengeführt ist, bevor er gelöscht wird.

Es gibt einige Gründe, die ich mir vorstellen kann, um einen Zweig zu behalten: Vielleicht möchten Sie daran festhalten, falls Fehler auftreten, sobald sie in Produktion gehen, oder Sie möchten eine historische Aufzeichnung.

In beiden Fällen haben Sie die Möglichkeit, den Kopf des Zweigs zu markieren, bevor Sie ihn löschen. Ein Tag ist insofern wie ein Zweig, als es ein Zeiger auf ein Commit ist, mit Ausnahme einiger kleinerer Unterschiede: 1) Porzellan zeigt normalerweise keine Tags in Erkundungsbefehlen wie git show-branch oder tab-auto complete in checkout an. 2) Wenn Sie eines auschecken, werden Sie in einen getrennten (nicht ref) HEAD versetzt. 3) Sie können eine " Tagging-Nachricht " hinterlassen , die bewirkt, dass das Tag wie ein Commit als Objekt im Objektspeicher gespeichert wird.

Auf diese Weise behalten Sie den Verlauf bei, und falls Sie jemals eine Fehlerbehebung benötigen, empfehle ich, nur eine neue Verzweigung des Masters für die Fehlerbehebung zu erstellen.

Maurer
quelle
1
Durch das Auschecken eines Tags wird zwar HEAD festgelegt, es wird jedoch nicht automatisch ein Zweig erstellt. Ein HEAD auf einem Commit ohne Zweig macht es losgelöst.
Binarian
1
Sie haben Recht, es setzt HEAD eher auf eine Commit-ID als auf eine Ref. Dieser Teil meines OP ist falsch. Ich sollte es aktualisieren.
Masonk
95

Ich lösche nach dem Zusammenführen, aber ich mache immer ein git merge --no-ff, um einen schnellen Vorlauf zu vermeiden, damit der Verzweigungsverlauf im Diagramm sichtbar ist. Ich möchte die Geschichte haben, wo der Feature-Zweig vom Entwicklungszweig abgewichen ist und wo er sich wieder angeschlossen hat:

Zusammenführen mit oder ohne Schnellvorlauf

Dies stammt aus einem erfolgreichen Git-Verzweigungsmodell von Vincent Driessen, einem sehr schönen Workflow für Git, den ich für die meisten meiner Projekte anwende.

lkraider
quelle
Dies ist eine weitere gute Möglichkeit, den Verlauf beizubehalten, da Sie die Commits auswählen können, die über die Funktion, jedoch nicht über den Master erreichbar sind: rev ^ 1..rev ^ 2. Der Nachteil ist, dass es jede Neubasierung vermasselt, die Sie möglicherweise von Ihrem Master-Zweig aus durchführen möchten (z. B. wenn Sie die Master-Neubasierung auf der Upstream-Fernbedienung beibehalten möchten, was sehr häufig vorkommt).
Masonk
1
Ich hatte dieses Problem nicht. Unser Team wird über Github synchronisiert, und ich muss normalerweise nicht neu aufbauen, aber ich denke nicht, dass dies hier ein Nachteil ist. Selbst wenn Sie Ihren Entwicklungs- und Feature-Zweig neu gründen, bleibt die Verzweigung im Diagramm sichtbar. Entscheidend ist, was sich im Feature-Zweig im Verhältnis zur Entwicklung befindet, und nicht das Commit, von dem Sie ursprünglich ausgegangen sind, als Sie diesen Zweig erstellt haben.
lkraider
@Ikraider, danke für die Erinnerung. Ich habe diesen Artikel gesehen, als ich zum ersten Mal Git lernte. Er macht jetzt mehr Sinn für mich. Ich stelle meine Feature-Zweige neu auf, aber ich kehre zum merge --no-ffMaster zurück, weil Sie, wie Sie sagen, den Verlauf sehen können.
Bstpierre
7

Ich kann mir zwei Gründe vorstellen, warum Sie einen Feature-Zweig für eine Weile beibehalten möchten:

  • Es besteht die Möglichkeit, dass es für weitere Arbeiten von Upstream an Sie zurückgeworfen wird.
  • Andere Entwickler möchten möglicherweise diese Funktion, ohne alles andere im Master zu wollen.

In der Praxis ist das Löschen nach dem Zusammenführen meistens in Ordnung.

Karl Bielefeldt
quelle
6

Ein typischer Workflow ist

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master
Fizer Khan
quelle
1

Ich denke, das ist der typische Workflow (Löschen nach dem Zusammenführen)

BEARBEITEN Also, anstatt zumindest für kurzlebige Zweige zusammenzuführen, denke ich, dass die Idee darin besteht, sie an den Master weiterzuleiten. Dann erhalten Sie einen linearen Änderungsverlauf, und der gesamte Zweig wird Teil des Hauptstamms. In diesem Fall haben Sie alle Änderungen dort, sodass Sie eindeutig keine Kopie benötigen.

zweite
quelle
Es macht also wirklich keinen Sinn, den Zweig zu behalten, oder?
Bstpierre
1
Ich empfehle dringend, "Rebase" zu vermeiden. Das Wiederherstellen ist im Allgemeinen schädlich und nur in einigen Fällen nützlich.
Dietrich Epp
9
Rebasing ist ein absolut vernünftiger Workflow für Ihre lokalen, privaten Niederlassungen. Es ist sehr üblich synchron mit vorgeschaltetem Arbeit zu halten , indem sie zum Beispiel Rebasing ( „Rebasing nach unten “). Es ist viel seltener und normalerweise schädlich, sich neu zu gründen *. Die Antwort von second ist nicht wirklich sinnvoll, denn egal, ob Sie Upstream-Änderungen neu erstellen oder zusammenführen, Sie müssen das Zeug immer noch irgendwie "nach oben" schieben. Selbst in Ihrer lokalen Niederlassung müssen Sie Ihre Funktion zusammenführen, um sie irgendwann zu beherrschen. Der Vorteil, wenn Sie auf Ihren Funktionen basieren, besteht darin, dass diese Zusammenführung schnell vorwärts geht.
Masonk
1
Es gibt jedoch etwas zu beachten, wenn es darum geht, Zweige neu zu gründen, was mich in letzter Zeit gebissen hat. Es ist jetzt offensichtlich, aber ich war monatelang in einem langlebigen Zweig und habe das Ganze immer gegen den Meister umgestaltet. Es endeten ungefähr 600 nette, granulare Commits, aber der Meister war wild überarbeitet und viele Male komplett verändert worden. Indem ich jedes Mal den gesamten Zweig neu gründete, trennte ich die älteren Commits von ihrer Verbindung zu Master-Commits, die für sie sinnvoll waren. Jetzt ziehe ich es vor, bei Bedarf in Master zu verschmelzen. Ich werde nur zurücksetzen, wenn die Geschichte der Niederlassung absolut nicht betroffen ist.
Gary Fixler