Anzeige
Anzeige
UX & Design

Software-Entwicklung: Tipps und Tools für die Versionskontrolle mit Git

Git ist zweifellos das Schweizer Taschenmesser unter den Programmier-Tools: robust, flexibel, schnell. Doch wie so oft in der Software-Entwicklung führen viele Wege nach Rom. Dieser letzte Teil der Git-Serie beschäftigt sich deshalb mit diversen Konzepten und Tricks, um mit Git manches schneller und vieles eleganter zu lösen.

6 Min.
Artikel merken
Anzeige
Anzeige

In den letzten beiden Ausgaben des t3n-Magazins erschienen bereits zwei Artikel zum Thema Versionsverwaltung mit Git. Im ersten Teil wurde das Konzept und die Funktionsweise hinter Git beleuchtet [1], der zweite Artikel spielte eine Produktivumgebung mit dem Werkzeug zur Versionierung durch [2].

Anzeige
Anzeige

In diesem letzten Teil nun sind die Themen kleinteiliger. So spielen etwa die systeminterne Zwischenablage und der Rückgängig-Befehl eine Rolle. Doch auch ganze Konzepte, die etwa das Merging ersetzen wollen, werden vorgestellt. Es ist sozusagen ein Aufruf, über den Tellerrand der bisherigen Git-Gewohnheiten hinauszuschauen.

Die Zwischenablage Stash

Es gibt Situationen, in denen es entweder empfehlenswert oder sogar notwendig ist, ein „sauberes“ Working Directory zu haben; es sollten also keine lokalen Änderungen vorhanden sein. Das trifft für gewöhnlich dann zu, wenn der Branch gewechselt wird. Doch nicht immer ist dieser frei von gerade gewünschten Änderungen. Nach einigen Stunden Arbeit an einer neuen Funktion etwa, wenn plötzlich ein kritischer Bugreport eintrifft. Einerseits sollte man diesen umgehend bearbeiten, natürlich auf dem Stand des Produktivsystems. Andererseits können die gerade gemachten Änderungen schlecht commitet werden, sie sind ja noch nicht fertig.

Anzeige
Anzeige

Mit dem „Stash“ lässt sich genau dieses Dilemma lösen. Alle aktuellen Änderungen werden auf diese Art in eine Zwischenablage verfrachtet und lassen das Working Directory in jungfräulichem Zustand zurück. Sobald der Bugfix erledigt ist, lässt sich der alte Zustand wiederherstellen.

Anzeige
Anzeige

Teile von Dateien stagen

Große Commits, die viele verschiedene Themen enthalten, sind für andere Entwickler sowohl schwer zu überblicken als auch – im Fall von Problemen – schwer zu debuggen. Daher sollte in der Versionskontrolle auf granulare und thematisch abgegrenzte Commits geachtet werden.

Git hilft hierbei, etwa indem es erlaubt, nur Teile einer veränderten Datei in die Staging Area zu übernehmen. Wenn „git add“ mit dem Parameter „-p“ aufgerufen wird, lässt Git den Benutzer für jeden Teil der Datei entscheiden, ob er gestaget werden soll oder nicht. So kann sehr genau bestimmt werden, welche der Änderungen im nächsten Commit enthalten sein sollen und welche erst später committet werden.

Anzeige
Anzeige

Tracking Branches

Jede Config-Datei eines Git-Repositories (.git/config) beinhaltet Blöcke wie den Folgenden:

Git speichert in solchen Abschnitten Meta-Informationen über die Beziehung zwischen zwei Branches – der lokale Branch „master“ trackt den gleichnamigen Branch „master“ auf dem Remote „origin“. Diese Meta-Information nutzen einige andere Befehle in Git, etwa push, pull oder status.

Anzeige
Anzeige

In der Regel ist es nicht nötig, sich manuell um diese „Beziehungspflege“ zu kümmern; Git richtet das Tracking automatisch ein, wenn man einen lokalen Branch auf Basis eines Remote-Branches erstellt.

Rückgängig machen

Zuerst ein verhältnismäßig einfacher Fall: Der letzte Commit enthält Tippfehler in der Nachricht, diese sollen nun korrigiert werden. Git bietet beim commit-Befehl den „–amend“-Parameter an. Dieser überschreibt quasi den letzten Commit und es sieht so aus, als ob der Fehler nie passiert wäre. Per –amend lassen sich übrigens auch committete Dateien ändern, indem weitere hinzugefügt oder entfernt werden. Allerdings gilt die ungeschriebene, aber goldene Regel: Bereits veröffentlichte Commits sollten nicht mehr verändert werden.

Anzeige
Anzeige

Für diesen Fall steht mit dem „reset“-Befehl noch eine weitere Möglichkeit zur
Verfügung. Reset bedient sich der Tatsache, dass Branches nichts anderes
als Zeiger auf einen bestimmten Commit sind. Entsprechend setzt dieser Befehl den Zeiger auf einen älteren Commit. Tatsächlich gelöscht
wird hier nichts – in der History des Projekts sieht es dann aber
ganz so (wie ja auch gewünscht) aus.

Jetzt etwas komplizierter: Ein etwas älterer Commit soll „korrigiert“ werden. Dabei hilft der „revert“-Befehl. Hierbei wird allerdings kein Commit gelöscht, ganz im Gegenteil: Ein neuer Commit wird produziert, der die Effekte des entsprechenden Commits umkehrt.

Commits selektiv integrieren

Normalerweise werden Änderungen in einen Branch integriert, indem man ihn mit einem anderen mergt. In seltenen Fällen, in denen ein Merge nicht infrage kommt, stellt „cherry-pick“ eine interessante Alternative dar. Denn anstatt wie beim Merging einen kompletten Branch integrieren zu müssen, kann hier ein beliebiger einzelner oder auch mehrere Commits eingebaut werden. Um Probleme zu vermeiden, sollte dabei allerdings jeweils mit dem ältesten Commit begonnen werden.

Anzeige
Anzeige

GUI-Anwendungen wie etwa Tower [3] erleichtern solche Arbeiten übrigens, indem sie per Drag & Drop die Commits auswählen lassen.

Rebase anstatt Merge

Die gängigste Möglichkeit, einen Branch in einen anderen zu integrieren, ist das Merging. Bei einem gewöhnlichen Three-Way-Merge nimmt Git die beiden Endpunkte der zu mergenden Branches und den gemeinsamen Parent-Commit als Basis für die Integration. Endprodukt ist ein sogenannter Merge-Commit, der die beiden Branches wie ein Knoten wieder verbindet.

Die Alternative zum Merge ist der Rebase. Durch einen Rebase entsteht, anders als beim Merge, kein separater Integrations-Commit. Auch gibt es keine „Beule“ in der History des Projekts – es sieht vielmehr so aus, als ob die History linear verlaufen sei und alle Commits auf demselben Branch stattgefunden hätten.

Anzeige
Anzeige

Die Funktionsweise von Rebase erklärt sich idealerweise an einem konkreten Beispiel:

Branch_B ist der aktuelle HEAD-Branch. Bei einem Aufruf von „git rebase branch_A“ passiert aktuell zunächst folgendes: Alle neuen Commits (C2 und C4), die nach dem letzten gemeinsamen Commit (C1) entstanden sind, werden temporär entfernt. Nun werden die neuen Commits von branch_A auf branch_B angewendet, sodass im Anschluss beide Branches auf demselben Stand (dem von branch_A) sind.

Anzeige
Anzeige

Gleich zu Beginn des Rebase-Befehls wurden die neuen Commits von branch_B temporär entfernt. Nun ist es an der Zeit, sie wieder anzuwenden – nacheinander und in ursprünglicher Reihenfolge.

Ergebnis ist, dass kein Merge-Commit entstanden und die History linear geblieben ist.

Geschichte schreiben

Eine Handvoll Befehle in Git verändern die History. Neben dem
Amending eines Commits gehört auch der Rebase zu diesen Befehlen. Es
gilt allerdings zu beachten, dass im Beispiel-Szenario die wieder
angewendeten
Commits nicht vollständig identisch sind (daher im Schaubild auch C2′
und C4′) – der Commit-Hash hat sich verändert, da mit dem Rebase die
History neu geschrieben wurde.

Bei Befehlen, die die History verändern, gilt daher immer die Regel:
Lokale Commits, die noch nicht veröffentlicht wurden, dürfen mit Rebase
oder Amend verändert werden. Wurden die Commits jedoch bereits
gepusht, sollten diese Tools nicht mehr angewendet werden.

Frühjahrsputz in Git

Im Leben eines Git-Repositories entsteht unter Umständen eine beachtliche Menge an Objekten – seien es nun Commits, Files oder File-Trees. Eine optimale Organisation dieser Objekte ist wichtig, damit Git seine gewohnt hohe Geschwindigkeit bei allen Operationen behält. Der Befehl „git gc“ (wobei „gc“ für „Garbage Collection“ steht) ist für genau diesen Zweck gedacht. Er wird zwar bei einigen Git-Kommandos automatisch im Hintegrund ausgeführt, dennoch ist ein gelegentliches „git gc“ (am Besten mit dem Parameter „–aggressive“, um das Optimum zu erreichen) kein schlechter Weg.

Helfer für die Kommandozeile

Wer viel auf der Kommandozeile arbeitet, kann sich seinen Alltag mit einigen Plugins etwas erleichtern. Dinge wie eine Tab-Autovervollständigung für die eigenen Branches oder die Anzeige des aktuell ausgecheckten Branches direkt im Prompt sind angenehme kleine Helferlein. Die entsprechenden Erweiterungen für Bash [4] und zsh [5] sind kostenfrei verfügbar.

Desktop-Clients

Eine Alternative zur Kommandozeile sind entsprechende Desktop-Clients. Viele Dinge lassen sich über ein grafisches User Interface einfacher und komfortabler erledigen. Ganz zu schweigen davon, dass man nicht jedes Kommando und jeden Parameter ständig parat haben muss. Für Windows-Nutzer ist „Tortoise Git“ [6] interessant, auf Mac OS ist „Tower“ [7] einen Blick wert.

Code-Hosting

Immer mehr Unternehmen und Freelancer entscheiden sich dafür, ihre Code-Repositories nicht mehr inhouse zu hosten. Die Bereitstellung und Pflege teurer Server-Infrastrukturen ist verständlicherweise nicht jedermanns Sache. Spezielles Know-how ist notwendig, Ressourcen werden gebunden und ein hohes Maß an Verfügbarkeit und Sicherheit muss garantiert werden.

Mittlerweile bietet eine ganze Reihe an Unternehmen an, das Code-Hosting von Git-Repositories nach dem SaaS-Prinzip zu übernehmen. Der mit Abstand größte Anbieter ist aktuell GitHub [8], gefolgt von Beanstalk [9] und Codebase [10]. Falls das externe Hosting des Codes eine Option ist, lohnt sich ein Blick auf diese Anbieter in jedem Fall.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige