updated: | 2024 23. October |
published: | 2020 13. August |
Git - Versionsverwaltung
Git Repository - Befehle, Konfiguration und Anwendung1. 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.
- Das Arbeitsverzeichnis (Working Directory)
- Die Bühne (Stage, bzw. Index)
- Der Zweig (Branch, bzw. aktueller HEAD)
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.
- Wechselt in den neuen Zweig (Branch) und setzt ihn aktiv.
- 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
5. Weblinks / Online Hilfe
Git-Book
thomas-krenn.com
Git für Einsteiger