Nach über acht Jahren mit Subversion in internen und externen Projekten, hatte ich im letzten Jahr Gelegenheit Erfahrungen mit GIT zu sammeln. Während es auf den ersten Blick wie ein weiteres Sourcecode Verwaltungs-Tool aussieht, merkt man bald, dass es sich doch deutlich unterscheidet.
Wer sich also mit Perforce, CVS oder Subversion auskennt, tut gut daran Bekanntes erst einmal zu vergessen.
Die Unterschiede sind im Wesentlichen:
GIT speichert nicht eine Liste von Veränderungen auf File-Basis, sondern sieht das verwaltete Verzeichnis (das mit dem .git-Verzeichnis) als Root eines Filesystems. Beim Commit wird ein Snapshot des gesamten Verzeichnisses gespeichert (wobei natürlich unveränderte Files nicht gespeichert werden).
Jeder Entwickler hat das komplette Repository lokal. Das Design von GIT braucht kein zentrales Repository. Die Suche in der History geschieht lokal, was es ungewohnt schnell macht. Ausserdem kann man überall (fast) ohne Einschränkungen am Projekt weiterarbeiten.
Im Firmen-Einsatz ist ein zentrales Repository unablässig, um nightly builds&co durchführen zu können. Hier wird üblicherweise ein stationäres Repository für diesen Zweck angelegt.
Ein Commit ist quasi zweistufig: Der erste Schritt findet lokal mittels commit statt. Der zweite Schritt ist ein push auf ein anderes Repository (z.B. das Zentrale der Firma/des Projekts), das System eines Kollegen oder github. Wobei man dazwischen noch Reihenfolge der lokalen Commits, ... noch ändern kann.
Initialer Setup
GIT kann kostenlos von http://git-scm.com/download heruntergeladen und dann installiert werden. Nach der Installation muss einmalig Benutzername und EMail-Adresse definiert werden. Dies wird bei den Commits bzw Pushs verwendet.
git config –global user.name „Vorname Nachname“
git config –global user.email „email@thetop.ch“
Mit --system gibt es noch einen höheren Level für diese Konfiguration-Optionen, den man in der Praxis eigentlich nicht verwendet, da er zu weitreichend wirkt.
Erste Schritte
Um ein Verzeichnis von GIT verwalten zu lassen, muss im obersten betroffenen Verzeichnis folgendes eingegeben werden:
git init
Dies gilt kaskadierend für sämtliche enthaltenen Verzeichnisse, wobei - anders als bei Subversion - nur auf dem obersten Level ein .git-Verzeichnis angelegt, welches sämtliche GIT-spezifischen Informationen enthält.
Damit GIT die Dateien in den Verzeichnisse verwaltet werden müssen Dateien einzeln, über Wildcards oder verzeichnisweise hinzugefügt werden:
git add read.txt
git add *.java
In folgenden Blog-Einträgen sammle ich meine Erfahrungen zur internen Funktionsweise von GIT.