Git

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Git

Logo
Basisdaten

Entwickler Junio C. Hamano, Shawn O. Pearce, Linus Torvalds u. v. a.
Erscheinungsjahr 2005
Aktuelle Version 2.19.0[1]
(10. September 2018)
Betriebssystem Linux, FreeBSD, macOS, Solaris u. a. unixoide; Windows; Haiku; …
Programmiersprache C[2], Unix-Shell, Perl, Tcl, Python, C++
Kategorie Versionsverwaltung
Lizenz GPL-2.0[3]
deutschsprachig ja
git-scm.com

Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.

Geschichte[Bearbeiten | Quelltext bearbeiten]

Durch eine Lizenzänderung des bis dahin genutzten, proprietären BitKeeper-Systems konnten die Linux-Kernel-Entwickler dieses nicht mehr kostenlos verwenden und somit blieb vielen Entwicklern der Zugang verwehrt. Daher begann Linus Torvalds im April 2005 mit der Entwicklung einer neuen Quellcode-Management-Software und präsentierte bereits wenige Tage nach deren Ankündigung eine erste Version.

Altes Logo

Torvalds wünschte sich ein verteiltes System, das wie BitKeeper genutzt werden konnte und die folgenden Anforderungen erfüllte:

  1. Unterstützung verteilter, BitKeeper-ähnlicher Arbeitsabläufe
  2. Sehr hohe Sicherheit gegen sowohl unbeabsichtigte als auch böswillige Verfälschung
  3. Hohe Effizienz

Ein bereits existierendes Projekt namens Monotone entsprach den ersten zwei Anforderungen,[4] das dritte Kriterium wurde jedoch von keinem bestehenden System erfüllt.

Torvalds entschied sich dagegen, Monotone an seine Anforderungen anzupassen, und begann stattdessen, ein eigenes System zu entwickeln. Einer der Hauptgründe für diesen Schritt war die Arbeitsweise, für die Monotone nach Torvalds Ansicht optimiert ist. Torvalds argumentierte, dass einzelne Revisionen von einem anderen Entwickler in den eigenen Entwicklungszweig zu importieren zu Rosinenpickerei und unordentlichen Repositorien führen würde. Wenn hingegen immer ganze Zweige importiert werden, wären Entwickler gezwungen aufzuräumen. Dazu seien Wegwerf-Zweige notwendig.

“This is my only real conceptual gripe with ‘monotone’. I like the model, but they make it much harder than it should be to have throw-away trees due to the fact that they seem to be working on the assumption of ‘one database per developer’ rather than ‘one database per tree’. You don’t have to follow that model, but it seems to be what the setup is geared for, and together with their ‘branches’ it means that I think a monotone database easily gets very cruddy. The other problem with monotone is just performance right now, but that’s hopefully not too fundamental.”

„Ich habe nur ein wirkliches konzeptionelles Problem mit ‚monotone‘: Ich mag die Arbeitsweise, aber sie erschwert die Nutzung von Wegwerf-Bäumen durch die scheinbare Arbeitsmethode ‚eine Datenbank je Entwickler‘ statt ‚eine Datenbank je Baum‘. Man muss zwar nicht diesem Modell folgen, aber das Setup scheint darauf ausgerichtet zu sein. Zusammen mit ihren ‚Zweigen‘ befürchte ich ein schnelles Verdrecken der monotone-Datenbank. Ein anderes, hoffentlich nicht zu grundlegendes Problem, ist die derzeitige Leistungsfähigkeit von monotone.“

Linus Torvalds[4]

Gits Gestaltung verwendet einige Ideen aus Monotone sowie BitKeeper, aber keinen Quellcode daraus. Es soll ausdrücklich ein eigenständiges Versionsverwaltungssystem sein.

Derzeitiger Maintainer von Git ist Junio Hamano.[5]

Name[Bearbeiten | Quelltext bearbeiten]

Der Name „Git“ bedeutet in der britischen Umgangssprache so viel wie „Blödmann“. Linus Torvalds erklärte seine Wahl des ungewöhnlichen Namens mit einem Witz, sowie damit, dass das Wort praktikabel und in der Softwarewelt noch weitgehend unbenutzt war:

“I’m an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now ‘Git’.”

„Ich bin ein egoistisches Arschloch und ich benenne all meine Projekte nach mir. Zuerst ‚Linux‘, jetzt eben ‚Git‘.“

Linus Torvalds[6]

“The joke ‘I name all my projects for myself, first Linux, then git’ was just too good to pass up. But it is also short, easy-to-say, and type on a standard keyboard. And reasonably unique and not any standard command, which is unusual.”

„Der Witz ‚Ich benenne alle meine Projekte nach mir, zuerst Linux, nun eben Git‘ war einfach zu gut, um ihn nicht zu machen. Aber es (der Befehl) ist auch kurz, einfach auszusprechen und zu schreiben auf einer Standardtastatur, dazu einigermaßen einzigartig und kein gewöhnliches Standardkommando – sehr ungewöhnlich.“

Linus Torvalds[7]

Der Name Linux wurde anfangs nicht von Torvalds selbst propagiert und nur widerwillig akzeptiert.[8]

Eigenschaften[Bearbeiten | Quelltext bearbeiten]

Datenfluss

Git ist ein verteiltes Versionsverwaltungssystem, das sich in einigen Eigenschaften von typischen Versionskontrollsystemen unterscheidet:

Nicht-lineare Entwicklung[Bearbeiten | Quelltext bearbeiten]

Entwicklungsgeschichte mit extensiv genutztem Branching und Merging

Sowohl das Erstellen neuer Entwicklungszweige (branching), als auch das Verschmelzen zweier oder mehrerer Zweige (merging) sind integrale Bestandteile der Arbeit mit Git und fest in die Git-Werkzeuge eingebaut.[9] Git enthält Programme, mit deren Hilfe sich die nicht-lineare Geschichte eines Projektes einfach visualisieren lässt und mit deren Hilfe man in dieser Geschichte navigieren kann. Branches in Git sind (im Gegensatz zu anderen SCMs) sehr performant implementiert: Ein Branch stellt nur eine Reference, kurz ref, eine Textdatei mit einer Commit-ID, dar, die in einem Repository im Verzeichnis .git/refs/heads (z. B. .git/refs/heads/master für den immer vorhandenen master-Branch) liegt und auf einen bestimmten Commit verweist. Über dessen Parental Commits, also Eltern-Commits, lässt sich die Branch-Struktur rekonstruieren. Durch diese Eigenschaften lassen sich weiterhin sehr große und effiziente Entwicklungsstrukturen, wie bei Git selbst oder dem Linux-Kernel, realisieren, bei denen jedes Feature und jeder Entwickler einen Branch oder ein eigenes Repository haben, aus dem der Maintainer dann Commits über Merge oder Cherry-pick (Nutzen einzelner Commits) in den Hauptzweig des Projekts (master) übernehmen kann.

Kein zentraler Server[Bearbeiten | Quelltext bearbeiten]

Dezentrale Verwaltung des gesamten Repositories mit Hilfe von Git

Jeder Benutzer besitzt eine lokale Kopie des gesamten Repositoriums, inklusive der Versionsgeschichte (history). So können die meisten Aktionen lokal und ohne Netzwerkzugriff ausgeführt werden. Es wird nicht zwischen lokalen Entwicklungszweigen und Entwicklungszweigen entfernter Repositories unterschieden. Obwohl es keinen technischen Unterschied zwischen verschiedenen Repositorien gibt (außer dem zwischen normalen und bare-Repositorien auf Servern, bei denen kein Working-Tree, also die echten Dateien existiert), gilt die Kopie, auf die von einer Projekt-Homepage aus verwiesen wird, häufig als das offizielle Repositorium, in das die Revisionen der Entwickler übertragen werden. Es existieren spezielle Remote-tracking branches, das sind Referenzen (siehe Nicht-lineare Entwicklung), die auf den Stand eines anderen Repositoriums zeigen.

Datentransfer zwischen Repositorien[Bearbeiten | Quelltext bearbeiten]

Daten können neben dem Übertragen auf Dateisystemebene (file://) mit einer Reihe verschiedener Netzwerkprotokolle zwischen Repositorien übertragen werden. Git hat ein eigenes, sehr effizientes Protokoll, das den TCP-Port 9418 nutzt (git://), allerdings nur zum Fetchen und Clonen genutzt werden kann, also dem Lesen eines Repositoriums. Ebenso kann der Transfer über SSH (ssh://, das gängigste Protokoll für Schreiboperationen), HTTP (http://), HTTPS (https://) oder über (weniger effizient) FTP (ftp://) oder rsync (rsync://) erfolgen.[10] Die Übertragung in das offizielle Repository eines Projekts erfolgt häufig in Form von Patches, die via E-Mail an den Entwickler oder eine Entwicklungs-Mailing-Liste geschickt werden. Alternativ kann auch ein Review-System wie Gerrit verwendet werden.[11] Für Projekte, die auf Websites wie GitHub oder Bitbucket gehostet werden, kann eine Änderung einfach durch das Pushen eines Branches vorgeschlagen werden, der dann bei Bedarf durch ein Merge in das Projekt integriert wird.

Kryptographische Sicherheit der Projektgeschichte[Bearbeiten | Quelltext bearbeiten]

Beschädigtes Objekt

Die Geschichte eines Projektes wird so gespeichert, dass der Hash einer beliebigen Revision (commit) auf der vollständigen Geschichte basiert, die zu dieser Revision geführt hat. Dadurch ist es nicht möglich, die Versionsgeschichte nachträglich zu manipulieren, ohne dass sich der Hash der Revision ändert. In der Kryptographie nennt man dies einen Hash-Baum. Einzelne Revisionen können zusätzlich markiert (tagging) und optional mit GPG digital signiert werden (signed tag), beispielsweise um den Zustand zum Zeitpunkt der Veröffentlichung einer neuen Version der Software zu kennzeichnen.

Speichersystem und Dateiversionierung[Bearbeiten | Quelltext bearbeiten]

Es gibt Versionsverwaltungssysteme (beispielsweise CVS), die für jede Datei (und jedes Verzeichnis) eigene, von allen anderen Dateien unabhängige Revisionsnummern verwalten. Für eine Datei wird nur dann eine neue Nummer erzeugt, wenn die jeweilige Datei Teil einer Commit-Operation ist. Im Gegensatz dazu weist Git bei jedem Commit allen im Repository verwalteten Dateien (und Verzeichnissen) eine neue, für alle Dateien gleiche Revisionsnummer zu. Das Abspeichern selbst erfolgt, indem im Commit-Objekt ein Verweis auf die Projektwurzel als tree-Objekt gespeichert wird, das wiederum Verweise auf blobs (binary large objects, die reinen Inhalte der Dateien ohne Identifizierung) und weitere trees (Verzeichnisse) enthält. Ein tree-Objekt verweist (wie ein Verzeichnis-Inode) mit seinen Einträgen auf SHA1-Checksummen, die weitere trees und blobs identifizieren, ähnlich Inode-Nummern in Dateisystemen. Wenn eine Datei in einem Commit nicht geändert wird, ändert sich auch die Checksumme nicht und sie muss nicht nochmals gespeichert werden. Die Objekte liegen im Projekt unter .git/objects. Über Git-„Bordmittel“ lässt sich jeder beliebige Commit über den zugeordneten Hash (die Prüfsumme/Checksumme) eindeutig identifizieren, separat auslesen, verschmelzen oder gar als Abzweigungspunkt nutzen – vergleichbar mit den Revisionsnummern in anderen Systemen.

Säubern des Repositories[Bearbeiten | Quelltext bearbeiten]

Die Daten gelöschter und zurückgenommener Aktionen und Entwicklungszweige bleiben vorhanden (und können wiederhergestellt werden), bis sie explizit gelöscht werden.

Interoperabilität[Bearbeiten | Quelltext bearbeiten]

Es gibt Hilfsprogramme, die Interoperabilität zwischen Git und anderen Versionskontrollsystemen herstellen. Solche Hilfsprogramme existieren unter anderem für GNU arch (git-archimport), CVS (git-cvsexportcommit, git-cvsimport und git-cvsserver), Darcs (darcs-fastconvert, darcs2git und andere), Quilt (git-quiltimport) und Subversion (git-svn).

Web-Interface[Bearbeiten | Quelltext bearbeiten]

Gitweb mit den Unterschieden zwischen zwei Commits

Mit Gitweb gibt es eine in Perl geschriebene Weboberfläche. Der Team Foundation Server von Microsoft verfügt über eine Git-Anbindung (Git-tf).

Verwendung[Bearbeiten | Quelltext bearbeiten]

Die aktuelle Version wird produktiv für die Entwicklung vieler Open-Source-Projekte eingesetzt, darunter Amarok, Android, BusyBox, CMake, Debian, DragonFly BSD, Drupal, Eclipse, Erlang, Fedora, FlightGear, Git selbst, Gnome, Joomla, jQuery, JUnit, KDE, LibreOffice, LilyPond, Linux-Kernel, Linux Mint, MediaWiki, node.js, One Laptop per Child, OpenFOAM, OpenStreetMap, Perl 5, Parrot und Rakudo (Perl 6), PHP, phpBB[12], Plone, PostgreSQL, Python, Qt, Ruby on Rails, Ruby, Samba, Scala, TaskJuggler, TYPO3, VLC media player, Wine, x264[13] und X.org. Außerdem wird Git von einer Vielzahl weiterer Open-Source-Projekte genutzt, wie sie beispielsweise auf Plattformen wie GitHub, GitLab,[14] oder BitBucket zu finden sind.

Git wird auch in kommerziellen Projekten verwendet. So gab beispielsweise Microsoft im August 2017 bekannt, die Versionsverwaltung von Windows auf Git umgestellt zu haben.[15]

Verwaltung von Inhalt[Bearbeiten | Quelltext bearbeiten]

Obwohl Git primär zur Versionsverwaltung von Quellcode entwickelt wurde, wird es auch zum Speichern von flach strukturierten (im Gegensatz zu relationalen Strukturen) Datensätzen direkt als Datei genutzt. So können Funktionen wie Versionsverwaltung, Hook, diff, Replikation und Offline-Nutzung auch für Inhalte ohne Datenbank genutzt werden.[16] Die Nutzung ist ähnlich zu NoSQL, auch wenn Git keine Indexstruktur, Abfrage oder Gleichzeitigkeit erlaubt.

Der Einsatz erstreckt sich auch auf inhaltlich einfach strukturierte Systeme wie CMS[16] oder Wikis.[17][18]

Unterstützte Betriebssysteme[Bearbeiten | Quelltext bearbeiten]

Unix/Linux[Bearbeiten | Quelltext bearbeiten]

Git läuft auf fast allen modernen unixartigen Systemen wie Linux, Solaris, macOS, FreeBSD, DragonFly BSD, NetBSD, OpenBSD, AIX, IRIX.

Windows[Bearbeiten | Quelltext bearbeiten]

Es gibt mehrere Portierungen von Git für Microsoft Windows:

  • Git for Windows,[19] die Portierung des Git-Projektes (früher entwickelt unter dem Namen msysGit[20])
  • TortoiseGit, eine Erweiterung für den Windows-Explorer (Windows Shell Extension). TortoiseGit benötigt zusätzlich eine Git-Installation wie z. B. Git for Windows.
  • Die Cygwin-Umgebung enthält Git.

Siehe auch[Bearbeiten | Quelltext bearbeiten]

Literatur[Bearbeiten | Quelltext bearbeiten]

Weblinks[Bearbeiten | Quelltext bearbeiten]

 Commons: Git – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. git/git. (englisch, abgerufen am 17. September 2018).
  2. The git Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 14. Juli 2018).
  3. Copying. (englisch, abgerufen am 5. August 2018).
  4. a b Linus Torvalds: Kernel SCM saga.. In: Linux-Kernel Archive. 6. April 2005, abgerufen am 5. August 2018 (englisch).
  5. Alexander Neumann: Vor 10 Jahren: Linus Torvalds baut Git. In: Heise online. 8. April 2015, abgerufen am 5. August 2018.
  6. Git FAQ: Why the 'Git' name? 9. März 2013, abgerufen am 5. August 2018 (englisch).
  7. Robert McMillan: Lord of the Files: How GitHub Tamed Free Software (And More). In: Wired. 21. Februar 2012, abgerufen am 6. August 2018 (englisch).
  8. Siehe dazu Geschichte von Linux #Der Name Linux
  9. Chapter 1. Repositories and Branches. In: Git User’s Manual. Abgerufen am 5. August 2018 (englisch).
  10. Exporting a git repository via http. In: Git User’s Manual. Abgerufen am 5. August 2018 (englisch).
  11. Submitting patches to a project. In: Git User’s Manual. Abgerufen am 5. August 2018 (englisch).
  12. Nils Adermann: phpBB moves source code versioning from Subversion to Git. 7. März 2010, abgerufen am 5. August 2018 (englisch).
  13. x264 Main Development tree. Abgerufen am 5. August 2018 (englisch).
  14. GitLab Documentation. Abgerufen am 5. August 2018 (englisch).
  15. Rainald Menge-Sonnentag: Microsoft nutzt ab sofort Git zur Windows-Entwicklung. Heise Online, 23. August 2017, abgerufen am 5. August 2018 (deutsch).
  16. a b Brandon Keepers: Git: the NoSQL Database. 21. April 2012, abgerufen am 5. August 2018 (englisch).
  17. Adam Feber: How we Moved 2.3 Million Wiki Pages to Git. 4. Februar 2014, archiviert vom Original am 10. August 2016; abgerufen am 26. Februar 2017 (englisch). i Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe den Link gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/blog.assembla.com
  18. gollum – A git-based Wiki. Abgerufen am 5. August 2018 (englisch).
  19. Alexander Neumann: Git for Windows verlässt Preview-Status. Heise Online, 19. August 2015, abgerufen am 5. August 2018 (deutsch).
  20. Relationship to Git for Windows. Abgerufen am 5. August 2018 (englisch).