Das solltest du dir ansehen git-flow . Es ist ein ausgezeichnetes (und beliebtes) Verzweigungsmodell.
Git Flow Zusammenfassung
Verzweigung
Die Hauptstämme, die für immer bleiben, sind develop
und master
. master
hält Ihre neueste Version unddevelop
Ihre neueste "stabile" Entwicklungskopie.
Mitwirkende erstellen feature
Zweige (mit dem Präfix " feature/
Konvention") aus develop
:
$ git checkout -b feature/my-feature develop
und hotfix
Zweige (mit dem Präfix " hotfix/
Konvention") von master
:
# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master
# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>
Diese Zweige sind "Einwegzweige", was bedeutet, dass sie eine kurze Lebensdauer haben, bevor sie wieder zu den Hauptstämmen zusammengeführt werden. Sie sollen kleine Teile der Funktionalität einkapseln.
Zweige fertigstellen
Wenn ein Beitragender mit einer feature
Verzweigung fertig ist , fügt er sie wieder zusammen in develop
:
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
Wenn sie mit einem hotfix
Zweig fertig sind , führen sie ihn wieder in beiden zusammen, master
und develop
der Hotfix macht weiter:
$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number
Dies ist der kontinuierliche Integrationsaspekt.
Releases
Wenn Sie bereit sind, ein Release zu packen, erstellen Sie eine release
Verzweigung aus Ihrer "stabilen" develop
Verzweigung (genau wie beim Erstellenfeature
Zweigen). Anschließend stoßen Sie die Versionsnummer in ein Tag (siehe unten).
Durch die Verwendung separater release
Zweige können Sie weiterhin neue Funktionen entwickeln, develop
während Sie Fehler beheben und dem release
Zweig den letzten Schliff verleihen .
Wenn Sie bereit sind, die Veröffentlichung abzuschließen, führen Sie den release
Zweig in beiden master
und develop
(genau wie in einem hotfix
) zusammen, sodass alle Ihre Änderungen übernommen werden.
Tagging
Wenn Sie eine release
Verzweigung oder eine hotfix
Verzweigung erstellen , stoßen Sie die Versionsnummer in einem Tag entsprechend an. Bei Vanilleschoten sieht das so aus:
$ git tag -a <tag-name> -m <tag-description>
Anschließend müssen Sie die Tags (separat) in Ihr Remote-Repository übertragen:
$ git push --tags
In der Regel ist es am besten, die semantische Versionierung zu verwenden, in der Ihre Versionen die Form haben major.minor.hotfix
. Major-Bumps sind nicht abwärtskompatibel, während Minor- und Hotfix-Bumps nicht abwärtskompatibel sind (es sei denn, Sie befinden sich in der Beta-Phase 0.x.x
).
Zusammenführen
Wie Sie oben gesehen haben, fordert git-flow Sie auf, Zweige mit dem folgenden Befehl zusammenzuführen:
$ git merge --no-ff <branch-name>
Mit dieser --no-ff
Option können Sie den gesamten Filialverlauf verwalten, ohne dass eine Reihe von Filialen im aktuellen Commit des Repositorys herumliegen (keine Sorge, Sie haben nicht für jede Version eine Filiale).
Sie werden auch angeregt, mit zu ziehen
$ git pull --rebase
Sie fügen also nicht viele unnötige Merge-Commits hinzu.
Sie können git so konfigurieren, dass beide Aufgaben standardmäßig in Ihrem ausgeführt werden .gitconfig
. Ich lasse dich das allerdings nachschlagen;)
Browsing-Versionen
Wenn jemand nach einer bestimmten Version Ihrer Codebasis sucht, kann er das Tag nach Namen auschecken:
# checkout in detached HEAD to browse
$ git checkout <tag-name>
# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>
Wenn jemand auf Github browst, gibt es auch eine Registerkarte "Tags" in der Dropdown-Liste "Zweige".
Verwenden der Git-Flow-Erweiterung (empfohlen)
Ich benutze dieses Modell am liebsten mit der Git-Flow-Erweiterung für Git.
( Edit: Louis hat die AVH-Gabel empfohlen, die besser funktioniert git describe
und jetzt möglicherweise aktiver ist. Danke Louis.)
Die Erweiterung automatisiert alle chaotischen Teile (wie das Verwenden merge --no-ff
und Löschen von Zweigen nach dem Zusammenführen), damit Sie mit Ihrem Leben weitermachen können.
Mit der Erweiterung können Sie beispielsweise einen Funktionszweig wie folgt erstellen:
$ git flow feature start my-feature-name
und beende es so
$ git flow feature finish my-feature-name
Die Befehle für Hotfixes und Releases sind ähnlich, verwenden jedoch die Versionsnummer anstelle eines Verzweigungsnamens wie folgt:
# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14
# Create the next release
$ git flow release start 2.5.0
Git Flow erstellt dann das Versions-Tag für Sie und erinnert Sie freundlich daran, die Version in Konfigurations- oder Manifest-Dateien anzuheben (was Sie mit einem Task-Manager wie grunt tun können).
Hoffe, das hilft :) Ich bin mir nicht sicher, wie Sie alles in Ihr Travis CI-Setup integrieren würden, aber ich vermute, dass Githooks Sie dahin bringen werden.