1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Quellcode versionieren

Git verwaltet Dateien in einem sogenannten Depot unterhalb des Verzeichnisses .git. Das Projektverzeichnis selbst enthält nur die Dateien des aktuell ausgecheckten Zweigs, die sogenannte Arbeitskopie. Wechselt man auf einen anderen Zweig, tauscht Git diese Dateien aus.

Datenmodell von Git (Kreis = Stand, Dreieck = Baum, Rechteck = Blob)

Der Kopf (head) von jedem Zweig (branch) zeigt auf den neuesten Stand (commit) und dieser wiederum in einer einfach verketteten Liste auf seinen Vorgänger. Zu jedem dieser Knoten gehört ein Baum (tree), der auf eine Menge von Blob-Objekten verweist, welche letztendlich die Text- oder Binärdaten des Projekts enthalten. Jedes dieser durch eine Prüfsumme identifizierbaren Objekte kann durch ein Etikett (tag) einen menschenlesbaren Namen kommen. Der Index ist ein spezieller Baum, der die Änderungen in der Arbeitskopie aufnimmt und beim commit an das entsprechende Objekt angehängt wird.

Globale Einstellungen konfigurieren

Jeder Programmierer sollte zuerst einmal Vor- und Nachname sowie seine Elektropost-Adresse hinterlegen. Diese und alle weiteren Einstellungen werden in ~/.gitconfig gespeichert.

git config --global user.name "DisplayName"
git config --global user.email "User@Host"
git config --global alias.show-graph \
	'log --graph --abbrev-commit --pretty=oneline'
git config --list

Um den Überblick zu behalten, kann man den aktuellen Zweig im Prompt anzeigen.

~/.bashrc
… export GIT_PS1_SHOWDIRTYSTATE=1 . /usr/lib/git-core/git-sh-prompt PS1='$? \u@\h:\w$(__git_ps1)\$ '

Lokales Depot anlegen

Um ein neues Projekt zu starten, legen wir einfach ein neues Verzeichnis an und rufen dort git init auf. Dieses Kommando erzeugt lediglich das versteckte Verzeichnis .git mit der entsprechenden Unterstruktur.

mkdir Project
cd    Project
git init

Beim Bauen von Programmen entstehen oft Artefakte (zum Beispiel Objektdateien beim Übersetzen von C-Programmen), die man nicht verwalten möchte.

.gitignore
*.o

Änderungen ins Depot eintragen

Die in der Arbeitskopie bereits vorhandenen oder neu angelegten Dateien und Verzeichnisse werden nicht automatisch verwaltet. Man muss diese mit den Kommandos add im Index vormerken. Gibt man ein Verzeichnis an, werden rekursiv alle dort befindlichen Dateien hinzugefügt.

git add Path

Geänderte Dateien anzeigen, die noch nicht vorgemerkt wurden:

git status

Schließlich tragen wir die im Index vorgemerkten Änderungen ein und versehen diesen Eintrag mit einer Nachricht, die den Zweck der Änderung beschreibt.

git commit -m "Message"

Manchmal möchte man eine bestimmte Änderung zurücknehmen. Ein revert erzeugt einen neuen Stand, der eine oder mehrere zurückliegende Änderungen rückgängig macht.

git revert Commit

In seltenen Fällen möchte man den Zweig auf einen alten Stand zurücksetzen und alle nachfolgenden Änderungen unwiderruflich löschen.

git reset Commit

Zweige abspalten und zusammenführen

Um bei der Entwicklung von neuen Funktionen oder bei größeren Umbauarbeiten keine anderen Entwickler zu stören, spaltet man für solche Vorhaben einen neuen Zweig ab.

git branch   feature/a
git checkout feature/agit commit

Damit sich dieser Zweig nicht allzu weit vom Master entfernt, sollte man die Änderungen gelegnetlich nachvollziehen. Nach einem erfolgreichen rebase sieht es so aus, als entspränge der Zweig dem aktuellen Stand des Masters.

git rebase master

Sobald die Entwicklung fertig gestellt ist, führt man die Änderungen im Master zusammen. Das Ergebnis eines merge ist ein neuer Stand, der alle Änderungen im Zweig enthält.

git checkout master
git merge    feature/a

Bei gravierenden Änderungen, zum Beispiel wenn man einen Meilenstein erreicht hat, sollte man diesen Stand etikettieren.

git tag Version [-m Message]

Differenzen untersuchen

Bisherige Änderungen auflisten:

git log [-n Count]

Details eines bestimmten Änderung anzeigen:

git show Commit

Änderungen einzelner oder aller Dateien in der Arbeitskopie zum letzten Stand anzeigen:

git diff [Path]

Änderungen zwischen zwei Ständen anzeigen:

git diff Commit Commit

Änderungen graphisch ansehen:

git difftool --dir-diff --tool=meld

Entferntes Depot verwalten

Depot von einem Server (zum Beispiel GitHub, GitLab oder Gitea) in ein neues Unterverzeichnis auf dem Arbeitsrechner holen. Die URL des Servers wird in .git/config unter dem Namen origin gespeichert.

git clone git://Host:User/Project

Weitere Server hinzufügen, ändern und entfernen:

git remote add    Server Url
git remote rename Server NewServer
git remote rm     Server

Änderungen vom Server ins eigene Depot holen. Ein pull ist die Kombination aus fetch (holt Änderungen vom Server) gefolgt von merge (verschmilzt die Änderungen mit der Arbeitskopie).

git pull [-u Server]

Änderungen aus dem eigenen Depot zum Server hochladen

git push [-u Server]

Referenz

Diese Auflistung soll nur einen Überblick über die verfügbaren Kommandos und Optionen vermitteln und erhebt keinen Anspruch auf Vollständigkeit. Als authoritative Quelle gelten nur die Manpages und die offizielle Dokumentation. Alle Optionen werden in git(1) ausführlich beschrieben.

Commit
Streuwert eines Commits, Bereich (Beg..End) oder Anzahl (~Count)
Branch
Name eines Zweigs, standardmäßg der Aktuelle
Server
Name oder URL eines entfernten Depots, standardmäßig origin
Object
Streuwert eines Blobs, Trees oder Commits
Kommando Operand Beschreibung
githelp [Command] Hilfe anzeigen
Depot
init Neues Depot erstellen
config Key=Value Option anzeigen und setzen
Suche
log Commit Historie der Meldungen ausgeben
show [Object] Details anzeigen
grep Regex [Path] Muster in Arbeitskopie suchen
bisect Binärsuche beginnen
Stand
status [Path] Vorgemerkte und geänderte Dateien anzeigen
add Path Neue oder geänderte Datei im Index vormerken
mv Path Path Datei umbenennen
rm Path Datei löschen
commit Vorgemerkte Dateien ins Depot übertragen
tag Version [Commit] Stand etikettieren
Zweig
branch [Branch] Zweige auflisten oder Neuen erzeugen
checkout Branch Arbeitskopie auf diesen Stand bringen
diff [Commit …] [Path]Unterschiede zwischen zwei Ständen anzeigen
merge Commit Änderungen aus Zweig als neuen Commit in den Master holen
rebase Branch Commits aus Master nachholen und so Abzweigungspunkt verschieben
Server
clone Url [Path] Depot von einem Server herunterladen
remote Server [Url] Server mit URL assoziieren
fetch [Server] Änderungen vom Server holen
pull [Server] Dito, und Arbeitskopie aktualisieren
push [Server] Änderungen zum Server hochladen
--system Systemweite Einstellungen aus /etc/gitconfig
--global Benutzerspezifische Einstellungen aus ~/.gitconfig
--local Depotspezifische Einstellungen aus .git/config
-l Alle Variablen auflisten
-Number Anzahl der Meldungen limitieren
--since=Date Zeitraum von
--unitl=Date Zeitraum bis
--unitl=Date Zeitraum bis
--pretty=oneline|short|medium|full|fuller|email|rawAusgabe hübsch formatieren
--pretty=oneline|short|medium|full|fuller|email|rawAusgabe hübsch formatieren
-i Groß-/Kleinschreibung ignorieren
-w Ganze Wörter suchen
-e Regex Weiteren Ausdruck verodern
start Binärsuche beginnen
bad [Commit] Version als fehlerhaft markieren
good [Commit] Version als korrekt markieren
reset Binärsuche beenden
-r Verzeichnis rekursiv löschen
-m Message Zweck der Änderung beschreiben
-d Branch Zweig löschen
-m [OldBranch] NewBranch Zweig umbenennen
-c [OldBranch] NewBranch Zweig kopieren
-f Lokale Änderungen verwefen
-b NewBranch Neuen Zweig erzeugen
--patch Patch erzeugen
--summary Überblick anzeigen
--minimal Teuren Algorithmus verwenden
-m Message Zweck beschreiben
--abort Verschmelzung abbrechen
--continue Verschmelzung fortführen
--continue Konflikte behoben, Verschmelzung fortführen
--skip Aktuellen Stand überspringen
--abort Alles rückgängig machen und abbrechen
--quit Verschmelzung halbfertig beenden
--list Etiketten auflisten
--sign Etikette signieren
--verify Signatur verifizieren
--delete Tag Etikett löschen
--local Lokales Depot einfach kopieren
--bare Depot ohne Arbeitskopie anlegen
--mirror Depot spiegeln
--origin Server Alternativen Namen verwenden (statt origin)
--branch Anderen Branch auswählen (statt master)
add Server Url Weiteren Server hinzufügen
mv Server NewServer Server anders benennen
rm Server Server entfernen
prune [Server] Obsolete Zweige löschen
--all Alle Zweige aktualisieren
--prune Obsolete Zweige löschen
--tags Tags holen
--all Alle Zweige aktualisieren
--all Alle Zweige hochladen
--prune Obsolete Zweige löschen
--tags Tags hochladen

Literatur