Eins vorweg: Alles, was man über Git wissen sollte, möchte, muss oder kann, steht bereits im Netz. Es gibt ein offizielles Buch namens Pro Git, das nichts kostet. Google spuckt zu so ziemlich jedem Git-Problem einen Artikel auf Stackoverflow, einer Frage/Antwort-Seite, wo viele kluge Menschen, anderen Menschen ihre technischen IT-Fragen beantworten.
Darüber hinaus erhebe ich natürlich keinen Anspruch auf Unfehlbarkeit und Vollständigkeit. Wer Fehler findet, darf, nein soll sie melden, damit ich sie korrigieren kann. Und wenn weitere Fragen auftauchen, steh ich natürlich auch zur Verfügung.
Aber fangen wir an...
Git ist ein so genanntes Versionskontrollsystem. Andere Vertreter dieses Genres heißen CVS, SVN, Mercurial ("Hg") oder Bazaar, um mal nur die vermutlich bekanntesten zu nennen. Worum geht es dabei? Nun, vermutlich wird jeder, der an seinem Rechner schon irgendeine größere Form (>30min) von Arbeit erstellt hat, mal vor dem Problem gestanden haben: Ich will jetzt mal was ausprobieren. In einer Konstruktion ein Bauteil größer machen, Formatierung vom Dokument umschmeißen, 300 Programmzeilen löschen oder eine Lokomotive auf Nuklearantrieb umrüsten.
Wurschtegal, was es ist, der klassische Ansatz geht so:
- Sicherungskopie von Hand machen
- Experiment durchführen
- Ggf. neue Version löschen und Sicherungskopie zurückkopieren
Die Folge: "Mein Werk - Kopie(2).dings"
Drei Tage später krebbst man mit einem Ordner voller kryptisch benannter Sicherungskopien durch die Gegend und hat keine Ahnung mehr, was jetzt eigentlich wo drin ist. Und so richtig gesichert sind ja diese Sicherungskopien auch nicht: Kackt die Festplatte ab, sind sie mitsamt dem Original über'n Jordan. Nun kann man das Zeug natürlich auch noch anderswo hinkopieren - wahlweise von Hand oder von einem automatisierten Backuptool.
Was bleibt ist aber, dass es meiner Meinung nach ein ganz schreckliches Gefrickel ist.
Und genau an dieser Stelle kommen Versionskontrollsysteme (VCS) ins Spiel. Ich bleibe hier mal ein bisschen allgemein, weil die Grundlagen ja kein Alleinstellungsmerkmal von Git sind.
Mit einem VCS erschlägt man die ganze obige Problematik auf einmal. Daten werden in allen mir bekannten VCS in Projekten, genannt "Repositories", organisiert. Wenn ich mit meinen Daten arbeiten möchte, hole ich mir aus dem Repository eine Arbeitskopie ("working copy"). Am Anfang ist das ein ziemlich leerer Ordner.
Nehmen wir nun mal an, ich hab mir was ganz Tolles ausgedacht und fange an, an "Mein Werk.dings" zu arbeiten. Ein Repository existiert schon und ich habe mir den aktuellen Zustand des Repositories in eine Arbeitskopie gezogen, die momentan aus einem leeren Ordner besteht.
Ich bastele ein wenig herum und beschließe, dass diese Grundlagen ausreichen, um sie mal zu sichern. Also teile ich meinem VCS mit, dass es bitteschön die "Mein Werk.dings" in das Repository aufnehmen möge, und zwar in genau diesem Zustand. Guad, sagt das VCS, homma erledigt, is g'speichert. Ein solcher gespeicherter Zustand heißt "Commit" und dieses Exemplar nenne ich jetzt einfach mal "(A)".
Man kann sich üblicherweise die Historie ("Log") seines Repositories angucken. Den Commit, auf dem die Arbeitskopie gerade basiert, markiere ich mit einem *. Das sieht also gerade so aus:
Code: Alles auswählen
(A*)
Code: Alles auswählen
(A)--(B*)
Also, VCS: Gib mir (A) nochmal! Zack! Die beiden Hilfsdingse sind verschwunden und ich habe wieder meinen Ordner genau so, wie er damals war:
Code: Alles auswählen
(A*)--(B)
Code: Alles auswählen
(A)--(B)
\-(C*)
Aber nun! Ich stelle fest, dass mein Werk aus (B) wunderbar zu dem aus (C) passt. Ich hätte schon sehr gerne beides zusammen. Zu diesem Zweck gibt es den "Merge", also die Zusammenführung. Ich kann dem VCS sagen, dass es doch bitte (B) und (C) zusammenführen und das Ergebnis (D) nennen soll:
Code: Alles auswählen
(A)--(B)-\
\-(C)--(D*)
Aber stellen wir uns vor, dass ich auf meinem Klotz eine Stange habe. In (A) hab ich sie einfach mal 10cm lang gemacht. Für (B) musste sie 20cm lang werden und in (C) sogar nur 5cm. Wenn ich jetzt (B) und (C) miteinander vereine: Wie lang wird die Stange? Sowas nennt man dann Konflikt. Kein Algorithmus dieser Welt wird sich für eine sinnvolle Stangenlänge entscheiden können. Er wird dann erst mal weitermachen und alles so gut zusammenführen wie er kann, und mir dann eine Fehlermeldung ausspucken, dass ich mir die Stange mal angucken soll. Erst, wenn ich das erledigt und dem VCS gesagt habe, dass die Stange jetzt die richtige Länge hat, wird Commit (D) wirklich erzeugt. Mit Loch und Rille und passender Stange.
Aber Achtung: Der Merge-Algo wird nur feststellen können, dass sich Loch und Rille nicht in die Quere kommen. Es kann natürlich genausogut sein, dass nur das Loch oder nur die Rille sinnvoll sind und beides zusammen sogar schädlich. Deswegen sollte man sich seine Merges nochmal gut angucken, ob das auch wirklich so passt, was der Automat da produziert hat.
Es hindert mich natürlich niemand daran, jetzt wieder bei (B) weiterzumachen und auf (B) aufbauend (E), (F) und (G) zu erzeugen und dabei (D) komplett außen vor zu lassen:
Code: Alles auswählen
(A)--(B)\-(E)-(F)-(G*)
\-(C)--(D)
Repository anlegen, Dateien hinzufügen, Neue Commits erzeugen, zu alten Commits zurückgehen, Zweige anlegen und bei Bedarf wieder zusammenführen.
Mein Plan für den nächsten Eintrag:
- Zentrale VCS vs. Verteilte VCS (ggf. mit zentraler Sicherung)
- Erste Schritte mit (Tortoise-)Git
- ..?