Viele Programmierer stoßen an bestimmten Punkten immer wieder auf Namen wie SVN, GIT, CI oder anderes, doch um was handelt es sich dabei.

Bei git handelt es sich um eine so genannte Versionierungs Software, mit hilfe dieser lässt sich ein Projekt bzw jede Art von Daten verwalten, bei Dateien die nur Text beinhalten (z.B.: Quelltexte) lassen sich auch Unterschiede im nachhinein nachvollziehen, vergleichen, und rückgängig machen. git benutzt sogenannte Repositorys, in diesen sind alle Informationen und die Dateien selbst gespeichert.

Entwickelt wird git unter anderem von Linus Torvalds (Initiator des Linux Kernels) und wurde zu beginn auch zur Verwaltung des Linux Kernels benutzt. Inzwischen liegt git in der Version 1.8.5.2 vor (stand 13.12.2013) und wird für viele unterschiedliche Zwecke benutzt.

Einer der Größten Diskussion Punkte ist die Dezentralisiertheit von git, darunter ist zu verstehen das git keinen Zentralen Server benutzt wie z.B. SVN, jeder Entwickler hat zu jedem Zeitpunkt alle Informationen eines Repositorys auf seinem Computer. Trotzdem kann mithilfe eines Zentralen Repositorys ein gewisse Zentralität hergestellt werden. Dieses Zentrale Repository ist dann bei allen Entwicklern das so genante Upstream Repository. Von diesem können alle Entwickler die Informationen/Dateien/Änderungen in ihre Lokales Repository kopieren.

Zonen in Git
Der git Arbeitsbereich ist in mehrere Zonen aufgeteilt bei diesen handelt es sich um die Bereiche:

Arbeitskopie
Dieser Bereich ist mit seinem Namen mehr oder weniger Selbsterklärend, dies ist der Bereich in dem Aktiv gearbeitet wird. Änderungen die hier gemacht werden sind nur Lokal vorhanden und werden noch nicht irgendwo hochgeladen oder in andere Repositorys synchronisiert.

Staging Area (Index)
In diesem Bereich befinden sich die Änderungen die mit dem nächsten Normalen Commit gespeichert werden sollen. Der Staging Bereich, der auch Index genannt wird, ist sozusagen ein Temporäre Zone in der sich Änderungen bis zum Speichern (Commit) befinden. Der Staging Area hinzugefügt werden Daten mithilfe des Befehls "git add" mit diesem Befehl lassen sich einzelne Dateien aber auch ganze Ordner hinzufügen.

Head
Der Head verweist auf den letzen Persönlichen Commit.

Origin
Dies ist eine Besondere Bereich, beim Origin handelt es sich um ein sogenanntes upstream Repository, dieses ist z.B. ein Zentrales Repository auf dem Firmen Server auf dem die Repositorys aufbauen.

Mithilfe der befehle pull und push können die Änderungen zwischen dem Lokalen und den Upstream Repository synchronisiert werden. Um einen Push durchzuführen muss sich das Lokale Repository auf dem neusten Stand befinden, also muss zuerst ein pull durchgeführt werden. Dabei müssen dann auch die möglicherweise entstandenen Konflikte behoben werden (mehr unter Merging). Danach können alle Lokalen Änderungen und alle Zusammenführungen via Push wieder zum Server zurück gesendet werden.

Commit
Mit einem Commit speichert man Änderungen in ein Repository, jeder Commit erhält eine eindeutige ID mit der auf diesen Commit verwiesen werden kann. Bei dem Vorgang des Commits werden die Dateien die sich in der Staging Area befinden wieder Fix gespeichert und der Head wird auf den Commit gesetzt. Im Normalfall werden bei einem Commit die Änderungen aus der Staging Area gespeichert, allerdings lassen sich mit dem Schalter "-a" auch einfach alle verfolgten Dateien Commiten. Neben allen Index Daten oder allen Dateien können auch spezielle Dateien einzeln gespeichert werden, dazu werden diese einfach als liste hinter "git commit" geschrieben.

Merging
Sollte einmal eine Datei von zwei unterschiedlichen Personen bearbeitet werden, muss der Konflikt zwischen den beiden Datein zuerst gelöst werden. Bei Quellcode Datein in denen Unterschiedliche Stellen bearbeitet worden sind behebt git diese Konflikte recht zuverlässig und gut. Dies ist eine der Großen stärken von git und gleichzeitig eines der Beliebtesten Features.

Sollte ein Konflikt nicht automatisch gelöst werden können, wird der Person die den Commit durchführt die Möglichkeit gegeben die Konflikte manuell zu lösen.

Hooks
Die sogenannten Hooks werden bei bestimmten Aktionen von git ausgeführt. Die Dateien für die Hooks befinden sich im Normalfall innerhalb des .git Ordners des Repository (.git/hooks). Registriert werden z.B. pre-commig (wird vor dem Commit ausgeführt), post-commit (wird nach einem Commit ausgeführt) oder pre-push ( wird vor einem Push ausgeführt).

Tags
Taggs sind eine Möglichkeit bestimmte Commits mit einer Markierung zu versehen. Somit können gewisse Meilensteine, oder Release gekennzeichnet werden. Meistens werden mit Tags die Versionen markiert und diese gleichzeitig mit zum Download angeboten.

Branching
Ein Repository ist in so genannte Branches unterteilt, diese können unabhängig von einander bearbeitet werden, sollten Dateien in einem Branch gelöscht werden heißt dies nicht das sie in allen anderen Braches gelöscht wurden. Der "Haupt" Branch ist der master Branch. In den meisten Fällen werden z.B. einzelne Features in einem eigenen Branch bearbeitet um keinen Einfluss auf die Entwicklung anderer Teams oder Feature zu haben. Nach Fertigstellung werden diese dann in den master branch zurück gemerged.



In diesem Beispiel Bild sieht man wie Commits (Die Kreise) durch geführt werden. Dabei werden die im testing Branch unabhängig von master getätigt und am ende in den master gemerged so das die "getesteten" Änderungen auch im Hauptzweig des Projektes verfügbar sind.

Weitere Informationen zu git gibt es hier:


Gehostete git Server gibt es bei:


Sollte noch fragen bestehen stehe ich gerne über die Kommentare zur Verfügung um Fragen zu beantworten.

So Long,
ED