Wie verwende ich Github, Branches und automatische Releases für das Versionsmanagement? [geschlossen]

24

Ich verstehe die meisten grundlegenden Git / Github-Konzepte, habe jedoch immer noch Probleme, das Gesamtbild zu verstehen.

Folgendes habe ich bisher geschafft:

  • Push-Commits
  • Arbeite mit Ästen
  • Integrieren Sie Github in Travis CI, ein kontinuierliches Integrationssystem
  • Bauen Sie über Travis CI automatisch auf jedem Commit zum Master auf und stellen Sie die Veröffentlichung als ZIP auf Github unter Veröffentlichungen.

Allerdings habe ich bisher nur an Alpha / Beta-Versionen von Projekten gearbeitet, sodass ich noch nie versionierte Versionen in der Praxis gesehen habe.

Daher möchte ich mehr über die Versionierung, die Pflege separater Versionen, das Hotfixing der Versionen usw. erfahren.

Wie würde ich sicherstellen, dass die folgenden Dinge passieren:

  • Habe verschiedene Versionen meines Projekts, zum Beispiel Version 1.1.0 und 2.0.0
  • Möglichkeit, Hotfixes auf die Versionen zu pushen, die Version auf 1.1.1 oder 2.0.1 zu heben usw.
  • Erstellen Sie diese Version automatisch beim Festschreiben in einem kontinuierlichen Integrationssystem. Wenn dies erfolgreich ist, veröffentlichen Sie eine Version für diese bestimmte Version.

Ich bezweifle zwischen folgenden Optionen:

  • Muss ich für jede Version Tags verwenden? Wenn ja, wie kann ein Continuous Integration System Releases automatisch erstellen?
  • Soll ich für jede Version einen Branch anlegen? Wenn ja, würde das nicht eine ganze Tonne von Zweigen erzeugen (wie ein 1.1- und ein 2.0-Zweig, gehen Hotfixes natürlich auf diesen Zweig)
  • Wie würde ich die Versionsnummer angeben? Ist es in Ordnung, eine Konfigurationsdatei zu haben, die die Versionsnummer angibt, oder gibt es intelligentere Möglichkeiten? In diesem Fall wäre es ein Java-Projekt, wenn es darauf ankommt.
Skiwi
quelle
3
Im Moment ist dies eine ziemlich weit gefasste Frage in Bezug auf Git. Es gibt eine Reihe von Fragen zu diesem Thema, die Sie möglicherweise durchsuchen möchten. Lesen Sie einige davon und schränken Sie diese ein oder teilen Sie sie auf, damit sie beantwortet werden können, ohne ein Buch zu schreiben.
Ampt
Scoped den Titel ein wenig, um den Inhalt zu reflektieren.
Michael Durrant
1
Ich werde darauf hinweisen, dass, wenn ich so viele und mehr (mir ging der Raum aus) mögliche Duplikate für einzelne Fragen in dieser Frage finden kann, die Gesamtfrage meiner Meinung nach etwas zu weit gefasst ist.
„Ihre Fragen sollten vernünftigerweise scoped werden ...“ ( Hilfe ). Siehe meta.programmers.stackexchange.com/questions/6483/…
gnat

Antworten:

42

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 developund master. masterhält Ihre neueste Version unddevelop Ihre neueste "stabile" Entwicklungskopie.

Mitwirkende erstellen featureZweige (mit dem Präfix " feature/Konvention") aus develop :

$ git checkout -b feature/my-feature develop

und hotfixZweige (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 featureVerzweigung 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 hotfixZweig fertig sind , führen sie ihn wieder in beiden zusammen, masterund developder 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 releaseVerzweigung aus Ihrer "stabilen" developVerzweigung (genau wie beim Erstellenfeature Zweigen). Anschließend stoßen Sie die Versionsnummer in ein Tag (siehe unten).

Durch die Verwendung separater releaseZweige können Sie weiterhin neue Funktionen entwickeln, developwährend Sie Fehler beheben und dem releaseZweig den letzten Schliff verleihen .

Wenn Sie bereit sind, die Veröffentlichung abzuschließen, führen Sie den releaseZweig in beiden masterund develop(genau wie in einem hotfix) zusammen, sodass alle Ihre Änderungen übernommen werden.

Tagging

Wenn Sie eine releaseVerzweigung oder eine hotfixVerzweigung 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-ffOption 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 describeund jetzt möglicherweise aktiver ist. Danke Louis.)

Die Erweiterung automatisiert alle chaotischen Teile (wie das Verwenden merge --no-ffund 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.

mxdubois
quelle
Verwenden Sie beim Starten eines Release-Zweigs dieselbe Literalzeichenfolge "release" wie der Name des Zweigs für jedes Release oder eine bestimmte Version wie "v0.3.0"? Diese Anweisungen sind exzellent und ich werde versuchen, ihnen auf den Buchstaben zu folgen, aber ich möchte diesen Aspekt nicht durcheinander bringen.
Paul
1
Mit dem Befehl git flow plugin geben Sie die Versionskennung wie v0.3.0in for ein <release> git flow release start <release> [<base>]. Unter der Haube wird ein Zweigname erstellt, der die Version enthält, wie z release/v0.3.0.
mxdubois
3

Muss ich für jede Version ein Tag verwenden?

Nein, Sie nicht brauchen Tags überhaupt zu benutzen. Wenn Sie jedes Release markieren möchten, ist das in Ordnung, oder wenn Sie jedes Mal markieren möchten, wenn Ihr CI-System erstellt wird, können Sie dies auch tun. Tags geben dem Commit im Wesentlichen nur einen benutzerfreundlichen Namen, damit Sie es einfach aufrufen und später anzeigen können.

Soll ich für jede Version einen Branch anlegen?

Sicher! Das Verzweigen ist in Git billig / kostenlos, also nutze ich es bei jeder Gelegenheit. Sie können auch Zweige ziemlich schnell zusammenführen und löschen. Wenn Sie das Gefühl haben, zu viele Zweige zu haben, können Sie diese später durch selektives Zusammenführen immer wieder reduzieren. Es gibt auch eine ganze Reihe von Git-Verzweigungsschemata, wenn Sie ein bewährtes Schema verwenden möchten.

Wie würde ich die Versionsnummer angeben?

Tags sind normalerweise die Art und Weise, wie Sie die Versionsnummer angeben, da sie sich auf git beziehen. Wenn Sie darüber sprechen, wie Sie ein Projekt versionieren oder wie Sie dies am besten tun, müssen Sie ein wenig graben, da dies eine ziemlich meinungsbasierte Frage ist. Einige Projekte bleiben für immer in der Beta-Version, andere erhöhen die Anzahl der Versionen, als würden sie aus der Mode kommen.

Ampt
quelle
3

Muss ich für jede Version Tags verwenden?

Wenn Sie unter "Version" eine Reihe von Dateien verstehen, aus denen sich ein Release oder ein Release-Kandidat zusammensetzt, empfehle ich nachdrücklich, jede Version mit einem Tag zu versehen. Wenn Sie später auf Version 1.2.7 zurückgreifen müssen, möchten Sie nach dem Hash eines Commits suchen oder einfach die Versionsnummer verwenden?

Auch wenn Sie git describeBuild-Informationen irgendwo aufzeichnen (wie ich), können Sie mit Tags viel bessere Ergebnisse erzielen.

Wenn ja, wie kann ein Continuous Integration System Releases automatisch erstellen?

Ein kontinuierliches Integrationssystem kann Releases erstellen, unabhängig davon, wie Sie Tags verwenden. Sie könnten ihm sagen, dass er ein Release auf der Grundlage des Hashs eines Commits erstellen soll. Tags erleichtern Ihnen das Leben.

Soll ich für jede Version einen Branch anlegen? Wenn ja, würde das nicht eine ganze Tonne von Zweigen erzeugen (wie ein 1.1- und ein 2.0-Zweig, gehen Hotfixes natürlich auf diesen Zweig)

Ich sehe das Verzweigen nicht als "Pro-Version". Ich habe ein paar Projekte, bei denen meine Versionen alle Commits in der masterBranche sind. Ich habe nichts mehr als diese kompliziert brauchen jetzt , da weder Projekt an der stabilen Phase ist , und es gibt keine Notwendigkeit, ältere Versionen langfristig zu unterstützen. Aber nehmen wir an, ich gebe 1.0, 1.1, 1.2 und dann 2.0 heraus und ich muss die 1.0-Serie noch mit Sicherheitskorrekturen usw. unterstützen. Dann hätte ich auf jeden Fall einen Zweig, um die Wartungsversionen für die 1.x-Serie zu installieren .

Wie würde ich die Versionsnummer angeben? Ist es in Ordnung, eine Konfigurationsdatei zu haben, die die Versionsnummer angibt, oder gibt es intelligentere Möglichkeiten? In diesem Fall wäre es ein Java-Projekt, wenn es darauf ankommt.

Eine einzige Quelle für Ihre Versionsnummer, wie z. B. eine Konfigurationsdatei, ist der beste Weg, um Fettfinger-Fehler zu vermeiden, die andernfalls auftreten könnten, wenn Sie Nummern an mehreren Stellen aktualisieren müssen. Ich spreche von ... hmm ... peinlichen Erfahrungen. Sie geben 1.3 nur frei, um festzustellen, dass die Software weiterhin meldet, dass es sich um Version 1.2 handelt. Hoppla!

In einer anderen Antwort hat Ihnen mxdubois gitflow empfohlen. Wenn Sie sich für gitflow entscheiden, würde ich die Verwendung der AVH-Edition empfehlen . Die Originalversion wird nicht mehr aktiv gepflegt. Ein bemerkenswerter Unterschied ist, dass die AVH-Edition Release-Zusammenführungen durchführt, die git describeintelligentes Arbeiten ermöglichen. Die ursprüngliche Version führt die Zusammenführung auf eine Weise durch, die auslöstgit describe .

Louis
quelle
0

Scannen Sie Ihre Liste Ich sehe Version als Ihren Fokus, so ...

Eine Möglichkeit zum Verwalten von Versionen besteht im Verzweigen und Zusammenführen (oder erneutem Basieren).

Also hast du:

master

dann erstellen Sie einen Zweig

v1

dann fügen Sie weitere Änderungen hinzu

master(diff1)

dann erstellen Sie einen Zweig

v3

dann fügen Sie weitere Änderungen hinzu

master(diff2)

Jetzt:

Um Version 2 zu aktualisieren, müssen Sie dies jetzt tun

git checkout v2
git merge master  # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.

So aktualisieren Sie Version 3

git checkout v3
git merge master

Das Obige gilt für Großhandelsupdates.

Wahrscheinlich ist es jedoch wahrscheinlicher, dass Sie bestimmte Änderungen dafür auswählen möchten, dass es gibt

git cherry-pick

Mehr zum Thema Kirschenpflücken unter http://git-scm.com/docs/git-cherry-pick

Michael Durrant
quelle