updated:  2024 23. October
published:  2020 13. August

Git - Versionsverwaltung

Git Repository - Befehle, Konfiguration und Anwendung

1. Konfiguration

Die Konfiguration von Git kann auf drei verschiedenen Ebenen erfolgen. Für Änderungen und Abfrage von lokalen, globalen, oder System Variablen verwende die Funktion git config .

Die globale Konfigurationsdatei .gitconfig liegt im Homeverzeichnis.


 bash:		"/c/Users/%USERNAME%/.gitconfig"
 windows:	"c:\Users\%USERNAME%/.gitconfig"
   

1.1 Dateien ignorieren (.gitignore)

In .gitignore befinden sich Dateien und Verzeichnisse die nicht in das Repository aufgenommen werden. Sinnvollerweise wird sie vor dem initialisieren angelegt. Die Datei befindet sich im Projektverzeichnis (Achtung: nicht in ./.git/).
Wenn zu einem späteren Zeitpunkt die Datei ergänzt oder geändert wird, mach folgendes:


 git rm -r --cached .
 git add .
 git commit -m 		# .gitignore is now working
   

2. Arbeitsweise

Im Prinzip besteht ein Git-Repository aus drei Hauptkomponenten.

  1. Das Arbeitsverzeichnis (Working Directory)
  2. Die Bühne (Stage, bzw. Index)
  3. Der Zweig (Branch, bzw. aktueller HEAD)
no image
 Git Data Flow 

Zwischen den Hauptkomponenten werden mit folgenden Befehlen die Daten gesichert.

  • Arbeitsverzeichnis (Work Directory)

git add - schreibt alles vom Arbeitsbereich auf die Bühne

  • Bühne (Stage, Index)

git commit - schreibt alles von der Bühne in den Zweig

  • Zweig (Branch, HEAD)

git merge - integriert einen Zweig in ein anderen oder in den Masterzweig

  • Master (Branch)

Die vierte Komponenten ist der sog. Master, in dem alles zusammengeführt wird.

2.1 Fachbegriffe

Commit = (Schnappschuss) übergeben, anvertrauen
Stage = Bühne
Branch = Zweig
Merge = (Zweige) zusammenlegen, verbinden, vereinigen, fusionieren
Rebasing = Umbasieren
Stash = verstauen, aufbewahren, bunkern

3. Befehle

 git -h 	# Hilfe anzeigen
 git -h -a	# Subcommands anzeigen
 git -h -g 	# Concepts anzeigen

3.1 git config

Mit git config kann die Systemkonfiguration sowie die globale und die lokale Konfiguration von Git angepaßt oder ausgegeben werden.

 git help config		# Hilfe zu config anzeigen
 git config -l 			# listet alle Variablen auf
 git config --global -l 	# listet alle globalen Variablen auf
 git config --system -l 	# listet alle Systemvariablen auf
 git config --local  -l 	# listet alle lokal Variablen eines Git-Projektes auf

Z.B. sind deine speziellen Git Variablen auf der globalen Ebenen in der Datei ~/.gitconfig gespeichert und können wie folgt angepaßt oder ausgeben werden.

 # Globale Variablen setzen
 git config --global user.name  <name>
 git config --global user.email <name@localhost>

 # Globale Variablen ausgeben (--get)
 git config --global --get user.name
 git config --global --get user.email

 # Globale Variablen löschen (--unset)
 git config --global --unset user.name

 # Proxy einstellen
 git config --global http.proxy   <url:port>
 git config --global https.proxy  <url:port>

 # Farbausgabe aktivieren/deaktivieren
 git config --global color.ui true
 git config --global color.ui false

 # Tabulatorabstand bei git diff ändern
 # git diff arbeitet mit dem Programm less (pager) zusammen
 git config --global core.pager 'less -x8'
 git config --global --unset core.pager

3.1.1 Aliase erleichtern deine Arbeit

Für lange Befehlsketten wie z.B. git log -n 16 --pretty=format:"%C(auto)%<(20,trunc)%D %Cblue%h %Cgreen%s %n%-b" können Aliases eingerichtet werden. Die Aliases werden in ~/.gitconfig gespeichert.

 # Alias einrichten für eine formatierte Ausgabe der letzten Commit's 
 git config --global alias.loglast 'log -n 16  --pretty=format:"%C(auto)%<(20,trunc)%D %Cblue%h %Cgreen%s %n%-b"'

 # Alias aufrufen
 git loglast

 # Alias aus ~/.gitconfig entfernen
 git config --global --unset alias.loglast

3.1.2 Problem Zeilenvorschub

Windows und Linux verwenden unterschiedliche Zeichen um das Ende einer Zeile in einer Textdatei zu markieren. Geschichtlich angelehnt an eine Schreibmaschine verwendet Windows/DOS am Ende einer Textzeile die Zeichen Wagenrücklauf (Carriage-Return) und Zeilenvorschub (Linefeed), also kurz CRLF. In Linux wird nur der Zeilenvorschub verwendet, also kurz LF. Das kann zu Problemen in einem Git-Projekt führen, wenn das Projekt auf unterschiedlichen System bearbeitet werden soll. Für Git besteht die Konfigurationsoption core.autocrlf um das Problem zu lösen. Git konvertiert automatisch die Zeilenendezeichen beim Ein- und Auschecken wie folgt:

# CRLF beim Ein- und Auschecken (Windows- und Linuxkonform)
git config --global core.autocrlf true

# LF beim Ein- und Auschecken (Linuxkonform)
git config --global core.autocrlf input

# wenn Git nur auf Windowssystem benutzt wird, dann ...
git config --global core.autocrlf false

3.2 git init

Initialisiert ein leeres Git-Repository.
Anlegen des Verzeichnisses ./.git

3.3 git add

Legt bzw. zieht Dateien oder ganze Verzeichnisse auf die Bühne (Stage) Diesen Befehl muss du auch anwenden wenn du Dateien geändert hast. Ist die Datei noch nicht auf der Bühne (Stage) kann sie mit git checkout wiederhergestellt werden. Zum Beispiel:

 git add .               # zieht das Hauptverzeichnis in die Stage
 git add ./bla	         # zieht das Verzeichnis bla in die Stage
 git add datei.txt       # zieht die Datei.txt in die Stage
 git add -A              # Fügt generell alle unbeobachteten Dateien in die Stage.
                         # Auch die temporären Dateien.
 git rm --cached <Datei> # Entfernt Dateien die im Stage hinzugefügt worden sind.

Hinweis: Wenn irgendwas schief läuft kannst du mit git reset Datei von der Bühne (Stage) holen.

3.4 git status

Statusabfrage.
Rot -» Datei/Verzeichnis wurde geändert ist jedoch noch nicht auf der Bühne
Grün -» Datei/Verzeichnis liegt auf der Bühne (Stage) aber nicht im Zweig (Branch)

3.5 git commit

Zieht die Dateien und Verzeichnisse von der Bühne (Stage) in den Zweig (Branch) Die Option -m steht für Message bzw. Kommentar. Zum Beispiel

 git commit         -m "text"    # Änderungen von der Bühne (Stage) in den Zweig (Branch) legen.
 git commit -a      -m "text"    # Änderungen mit gleichzeitigen git add
 git commit --amend -m "newtext" # Ersetzt die vorherige Übergabe der Änderungen in den Zweig 

Hinweis: Wenn irgendwas schief läuft kannst du mit git reset Datei vom Zweig (Branch) holen.

3.6 git log/show

Alle oder einzelne Commit’s anzeigen. Jeder Commit besitzt eine eindeutige ID durch einen Hashwert (Prüfsumme). Der Hashwert wird mittels SHA erzeugt (sha1sum).

 git log		# alle Commit's anzeigen, neueste als erste
 git log -n 2		# letzten zwei Commit's anzeigen
 git log --stat		# anzeige der Statistiken für Dateien, die in den einzelnen Commits geändert wurden
 git log --name-only	# listet die Dateien auf, die nach den Commit-Informationen geändert wurden
 git log --graph	# Anzeige als ASCII-Diagramm
 git log -p -1		# zeigt was im letzten Commit geändert wurde
 
 git show 			# zeigt was im letzten Commit geändert wurde (wie git log -p -1)
 git show <hash>		# zeigt Änderungen aus Commit <hash>
 git show <hash> --name-only	# zeigt Änderungen aus Commit <hash>, listet geänderte Dateien auf

3.6.1 Formatierte Ausgabe

 # Formatierte Ausgabe
 git log --pretty=format:"%h %s"		# nur Hashwert %h und Thema %s ausgeben
 git log --pretty=format:"%h %s" --graph	# wie oben als ASCII-Diagramm 
 
 # Farbausgabe in Zeilen und Spalten
 git log -n 16  --pretty=format:"%C(auto)%<(20,trunc)%D %Cblue%h %Cgreen%s %n%-b"

Weitere git log Optionen .

3.7 git diff

Zeigt Änderungen zwischen zwei Dateien des letzten Commit’s und der aktuellen Bearbeitung (anzeigen mit git status). Die Datei darf noch nicht auf der Bühne (Stage - git add) liegen. Und zeigt Änderungen zweier Commits mittels Hashwert an.

 git status		
 git diff Datei.xyz			# Unterschiede einer geänderten Datei
 git diff <Hash1> <Hash2>		# Unterschiede zweier Commit-Hash
 git diff --name-only <Hash1> <Hash2>	# alle geänderte Dateien zweier Commit-Hash ausgeben

3.7.1 Geänderte Dateien separat speichern

Mit dem Befehl git diff --name-only <Hash1> <Hash2> werden zwischen zwei Commits (Hash1 und Hash2) alle Dateien ausgegeben, die geändert wurden. Um die geänderten Dateien aus dem Git-Repository heraus zu speichern nimm folgenden Befehl:

 git diff -z --name-only <Hash1> <Hash2> | xargs -0 -IPlatzhalter cp --parents Platzhalter ../Path/

Standardmäßig hängt xargs die Dateiliste am Ende der Befehlsfolge. Mit dem Platzhalter kann die Dateiliste an einer beliebigen Stelle der Befehlsfolge eingefügt werden.

3.8 git branch

Anzeigen aller Zweige (Branch). Das derzeit aktive wird grün markiert.

 git branch -v 		    # Ausführliche Ausgabe aller Zeige.
 git branch    <NeuerZweig> # Erzeugt eine neuen Zweig aus dem aktuellen Commit.
 git branch -d <Zweig>	    # Löscht den Zweig

3.9 git checkout

Checkout hat mehrer Funktionen.

  1. Wechselt in den neuen Zweig (Branch) und setzt ihn aktiv.
  2. Datei wiederherstellen die noch nicht auf der Bühne (Stage) liegt (git add).
 git checkout ZweigNeu	# Wechselt in den neuen Zweig
 git checkout Datei	# Wiederherstellung der Datei

3.10 git reset

Datei wiederherstellen wenn sie bereits mit git add auf der Bühne liegt. Die Datei wird von der Bühne geholt und als geändert markiert (git status). Eine gute Erklärung wie git reset funktioniert gibt es hier .

 git reset		# alle letzten Änderungen von der Bühne (Stage) in den Arbeitsbereich zurück
 git reset HEAD <file>	# Einzelne Datei von der Bühne (Stage) zurück holen
 git reset --hard	# Datei(n) wiederherstellen nach der letzten Übergabe (Commit)

3.11 git merge

Mit git merge werden Änderungen aus einem angelegten Zweig (z.B. hotfix) in dem Masterzweig (Master) eingefügt.

 git checkout Masterbranch	# Wechselt in den Master Zweig
 git merge hotfix		# hotfix-Branch in den Master integrieren
 git branch -d hotfix		# hotfix kann gelöscht werden

3.12 Exportiere Branch in zip-Archive

 git archive --format zip --output ./path/to/file.zip branch

3.13 git stash

Ein interressanter Aspect ist der Befehl git stash. Damit werden Änderungen an Projektdateien zwischen gelagert ohne sie mit git add/commit in den Zweig (Branch) zu integrieren. Das ist sinnvoll um in einem sauberen Zweig zu wechseln und später an den Änderungen weiter zu arbeiten.

 git stash list		# zeigt welche Stashes gespeichert sind
 git stash		# Speichert die letzten Änderungen in den Stash
 git stash apply	# lädt die letzten Änderungen in den Branch
 git stash drop		# löscht den letzten Stash

 git stash apply stash{2}	# lädt die Änderungen stash{2} in den Branch
 git stash drop  stash{2}	# löscht stash{2} aus dem Stack

4. Graphische Git-Varianten

 gitk		# Visualisiert alle Zweige (Branch) als Graph übersichtlich
 git  gui	# git im Fenster - wer's den mag

Git-Book
thomas-krenn.com
Git für Einsteiger

Stichworte (tags)