Was sind einige Beispiele für häufig verwendete Praktiken zum Benennen von Git-Zweigen? [geschlossen]

1121

Ich verwende seit einigen Monaten ein lokales Git-Repository, das mit dem CVS-Repository meiner Gruppe interagiert. Ich habe eine fast neurotische Anzahl von Zweigen gemacht, von denen die meisten dankenswerterweise wieder in meinen Kofferraum übergegangen sind. Aber das Benennen wird langsam zu einem Problem. Wenn ich eine Aufgabe habe, die leicht mit einem einfachen Etikett benannt werden kann, die ich jedoch in drei Schritten erledige, die jeweils eine eigene Verzweigungs- und Zusammenführungssituation enthalten, kann ich den Zweignamen jedes Mal wiederholen, was die Geschichte jedoch etwas verwirrend macht. Wenn ich in den Namen spezifischer werde, mit einer separaten Beschreibung für jede Stufe, werden die Zweignamen lang und unhandlich.

Ich habe hier durch alte Threads gelernt, dass ich anfangen kann, Zweige mit einem / im Namen zu benennen, dh Thema / Aufgabe oder so etwas. Ich kann damit anfangen und sehen, ob es hilft, die Dinge besser zu organisieren.

Was sind einige Best Practices für die Benennung von Git-Zweigen?

Bearbeiten: Niemand hat tatsächlich Namenskonventionen vorgeschlagen. Ich lösche Zweige, wenn ich damit fertig bin. Ich habe zufällig mehrere in der Nähe, weil das Management meine Prioritäten ständig anpasst. :) Als Beispiel dafür, warum ich möglicherweise mehr als einen Zweig für eine Aufgabe benötige, nehmen wir an, ich muss den ersten diskreten Meilenstein in der Aufgabe an das CVS-Repository der Gruppe übergeben. Zu diesem Zeitpunkt würde ich aufgrund meiner unvollständigen Interaktion mit CVS dieses Commit ausführen und dann diesen Zweig beenden. (Ich habe zu viel Verrücktheit bei der Interaktion mit CVS gesehen, wenn ich zu diesem Zeitpunkt weiterhin denselben Zweig verwenden möchte.)

Skiphoppy
quelle
Ja - wahrscheinlich ist es gut, keine Zweige zu behalten oder zu schieben, die nicht nützlich sind, nachdem Sie damit fertig sind. Wenn es keinen guten Grund gibt, einen Themenzweig beizubehalten (z. B. ihn später zu konsultieren), ist das Löschen kein Problem. Git macht das Verzweigen einfach und eine Konsequenz ist, dass am Ende viele triviale Zweige herumliegen können, die ohne viel Aufhebens aufgeräumt werden können.
Eric Walker
2
Der Vollständigkeit halber gibt es einige Zeichenfolgen, die Sie nicht verwenden können .
Nick Westgate
18
Innerhalb des StackExchange-Netzwerks muss ein Platz für diese Art von Fragen vorhanden sein. Sehr verdammt nervig, wenn jemand eine gute Frage wie diese stellt und sie dann geschlossen wird, weil sie die Regeln nicht befolgt. Wenn es so weitergeht, sollte dies wahrscheinlich darauf hinweisen, dass diese Art von Fragen irgendwie unterstützt werden müssen. Nur, diese müssten wahrscheinlich innerhalb der Overflow-Site implementiert werden, da sie so eng mit Fragen vom Programmiertyp verbunden sind. Überlauf ist für mich nicht für "objektiv beantwortbare Fragen" (zu spezifisch), sondern für "Programmierfragen".
Nick Res
@Wim Wir verwenden Jira Issue Keys, kombiniert mit einem kurzen Titel, zum Beispiel:KEY-1234/allow-users-to-do-smart-stuff
RobAu

Antworten:

938

Hier sind einige von mir verwendete Namenskonventionen für Zweige und die Gründe dafür

Namenskonventionen für Zweige

  1. Verwenden Sie Gruppierungstoken (Wörter) am Anfang Ihrer Zweigstellennamen.
  2. Definieren und verwenden Sie kurze Lead-Token, um Zweige auf eine Weise zu unterscheiden, die für Ihren Workflow von Bedeutung ist.
  3. Verwenden Sie Schrägstriche, um Teile Ihrer Filialnamen zu trennen.
  4. Verwenden Sie keine bloßen Zahlen als führende Teile.
  5. Vermeiden Sie lange beschreibende Namen für langlebige Zweige.

Gruppentoken

Verwenden Sie "Gruppierungs" -Token vor Ihren Filialnamen.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

Die Gruppen können beliebig benannt werden, um Ihrem Workflow zu entsprechen. Ich verwende gerne kurze Substantive für meine. Lesen Sie weiter für mehr Klarheit.

Kurze, gut definierte Token

Wählen Sie kurze Token, damit nicht jeder Ihrer Filialnamen zu stark verrauscht wird. Ich benutze diese:

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

Mit jedem dieser Token können Sie feststellen, zu welchem ​​Teil Ihres Workflows jeder Zweig gehört.

Es hört sich so an, als hätten Sie mehrere Zweige für verschiedene Zyklen einer Änderung. Ich weiß nicht, was Ihre Zyklen sind, aber nehmen wir an, sie sind "neu", "testen" und "verifiziert". Sie können Ihre Zweige mit abgekürzten Versionen dieser Tags benennen, die immer gleich geschrieben sind, um sie zu gruppieren und Sie daran zu erinnern, in welcher Phase Sie sich befinden.

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

Sie können schnell feststellen, welche Zweige die einzelnen Phasen erreicht haben, und Sie können sie mithilfe der Git-Mustervergleichsoptionen einfach zu Gruppen zusammenfassen.

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

Verwenden Sie Schrägstriche, um Teile zu trennen

Sie können fast jedes Trennzeichen in Zweignamen verwenden, aber ich finde Schrägstriche am flexibelsten. Möglicherweise bevorzugen Sie Striche oder Punkte. Mit Schrägstrichen können Sie jedoch beim Umschalten oder Abrufen von / zu einer Fernbedienung einige Zweige umbenennen.

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

Für mich funktionieren Schrägstriche auch besser für die Tab-Erweiterung (Befehlsvervollständigung) in meiner Shell. So wie ich es konfiguriert habe, kann ich nach Zweigen mit verschiedenen Unterteilen suchen, indem ich die ersten Zeichen des Teils eingebe und die TAB-Taste drücke. Zsh gibt mir dann eine Liste von Zweigen, die dem Teil des von mir eingegebenen Tokens entsprechen. Dies funktioniert sowohl für vorangegangene als auch für eingebettete Token.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

(Zshell ist in Bezug auf die Befehlsvervollständigung sehr konfigurierbar und ich könnte es auch so konfigurieren, dass Bindestriche, Unterstriche oder Punkte auf die gleiche Weise behandelt werden. Aber ich entscheide mich dagegen.)

Außerdem können Sie in vielen Git-Befehlen wie folgt nach Zweigen suchen:

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

Vorsichtsmaßnahme: Wie Slipp in den Kommentaren hervorhebt, können Schrägstriche Probleme verursachen. Da Zweige als Pfade implementiert sind, können Sie keinen Zweig mit dem Namen "foo" und keinen anderen Zweig mit dem Namen "foo / bar" haben. Dies kann für neue Benutzer verwirrend sein.

Verwenden Sie keine bloßen Zahlen

Verwenden Sie keine bloßen Zahlen (oder Hex-Zahlen) als Teil Ihres Zweigbenennungsschemas. Innerhalb der Tab-Erweiterung eines Referenznamens kann git entscheiden, dass eine Zahl Teil eines sha-1 anstelle eines Verzweigungsnamens ist. Zum Beispiel benennt mein Issue-Tracker Fehler mit Dezimalzahlen. Ich nenne meine verwandten Zweige CRnnnnn und nicht nur nnnnn, um Verwirrung zu vermeiden.

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

Wenn ich versuchen würde, nur 15032 zu erweitern, wäre git unsicher, ob ich nach SHA-1- oder Filialnamen suchen möchte, und meine Auswahl wäre etwas eingeschränkt.

Vermeiden Sie lange beschreibende Namen

Lange Filialnamen können sehr hilfreich sein, wenn Sie sich eine Liste von Filialen ansehen. Beim Betrachten von dekorierten einzeiligen Protokollen kann dies jedoch stören, da die Zweignamen den größten Teil der einzelnen Zeile verschlingen und den sichtbaren Teil des Protokolls abkürzen können.

Auf der anderen Seite können lange Zweignamen bei "Commits zusammenführen" hilfreicher sein, wenn Sie sie nicht gewöhnlich von Hand neu schreiben. Die Standard-Merge-Commit-Nachricht lautet Merge branch 'branch-name'. Möglicherweise ist es hilfreicher, Zusammenführungsnachrichten als Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'nur anzuzeigen Merge branch 'fix/CR15032'.

Phord
quelle
156
Ein Nachteil bei der Verwendung einer Mischung aus Formularen wie bug/20574/frabnotz-finderund bug/20424ist, dass Sie, sobald Sie ohne Sub-Token beginnen, später keine mehr hinzufügen können und umgekehrt. EG: Wenn Sie einen bug/20424Zweig erstellen , können Sie bug/20424/additional-fixingspäter keinen Zweig erstellen (es sei denn, Sie löschen den bug/20424Zweig). Wenn bug/20574/frabnotz-finderes sich bereits um einen Zweig handelt, können Sie keinen bug/20574Zweig erstellen . In solchen Fällen verwende ich entweder ein Trennzeichen ohne bug/20574_frabnotz-finderSub-Token (z bug/20424/main. B. ) oder wähle einen Standardnamen für das Sub-Token (z . B. ).
Slipp D. Thompson
5
Es hat auch den Vorteil, dass einige Git-GUI-basierte Tools aufgefordert werden, das Reduzieren von Token-Unterteilungen wie eine Verzeichnislistenansicht zu ermöglichen. In dem obigen Beispiel werden Sie eine sehen featureGruppe und eine bugGruppe, erweiterbar um zu zeigen foo, barTags für die ehemaligen und eine 20574, 20592Gruppen und 20424, 21334Tags für die letztere.
Slipp D. Thompson
47
Ich werde eine Kampagne starten, um niemals Schrägstriche bei der Benennung von Git-Zweigen zu verwenden. Der Grund dafür ist, dass Sie, wenn Sie beispielsweise in einem CI beim Packen von Code auf den Zweigstellennamen verweisen möchten, beim Erstellen einer URL oder eines Pfads (z. B.), z. B. beim Erstellen, auf den Namen der Verzweigung verweisen möchten ein Uri in einem Bash-Skript; Sie werden Probleme haben, den Uri zu erstellen, da der Schrägstrich einen URL-Teil hinzufügt. Ja, es ist möglich, den Schrägstrich zu ersetzen, aber ich werde zu viel Zeit brauchen, um ihn zu klären.
Adam Spence
13
Ist es ein Problem, dass Schrägstriche in einigen Fällen eine Bedeutung für Git haben? ZB als Antwort auf git branch -aund Erhalten remotes/origin/masterusw. Wenn ich sehe, dass Git mir von einem Zweig erzählt, verwende ich keine Schrägstriche. Wenn ich also einen sehe, weiß ich, dass es sich um eine "spezielle" Referenz handelt.
Dogweather
11
Könnten Sie bitte einige Beispiele anstelle von foo und bar verwenden?
Worthy7
329

Ein erfolgreiches Git-Verzweigungsmodell von Vincent Driessen hat gute Vorschläge. Ein Bild ist unten. Wenn Ihnen dieses Verzweigungsmodell zusagt, ziehen Sie die Flusserweiterung auf git in Betracht . Andere haben über Flow kommentiert

Driessens Modell beinhaltet

  • Ein Hauptzweig, der nur zur Freigabe verwendet wird. Typischer Name master.

  • Ein "Entwicklungs" -Zweig aus diesem Zweig. Das ist diejenige, die für die meisten Hauptarbeiten verwendet wird. Allgemein benannt develop.

  • Verzweigungen mit mehreren Features aus dem Entwicklungszweig. Name basierend auf dem Namen der Funktion. Diese werden wieder zu Develop zusammengeführt, nicht zu Master- oder Release-Zweigen.

  • Release-Zweig für Kandidaten-Releases mit nur Fehlerkorrekturen und keinen neuen Funktionen. Typischer Name rc1.1.

Hotfixes sind kurzlebige Zweige für Änderungen, die vom Master stammen und ohne Beteiligung des Entwicklungszweigs in den Master übernommen werden.

Geben Sie hier die Bildbeschreibung ein

Brian Carlton
quelle
129
Abgesehen davon, dass die Frage nicht wirklich beantwortet wird, da dem Benutzer eine Reihe von Namenskonventionen überlassen bleiben , insbesondere für Feature-Zweige (sie können "alles außer Master, Entwickeln, Release- oder Hotfix- " sein
Brian
1
@Brian Womit würde eine Feature-Namenskonvention im Kontext der Probleme helfen, die das Modell löst? Ich sehe derzeit nicht wirklich, wie es wirklich hilft, weitere Unterscheidungen in Funktionen zu treffen. Vielleicht Future vs Next-Release, aber das ist verhandelbar und sollte daher nicht Teil des Namens sein. Aus Gründen der Lesbarkeit würde es möglicherweise ausreichen, sie nur mit feature- * zu versehen. Du bist ein paar Mal gewählt worden, also bin ich nur neugierig auf deinen Denkprozess ...
Nick Res
2
Obwohl diese Antwort gute Informationen enthält, befasst sie sich eher mit der Frage des Flusses als mit der Namenskonvention. Ich denke, das OP würde gerne wissen, welche tatsächlichen Wörter (Substantive gegen Verben), Trennzeichen, Groß- und Kleinschreibung usw. zu verwenden sind
Caltor
6
Das Buch Continuous Delivery (S. 36) argumentiert, dass dieses Modell der kontinuierlichen Integration irgendwie widerspricht, ... im Wesentlichen ist es nicht wirklich "agil".
Markon
Dies beantwortet die gestellte Frage nicht wirklich. Dies bietet Einblicke in die Integration eines bestimmten Git- Workflows in einen übergreifenden Entwicklungs- und Release-Zeitplan. Die OP sucht jedoch nach Ratschlägen zu den Konventionen, wie die Zweige tatsächlich genannt werden sollen.
Wheeler
56

Meine persönliche Präferenz ist es, den Filialnamen zu löschen, nachdem ich mit einem Themenzweig fertig bin.

Anstatt zu versuchen, den Zweignamen zu verwenden, um die Bedeutung des Zweigs zu erläutern, beginne ich die Betreffzeile der Festschreibungsnachricht im ersten Festschreiben für diesen Zweig mit "Verzweigung:" und füge weitere Erläuterungen in den Nachrichtentext ein, wenn der Betreff gibt mir nicht genug platz.

Der von mir verwendete Zweigname ist lediglich ein Handle, um auf einen Themenzweig zu verweisen, während ich daran arbeite. Sobald die Arbeit am Thema Zweig abgeschlossen ist, werde ich den Zweignamen entfernen und manchmal das Commit zur späteren Bezugnahme markieren.

Das macht die Ausgabe git branchauch nützlicher: Es werden nur langlebige Zweige und aktive Themenzweige aufgelistet, nicht alle Zweige jemals.

Aristoteles Pagaltzis
quelle
53

Ich habe verschiedene Schemata gemischt und aufeinander abgestimmt, die ich gesehen habe und die auf den von mir verwendeten Werkzeugen basieren.
Mein vollständiger Filialname wäre also:

Name / Feature / Issue-Tracker-Nummer / Kurzbeschreibung

was bedeuten würde:

Mike / Blogs / RSSI-12 / Logo-Fix

Die Teile werden durch Schrägstriche getrennt, da diese in SourceTree zur einfachen Organisation als Ordner interpretiert werden. Wir verwenden Jira für die Problemverfolgung, sodass die Angabe der Nummer das Nachschlagen im System erleichtert. Das Einschließen dieser Nummer macht es auch durchsuchbar, wenn versucht wird, dieses Problem in Github zu finden, wenn versucht wird, eine Pull-Anfrage zu senden.

MikeG
quelle
Ich bin derselbe, außer der Fehler- / Funktionsnummer in der Festschreibungsnachricht (für GitHub -> Pivotal Tracker-Integration).
Leo
Ich frage mich, was RSSI bedeutet.
Renshuki
@ Renshuki Es ist nur ein generischer Jira-Projektschlüssel. Welchen Issue-Tracker Sie auch verwenden, geben Sie die Ticket-ID ein
MikeG
@ MikeG danke für die Präzision!
Renshuki
3
Ich benutze das gleiche, außer dass ich die Ausgabenummer zusammen mit der Beschreibung übergebe:name/feature/issue-tracker-number-short-description
Lephleg
22

Warum sind für jede Aufgabe drei Zweige / Zusammenführungen erforderlich? Können Sie mehr darüber erklären?

Wenn Sie ein Fehlerverfolgungssystem verwenden, können Sie die Fehlernummer als Teil des Filialnamens verwenden. Dadurch bleiben die Zweignamen eindeutig, und Sie können ihnen ein oder zwei kurze und beschreibende Wörter voranstellen, damit sie für den Menschen lesbar bleiben "ResizeWindow-43523". Dies erleichtert auch die Bereinigung von Zweigen, da Sie den zugehörigen Fehler nachschlagen können. So benenne ich normalerweise meine Filialen.

Da diese Zweige schließlich wieder mit dem Master zusammengeführt werden, sollten Sie sie nach dem Zusammenführen sicher löschen. Sofern Sie nicht mit verschmelzen --squash, bleibt der gesamte Verlauf der Niederlassung bestehen, falls Sie ihn jemals benötigen sollten.

farktronix
quelle
12

Beachten Sie, dass Sie, wie im Commit e703d7 oder Commit b6c2a0d (März 2014), jetzt Teil von Git 2.0, dargestellt, eine andere Namenskonvention finden (die Sie auf Zweige anwenden können).

"Wenn Sie Leerzeichen verwenden müssen, verwenden Sie Bindestrich" ist eine seltsame Art zu sagen, dass Sie kein Leerzeichen verwenden dürfen.
Da in den Befehlszeilenbeschreibungen häufiger gestrichelte Mehrfachwörter verwendet werden, möchten Sie an diesen Stellen nicht einmal Leerzeichen verwenden.

Ein Filialname darf kein Leerzeichen enthalten (siehe " Welche Zeichen sind in einem Filialnamen unzulässig? " Und git check-ref-formatManpage ).

Für jeden Zweignamen, der durch einen Mehrwortausdruck dargestellt wird, -ist es daher eine gute Idee , ein ' ' (Bindestrich) als Trennzeichen zu verwenden.

VonC
quelle
7

Dem Vorschlag von farktronix folgend, haben wir Jira-Ticketnummern für ähnliche Mercurial-Nummern verwendet, und ich plane, sie weiterhin für Git-Filialen zu verwenden. Aber ich denke, die Ticketnummer selbst ist wahrscheinlich eindeutig genug. Während es hilfreich sein kann, ein beschreibendes Wort im Zweignamen zu haben, wie farktronix feststellte, möchten Sie wahrscheinlich weniger eingeben, wenn Sie häufig genug zwischen Zweigen wechseln. Wenn Sie dann den Filialnamen kennen müssen, suchen Sie in Jira nach den zugehörigen Schlüsselwörtern im Ticket, wenn Sie ihn nicht kennen. Außerdem sollten Sie die Ticketnummer in jeden Kommentar aufnehmen.

Wenn Ihr Zweig eine Version darstellt, scheint es üblich zu sein, das Format xxx (Beispiel: "1.0.0") für Zweignamen und vx.xx (Beispiel "v1.0.0") für Tag-Namen zu verwenden (um Konflikte zu vermeiden). . Siehe auch: Gibt es eine Standard-Namenskonvention für Git-Tags?

Gary S. Weaver
quelle
1
Gibt es ein Problem mit Konflikten? Wenn die Absicht besteht, dass ein v1.2.4Zweig schließlich zu einem Endpunkt mit einem v1.2.4Tag führt (gehe ich zu Recht davon aus, dass Sie in diesem Fall sowohl Zweige als auch Tags nach einer Version benennen) , spielt dies dann eine Rolle? Das Tag kann weiterhin unter refs/tags/v1.2.4und der Zweig unter erreicht werden refs/heads/v1.2.4, und es scheint, dass Git den Tag-Namen bevorzugt, wenn er nicht eindeutig ist (mit einer Warnung).
Slipp D. Thompson
1
Für das Versionsbeispiel, wie ich in meiner Antwort erwähnt habe, wird empfohlen, "v" für Tag-Namen und nicht für Zweige mit dem Präfix "v" zu versehen. Vermeiden Sie Mehrdeutigkeiten, wenn Sie Missverständnisse vermeiden können und weil dies später zu Problemen bei der Migration auf das nächste neueste und beste VCS führen kann.
Gary S. Weaver
2
Ich habe kürzlich mit einem Repo gearbeitet, bei dem wir jeden Versionszweig mit einem gleichnamigen Tag abgeschlossen haben. Es hat sehr gut funktioniert, da es nicht wenig bis gar keine Mehrdeutigkeit gibt (das Tag zeigt in den meisten Fällen auf das letzte Commit auf dem entsprechenden Zweig), und wenn es das gibt, macht Git „das Richtige“ (mit einer Warnung). Ich bevorzuge es, weil Git, wenn jemand einen Fehler mit Knochen macht und sich weiter auf einen abgedeckten Zweig einlässt, weiterhin das Tag auswählt, was die Absicht ist. Mehrdeutigkeit kann die Dinge einfacher machen, wenn das System alles unter Kontrolle hat und die Absicht klar ist.
Slipp D. Thompson