Zum Inhalt

Feature Branches

Die Grundidee hinter dem Arbeiten mit Feature Branches ist, dass die Entwicklung von Features in einem eigens dafür erstellten Branch und nicht im Hauptbranch (Master) stattfinden sollte. Diese Einkapselung verhindert, dass durch die Arbeiten an einem bestimmten Feature das System nicht auslieferungsfähig ist. Vorm Ausliefern in Test- oder Kundensysteme kann bestimmt werden, welche Features auszuliefern sind und welche nicht.

Wie grundsätzlich mit verschiedenen Branches in einem Repository zu arbeiten ist, gibt es hier.

Feature Branches mit GIT und VS Code

Da für jedes Feature ein eigener Branch erzeugt wird, existieren in einem Repository viele Branches zur selben Zeit. Der dadurch sehr komplex werdende Commit Verlauf kann es schwierig machen, zu bestimmen, zu welchem Feature einzelne Commits und Merge Commits gehören.

Um die Git Historie einfach und übersichtlich zu halten, sind folgende Einstellungen und Abläufe zu berücksichtigen.

Grundvoraussetzungen

  • Es muss mindestens die Git Version 1.7.9 installiert sein. Über git --version kann die aktuell installierte Version beauskunftet werden.
  • Beim Abrufen ist nur git Pull Rebase zu nutzen. Über git config --global pull.rebase true wird global eingestellt, dass bei jedem Pull im Hintergrund Pull Rebase ausgeführt wird. Beim "normalen" Entwickeln und Abrufen kann genaus gearbeitet werden wie bisher.

Feature Branch erzeugen

Vor der Erzeugung des Feature Branch sollte der Hauptbranch auf dem aktuellen Stand sein.

Git Graph: NewFeatureBranch

Terminal: git branch FEATUREBRANCHNAME ->Feature Branch lokal erstellen

git checkout FEATUREBRANCHNAME -> Branch wechseln

Durch die Ausführung dieses Befehls wird lokal ein neuer Branch angelegt. Als FEATUREBRANCHNAME ist z. B. die Ticketnummer zu verwenden. Erst wenn eine Änderung auf dem Feature Branch gepushed wird, existiert der Branch auch auf dem Server und ist über Azure DevOps einsehbar.

Das Feature kann nun innerhalb des neuen Branches mit beliebig vielen Commits entwickelt werden. Den einzelnen Commits ist eine sprechende Commit Message zu geben. Es sollte erkennbar sein, dass die Commits zu dem Feature Branch gehören. Da der Feature Branch nach Abschluss des Features wieder gelöscht wird, sollte die Ticketzuordnung erst beim Merge in den Hauptbranch erfolgen.

Zur Sicherung des Codes sollten die Commits regelmäßig auf den Server gepused werden.

Commits im Feature Branch zusammenfassen

Es ist zu empfehlen, die Commits innerhalb des Feature Branches regelmäßig zu einem Commit zusammenzufassen. Dadurch wird der Merge am Ende einfacher und die Versionshistorie übersichtlicher. Außerdem kann es praktisch sein, wenn zu einem Feature lediglich ein oder zwei Commits gehören. Das Zusammenfassen von Commits darf nur in Feature Branches erfolgen.

Git Graph: CommitsZusammenfuehren

Terminal: git merge-base FEATUREBRANCHNAME HAUPTBRANCHNAME -> Ermittelt die Commit ID des letzten Commits, der auch im Hauptbranch

git rebase -i (git merge-base FEATUREBRANCHNAME HAUPTBRANCHNAME) -> Gibt eine Liste aller Commits aus, die nur zum Feature gehören

Wenn die VS Code Extension GitLens installiert ist, öffnet dieser Befehl folgende Übersicht. ohne|miniatur|605x605px Dort sollte der unterste Commit auf reword gestellt werden. Alle anderen Commits aus dem Feature Branch müssen auf fixup stehen. Diese Befehle sagen aus, dass die beiden Commits zu einem zusammengeführt werden sollen und eine neue Commit Message vergeben wird. Folgende Datei öffnet sich, in der eine neue Commit Message in die ersten Zeile einzutragen ist. Wenn nun die Datei gespeichert und geschlossen wird, sind die Commits zusammengeführt. ohne|miniatur|451x451px

Feature Branch mit Hauptbranch aktualisieren

Gerade bei größeren Features, die über eine längere Zeit entwickelt werden, ist es sinnvoll hin und wieder den Feature Branch mit dem Stand des Hauptbranches zu aktualisieren. Spätestens ist dieser Schritt aber vor dem zurückmergen in den Hauptbranch notwendig.

Innerhalb dieses Schritts können die Commits, die man während der Feature Entwicklung gemacht hat, zu einem Commit zusammengefasst werden. Nach dem Zusammenführen von Feature Branch und Hauptbranch gehört dann lediglich ein Commit zu dem Feature.

Git Graph: FeatureAktualisierenNEU

Terminal: git checkout DEV-> Wechsel in den DEV Branch

git pull -> Aktuellen Stand abrufen

git checkout FEATUREBRANCHNAME -> Wechsel in den Feature Branch

git rebase DEV -> Featurecommits werden auf Basis des aktuellen DEVs neu erstellt

git push origin FEATUREBRANCHNAME --force -> Abgeänderte Commits zum Server hochladen

Hauptbranch und Feature Branch zusammenführen

Wenn das Feature komplett fertig entwickelt ist, muss der Feature Branch in den Hauptbranch zurückgeführt werden.

Voraussetzung dafür ist, dass der Feature Branch alle aktuellen Änderungen aus dem Hauptbranch enthält. Probleme, wie doppelt vergebene Objektnummern, sind im Feature Branch zu lösen. Der Hauptbranch soll nämlich zu jedem Zeitpunkt release- oder auslieferungsfähig sein.

Deshalb muss vor dem Zurückführen der Feature Branch auf den aktuellen Stand gebracht werden. (siehe Feature Branch aktualisieren)

Nachdem der Feature Branch aktualisiert wurde, muss die App neu kompiliert und getestet werden. Damit ist sicherzustellen, dass keine Änderung aus dem Hauptbranch das neue Feature beeinträchtigt.

Folgende Befehle führen den Feature Branch und den Hauptbranch zusammen und löschen den Feature Branch.

**Git Graph: FeatureBranchInDEV

Terminal: git checkout DEV -> Wechsel in den DEV Branch

git rebase FEATUREBRANCHNAME -> Stand mit rebase in den DEV Branch bringen

git push -> Änderungen hochladen

Konflikt beim Rebase

Nachdem git rebase Befehl kann es passieren, dass Merge Konflikte auftreten. Nachdem die Konflikte behoben sind, müssen die betroffenen Dateien gestaged werden. Wenn alle Dateien gestaged sind, wird der Merge Prozess mit folgendem Befehl abgeschlossen.

git rebase --continue

Die sich danach öffnende COMMIT_EDITMSG Datei kann ohne Anpassungen geschlossen werden. Ggf. kann es nach dem git rebase --continue zu weiteren Merge Konflikten kommen, die genauso zu behandeln sind.

Rebase und Merge

Was unterscheidet Rebase und Merge?

Die Befehle merge und rebase werden genutzt, um Änderungen aus zwei Branches zusammenzuführen.

Der wichtigste Unterschied zwischen den Befehlen ist, dass beim Rebase die Commits aus meinem Feature Branch intern neu generiert werden. Die alten Commits aus dem Feature Branch werden tatsächlich gelöscht und neu erstellt. In der Git Commit Historie erkennen wir das dadurch, dass die Commits aus dem Feature Branch eine neue Commit ID bekommen haben.

Bei Ausführung des Merge Befehls werden keine bestehenden Commits abgeändert, sondern es wird ein neuer Commit erzeugt. In diesem Commit sind dann die Änderungen aus dem Basisbranch enthalten.

Mehr zum Thema merge und rebase findet man hier 5.

Wann nutze ich grundsätzlich merge und wann rebase?

Rebase ist nur in Verbindung mit Feature Branches zu nutzen. Also dann, wenn Commits von einem Feature Branch in den DEV gebracht werden sollen oder der Feature Branch aktualisiert werden soll.

Sobald ich Commits aus einem dauerhaft bestehenden Branch in einen anderen dauerhaft bestehenden Branch bringen möchte, ist merge zu verwenden.

Der Grund dafür ist, dass die bestehenden Commits beim Rebase abgeändert werden. Commits mit Ticketzuordnung werden beim Abändern der Commits dem Ticket erneut zugewiesen.

Dadurch wären dann mehrere inhaltlich gleiche Commits einem Ticket zugeordnet.

Außerdem müssen die abgeänderten Commits mit Force Push in den Server Branch gebracht werden. Da mit Force Push Commits dauerhaft gelöscht werden können, sollte dieser Befehl auf dauerhaft bestehende Commits nicht angewendet werden dürfen.

Pull requests

Pull Request werden verwendet um Code von einem Branch in einen anderen zu übernehmen. Dazu kann innerhalb Azure DevOps eine Pull Request erstellt werden, in dem der zu übernehmende Branch ausgewählt wird. Nach eingehender Prüfung, wahlweise durch Dritte, wird dieser in den Ziel-Branch zusammengeführt.

2020-10-13_11_19_05-Pull_requests_-_Repos.png