Anzeige
Anzeige
UX & Design

Versionskontrolle mit Git

Git ist das Versionskontrollsystem der Zukunft. Dieser Meinung sind zumindest zahlreiche OpenSource-Projekte wie Ruby on Rails, jQuery, TYPO3 oder der Linux-Kernel. Wie aber sieht ein Workflow aus der Praxis mit Git aus?

6 Min.
Artikel merken
Anzeige
Anzeige

Komplex. Ein Adjektiv, das oft mit dem Versionskontrollsystem Git verbunden wird. [1] Und zumindest im Vergleich mit klassischen Versionskontrollsystemen (VCS) wie Subversion hält Git tatsächlich eine steilere Lernkurve bereit. Auf die Frage, wer denn eine „komplexe“ neue Technologie lernen möchte, bleibt es – Überraschung! – meist still.

Lokale und entfernte Repositories sind in Git unabhängig und sauber voneinander getrennt.

Anzeige
Anzeige

Wenn es allerdings eine Technologie wäre, die die Qualität der Software und oft sogar die eigene Art, Software zu entwickeln, verbessert? Git ist solch ein Fall, bei dem sich ein wenig Lernaufwand durchaus lohnt. Zudem gibt es mit Desktop-Clients wie Tower [2] für Mac OS oder Tortoise Git [3] für Windows bereits sinnvolle GUI-Tools, die vieles erleichtern.

Installation und Hilfe
Wer Git noch nicht auf dem eigenen Rechner installiert haben sollte,
kann dies über die Anleitung im kostenlos verfügbaren E-Book „Pro Git“ (http://progit.org/book/) einfach und schnell nachholen. Dieser
Artikel erwähnt die Kommandos nur kurz – ausführliche Infos zu Bedeutung
und Parametern gibt es auf der Kommandozeile per „git help
<kommando>“ oder online auf gitref.org.

Repositories erstellen und klonen

Ein Repository bildet die Grundlage, um in Git arbeiten zu können. Falls für das Projekt noch keines existiert oder man frisch beginnt, kann man mittels „git init“ ein Repository im aktuellen Pfad erstellen. Existiert auf einem Server bereits ein Repository, mit dem man nun lokal arbeiten möchte, kann man dieses per „git clone“ auf den eigenen Rechner holen.

Anzeige
Anzeige

Änderungen committen

Nachdem man einige neue, gelöschte oder veränderte Dateien vor sich hat, geht es darum, diese Änderungen als Commit im Repository zu verewigen. Im ersten Schritt soll „git status“ anzeigen, welche Änderungen im Working Directory vorliegen. Um bestimmte Änderungen zum nächsten Commit hinzuzufügen, muss man diese explizit in Gits „Staging Area“ vermerken. Hierfür ist das Kommando „git add“ zuständig. In einem konkreten Szenario sieht das wie folgt aus:

Anzeige
Anzeige

Der Befehl „git status“ zeigt den aktuellen Stand des Working-Directories an.

Im Abschnitt „Changes to be committed“ listet Git alle Dateien auf, die im nächsten Commit enthalten wären. Diese musste man vorher, wie gesagt, per „git add“ der Staging-Area hinzufügen.

„Changes not staged for commit“ zählt all die Dateien auf, die seit dem letzten Commit zwar Änderungen enthalten, aber noch nicht zur Staging-Area hinzugefügt wurden. Folglich wären sie auch nicht Teil des nächsten Commit, sondern würden einfach als veränderte Dateien im Working-Directory bleiben.

Anzeige
Anzeige

Der letzte Abschnitt listet „Untracked files“ auf. Dies sind Dateien, die noch nicht in der Versionskontrolle und Git somit erst einmal unbekannt sind.

Dieses Szenario enthält eine kleine Besonderheit. Sowohl der Abschnitt der „staged Files“ als auch der Abschnitt der „unstaged Files“ führt die Datei „error.html“ auf. Einige der Änderungen in diesem File werden also im nächsten Commit enthalten sein – andere Teile bleiben als Veränderung bestehen. Dieses Git-Feature erlaubt es, enorm granulare und thematisch saubere Commits zu verfassen. Per „git commit“ speichert man den Commit im lokalen Repository.

Commit History

Sobald ein Repository einige Commits enthält, lohnt ein Blick in die Historie beziehungsweise in das „Log“ des Projekts. Mit dem Befehl „git log“ erhält man eine Übersicht der letzten Commits.

Anzeige
Anzeige

Der Befehl „git log“ zeigt für das Beispiel alle bisherigen Commits im Repository.

Der Befehl „git log“ zeigt für das Beispiel alle bisherigen Commits im Repository.

Der klassische Log-Output zeigt jeden Commit mit seinem SHA1-Hash (das Äquivalent zur Revisionsnummer in klassischen CVCS), dem Autor und Datum des Commits sowie der verwendeten Message. Wer andere Bedürfnisse hat, kann „git log“ beinahe beliebig anpassen. Der Parameter „–oneline“ beispielsweise reduziert die Anzeige auf eine Zeile pro Commit. Mit dem Zusatz „-p“ zeigt man zu jedem Commit den entsprechenden Diff/Patch an, der die konkreten Änderungen in diesem Commit aufführt.

Branching und Merging

Branching wird zurecht als eines der „Killer-Features“ von Git bezeichnet. Wer den Begriff bereits aus anderen VCS wie Subversion kennt, sollte unvoreingenommen an das Thema herangehen: Branches waren in Git von Anfang an eines der Kern-Features und sind daher extrem einfach und unkompliziert zu verwenden.

Branches erlauben, unterschiedliche Entwicklungsvarianten oder Features in einem Projekt sauber zu trennen. Ein Beispielszenario hilft, dies zu verdeutlichen: Ein Entwickler entscheidet sich, die Entwicklung eines neuen Features zu beginnen. Dazu erstellt er einen neuen Branch, ausgehend vom aktuellen Stand, um die Themen sauber zu trennen: „git branch“ erstellt den neuen Branch und „git checkout“ macht ihn zum momentan aktiven Branch.

Anzeige
Anzeige

Nachdem der Entwickler einige Dinge für das neue Feature implementiert hat, committet er diesen Stand auf diesem Branch (C2 im Schaubild). Der Entwickler hat das neue Features noch nicht fertig gestellt, als ein dringender Bugfix ihn dazu zwingt, wieder am Haupt-Entwicklungszweig (dem Live- oder Produktions-Stand) zu arbeiten. Nachdem er (per „git checkout“) zurück auf seinen master-Branch gewechselt hat, committet der Entwickler den Fix für das Problem (C3). Abermals wechselt er auf den featureX-Branch und committet erneut Änderungen (C4), um die Entwicklung am Feature abzuschließen. Mit einem „Merge“ (C5) führt er dann beide Entwicklungszweige wieder zusammen.

Branches trennen die Entwicklungsbereiche und -stadien eines Projekts.

Branches trennen die Entwicklungsbereiche und -stadien eines Projekts.

Man stelle sich dieses Szenario einmal ohne Branches vor: Spätestens beim Auftauchen des Bugfixes hätten sich Probleme ergeben. Denn das Projekt enthielt zu diesem Zeitpunkt bereits Code zu einem noch nicht fertigen, also noch nicht release-fähigen Feature.

Bei einem einzigen Feature gestaltet sich das Ganze möglicherweise nicht sonderlich tragisch – in größeren Projekten mit vielen verschiedenen parallelen Features und Entwicklungsstadien werden solche Abläufe ohne Branches allerdings schnell unübersichtlich und fehleranfällig.

Anzeige
Anzeige

Natürlich kennen auch andere VCS das Konzept der Branches. Git allerdings macht Branching so einfach, schnell und mühelos wie kein anderes VCS. Wer Branches in Git erst einmal für sich entdeckt hat, gewöhnt sich schnell daran, ein Dutzend Mal pro Tag den aktiven Branch zu wechseln oder für jeden noch so kleinen Bugfix einen neuen Branch zu erstellen. Eine bessere Übersicht und die saubere Trennung von Code zahlen sich aus.

Begriffe zum Thema Branching
Den momentan aktiven Branch bezeichnet man in Git als HEAD. Den HEAD wechselt man mit dem „git checkout“-Kommando (nicht verwandt mit dem checkout-Befehl aus SVN!). Im entsprechenden Working Directory liegen dann auch die Dateien, die zu diesem Branch (beziehungsweise zum letzten Commit dieses Branches) gehören.

Code-Sharing mit Remote-Repositories

Um den eigenen Code anderen Teamkollegen oder externen Entwicklern zugänglich zu machen, oder umgekehrt, fremden Code in sein lokales Repository zu integrieren, dienen „Remote Repositories“. Mit „git remote add“ kann man beliebig viele Remotes mit seinem lokalen Repository verknüpfen. Um lokale Commits aus seinem aktuellen Branch in ein Remote Repository zu übertragen, nutzt man den Befehl „git push“.

Wenn man hingegen Änderungen von remote in sein lokales Repository integrieren will, steht der Befehl „git fetch“ zur Verfügung. Er lädt Änderungen vom entfernten Server auf den lokalen Rechner herunter – verändert aber noch nichts an den aktuellen Dateien im Working-Directory. Man kann, wenn man die Änderungen per Fetch heruntergeladen und angesehen hat, selbst entscheiden, ob und wann man die Änderungen per „git merge“ in den aktuellen HEAD integrieren möchte. Will man das Herunterladen und Integrieren/Mergen in einem Schritt erledigen, steht „git pull“ als Shortcut zur Verfügung.

Anzeige
Anzeige

Git Status

Git hat das Potenzial, die Qualität im Software-Entwicklungsprozess zu verbessern. Schnelle Performance durch lokale Operationen, granulare Commits dank der Staging Area und ein einfach zu handhabendes Branching-Konzept sind nur ein paar der Vorteile.

Im nächsten Teil der Artikel-Serie geht es um fortgeschrittene Konzepte sowie einige Tipps und Tricks im Umgang mit Git.

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