Erstens, wie @AndrewFinnell und @KenLiu hervorheben, bedeuten die Verzeichnisnamen in SVN selbst nichts - "Trunk, Zweige und Tags" sind einfach eine übliche Konvention, die von den meisten Repositorys verwendet wird. Nicht alle Projekte verwenden alle Verzeichnisse (es ist vernünftigerweise üblich, überhaupt keine "Tags" zu verwenden), und nichts hindert Sie daran, sie so zu nennen, wie Sie möchten, obwohl ein Verstoß gegen die Konvention oft verwirrend ist.
Ich werde das wahrscheinlich häufigste Verwendungsszenario für Zweige und Tags beschreiben und ein Beispielszenario für deren Verwendung geben.
Kofferraum : Das Hauptentwicklungsgebiet. Hier lebt Ihre nächste Hauptversion des Codes und verfügt im Allgemeinen über die neuesten Funktionen.
Zweige : Jedes Mal, wenn Sie eine Hauptversion veröffentlichen, wird ein Zweig erstellt. Auf diese Weise können Sie Fehlerbehebungen vornehmen und eine neue Version erstellen, ohne die neuesten - möglicherweise unvollendeten oder nicht getesteten - Funktionen veröffentlichen zu müssen.
Tags : Jedes Mal, wenn Sie eine Version veröffentlichen (endgültige Version, Release Candidates (RC) und Betas), erstellen Sie ein Tag dafür. Auf diese Weise erhalten Sie eine zeitpunktbezogene Kopie des Codes in diesem Zustand, sodass Sie zurückgehen und bei Bedarf Fehler in einer früheren Version reproduzieren oder eine frühere Version genau so neu veröffentlichen können, wie sie war. Verzweigungen und Tags in SVN sind leichtgewichtig - auf dem Server wird keine vollständige Kopie der Dateien erstellt, sondern nur eine Markierung mit der Aufschrift "Diese Dateien wurden bei dieser Revision kopiert", die nur wenige Bytes belegt. In diesem Sinne sollten Sie sich niemals Gedanken darüber machen, ein Tag für einen freigegebenen Code zu erstellen. Wie ich bereits sagte, werden Tags häufig weggelassen. Stattdessen wird in einem Änderungsprotokoll oder einem anderen Dokument die Versionsnummer bei der Veröffentlichung klargestellt.
Angenommen, Sie starten ein neues Projekt. Sie beginnen in "Trunk" zu arbeiten, was irgendwann als Version 1.0 veröffentlicht wird.
- Trunk / - Entwicklungsversion, bald 1.0
- Zweige / - leer
Sobald 1.0.0 fertig ist, verzweigen Sie Trunk in einen neuen "1.0" -Zweig und erstellen ein "1.0.0" -Tag. Nun wird weiter daran gearbeitet, was irgendwann 1.1 im Kofferraum sein wird.
- Trunk / - Entwicklungsversion, bald 1.1
- branchs / 1.0 - 1.0.0 Release-Version
- tags / 1.0.0 - 1.0.0 Release-Version
Sie stoßen auf einige Fehler im Code, beheben diese im Trunk und führen die Korrekturen dann in den 1.0-Zweig ein. Sie können auch das Gegenteil tun und die Fehler in der 1.0-Verzweigung beheben und sie dann wieder in den Trunk zusammenführen. In der Regel bleiben Projekte jedoch in einer Richtung zusammengeführt, um die Wahrscheinlichkeit zu verringern, dass etwas fehlt. Manchmal kann ein Fehler nur in 1.0 behoben werden, da er in 1.1 veraltet ist. Es spielt keine Rolle: Sie möchten nur sicherstellen, dass Sie 1.1 nicht mit denselben Fehlern veröffentlichen, die in 1.0 behoben wurden.
- Trunk / - Entwicklungsversion, bald 1.1
- branches / 1.0 - kommende Version 1.0.1
- tags / 1.0.0 - 1.0.0 Release-Version
Sobald Sie genügend Fehler (oder möglicherweise einen kritischen Fehler) gefunden haben, entscheiden Sie sich für eine Version 1.0.1. Sie erstellen also ein Tag "1.0.1" aus dem 1.0-Zweig und geben den Code frei. Zu diesem Zeitpunkt enthält der Trunk 1.1 und der Zweig "1.0" den Code 1.0.1. Wenn Sie das nächste Mal ein Update auf 1.0 veröffentlichen, ist es 1.0.2.
- Trunk / - Entwicklungsversion, bald 1.1
- branches / 1.0 - kommende Version 1.0.2
- tags / 1.0.0 - 1.0.0 Release-Version
- tags / 1.0.1 - 1.0.1 Release-Version
Schließlich sind Sie fast bereit, Version 1.1 zu veröffentlichen, möchten aber zuerst eine Beta durchführen. In diesem Fall führen Sie wahrscheinlich einen "1.1" -Zweig und ein "1.1beta1" -Tag durch. Nun wird die Arbeit an 1.2 (oder vielleicht 2.0) im Trunk fortgesetzt, aber die Arbeit an 1.1 wird im Zweig "1.1" fortgesetzt.
- Trunk / - Entwicklungsversion, bald 1.2
- branches / 1.0 - kommende Version 1.0.2
- branches / 1.1 - kommende Version 1.1.0
- tags / 1.0.0 - 1.0.0 Release-Version
- tags / 1.0.1 - 1.0.1 Release-Version
- tags / 1.1beta1 - 1.1 Beta 1 Release-Version
Sobald Sie 1.1 final veröffentlicht haben, erstellen Sie ein "1.1" -Tag aus dem "1.1" -Zweig.
Sie können 1.0 auch weiterhin beibehalten, wenn Sie möchten, und Fehlerbehebungen zwischen allen drei Zweigen (1.0, 1.1 und Trunk) portieren. Der wichtige Aspekt ist, dass Sie für jede Hauptversion der Software, die Sie warten, einen Zweig haben, der die neueste Codeversion für diese Version enthält.
Eine andere Verwendung von Zweigen ist für Funktionen. Hier verzweigen Sie Trunk (oder einen Ihrer Release-Zweige) und arbeiten isoliert an einer neuen Funktion. Sobald die Funktion abgeschlossen ist, führen Sie sie wieder zusammen und entfernen den Zweig.
- Trunk / - Entwicklungsversion, bald 1.2
- branches / 1.1 - kommende Version 1.1.0
- branches / ui-rewrite - experimenteller Feature-Zweig
Die Idee dabei ist, wenn Sie an etwas Störendem arbeiten (das andere Menschen daran hindern oder behindern würde, ihre Arbeit zu erledigen), etwas Experimentelles (das es möglicherweise nicht einmal schafft) oder möglicherweise nur etwas, das lange dauert (und Sie haben Angst, wenn es eine Version 1.2 aufhält, wenn Sie bereit sind, 1.2 vom Trunk zu verzweigen), können Sie dies isoliert in der Verzweigung tun. Im Allgemeinen halten Sie es mit dem Trunk auf dem neuesten Stand, indem Sie die Änderungen ständig zusammenführen. Dies erleichtert die Wiedereingliederung (Zusammenführen mit dem Trunk), wenn Sie fertig sind.
Beachten Sie auch, dass das hier verwendete Versionsschema nur eines von vielen ist. Einige Teams führen Fehlerbehebungs- / Wartungsversionen als 1.1, 1.2 usw. und größere Änderungen als 1.x, 2.x usw. durch. Die Verwendung hier ist dieselbe, aber Sie können den Zweig "1" oder "1" nennen .x "anstelle von" 1.0 "oder" 1.0.x ". (Abgesehen davon ist die semantische Versionierung eine gute Anleitung zum Erstellen von Versionsnummern).