Git Rundumschlag
Git hat sich in den vergangenen Jahren als De-facto-Standard für Versionskontrolle entwickelt. Nachfolgend die meiner Meinung nach wichtigsten Kommandos, die man kennen sollte. Diese besitzen wesentlich mehr Parameter, als von mir angegeben. Aber die verwendeten dürften die sein, die man im Normalfall benötigt.
Neues Repository erstellen
git init
Repository klonen
git clone $URL
Dateien hinzufügen
git add . //alle Dateien hinzufügen
git add $DATEI
Damit werden die Dateien gestaged. Dies bedeutet, dass diese beim nächstem Commit eingecheckt werden sollen. Alternativ kann beim Commit der Parameter -a angegeben werden, damit ein automatisches staging durchgeführt wird.
Stashing
Nicht zu verwechseln mit „staging“ 😉.
Mittels stashing können aktuelle Änderungen in einen „Zwischenspeicher“ gelegt werden und zu einem späteren Zeitpunkt wieder angewendet werden.
Stash erstellen
git stash save "$NACHRICHT"
Nach dem Ausführen dieses Codes sind die gemachten Änderungen nicht mehr vorhanden und müssen manuell wieder angewendet werden.
Stashes auflisten
git stash list
Branch auf Basis eines Stashes erstellen
git stash branch $BRANCH_NAME
Stash wieder anwenden
git stash pop $STASH_NAME
$STASH_NAME ist optional. Wird dieser nicht angegeben, wird der Stash angewendet, der als letztes gemacht wurde. Pop entfernt den Stash anschließend auch. Alternativ gibt es noch „git stash apply“, der den Stash behält.
Einzelnen Stash löschen
git stash drop $STASH_NAME
Alle Stashes löschen
git stash clear
Aktuellen Status abfragen
git status
Aktuelle Änderungen anzeigen
git diff
Es werden Änderungen angezeigt, die noch nicht gestagt wurden. Um die gestagten Änderungen anzuzeigen muss folgender Befehl verwendet werden:
git diff --staged
Aktuelle Änderungen an einer Datei rückgängig machen
git checkout $DATEINAME
Aktuelle Änderungen einchecken
git commit -m "$NACHRICHT"
Zusätzlich kann der Parameter -a angegeben werden, um geänderte Dateien vor dem Commit zu stagen (siehe Punkt Dateien hinzufügen weiter oben).
Nachricht ändern oder Dateien zum letzten Commit hinzufügen
git commit --amend -m "$NACHRICHT"
Commits auflisten
git log
Um pro Commit nur eine Zeile auszugeben, kann der Parameter –pretty=oneline angegeben werden. Mit dem Parameter –stat werden zusätzlich noch die geänderten Dateien aufgelistet.
Historie anzeigen, was alles gemacht wurde
git reflog
Änderungen eines Commits anzeigen
git diff $HASH_COMMIT
Es können auch zwei $HASH_COMMIT angegeben werden. Damit werden die Änderungen zwischen den zwei Commits angezeigt, auch wenn diese nicht direkt beieinander liegen.
Informationen zu Commit anzeigen
git show $HASH_COMMIT
Branches
Branches stellen eines der wichtigen Elemente in der Versionskontrolle dar. Damit können mehrere Äste eines Codes verwaltet werden. Ein gängiges Muster ist z.B. mit jeder neuen Hauptversion einen neuen Branch zu erstellen. Neue Features werden nur noch in diesem neuen Branch gemacht. Muss ein Bugfix auch in einer alten Version gemacht werden, so wird dieser in der alten Version gemacht und in die neue Version gemergt.
Branch erstellen
git branch $BRANCH_NAME
Branches anzeigen
git branch
Branch wechseln
git checkout $BRANCH_NAME
Änderungen zwischen Branches mergen
git merge $SOURCE_BRANCH
Wichtig ist, dass man sich im Zielbranch befindet. 😉
Branch löschen
git branch -d $BRANCH_NAME
Cherry-Picking
git cherry-pick $HASH_COMMIT
Mittels Cherry-Picking kann ein einzelner Commit aus einem anderen Branch in den aktuellen Branch übernommen werden.
Aktuelle Änderungen verwerfen
git clean -df
git checkout -f $BRANCH_NAME
Mit git clean werden zuerst alle Dateien und Verzeichnisse, die noch nicht im Repository sind, gelöscht. git checkout holt sich anschließend den aktuellen Stand aus dem Repository.
Commits rückgängig machen
git reset $HASH_COMMIT
Wichtig! Es werden alle Commits bis zu diesem Zeitpunkt rückgängig gemacht!
Es gibt zusätzlich noch folgende wichtige Parameter:
- –mixed (= Standard). Damit werden die Änderungen, die rückgängig gemacht werden in das Arbeitsverzeichnis zurückgespielt, aber nicht gestaged.
- –soft. Damit werden die Änderungen, die rückgängig gemacht werden in das Arbeitsverzeichnis zurückgespielt und gestaged.
- –hard. Die Änderungen, die rückgängig gemacht werden, werden verworfen.
Als HASH_COMMIT kann ein Commit aus der Vergangenheit, aber auch aus der Zukunft angegeben werden (bekommt man mit git reflog), wenn z.B. im Vorfeld Commits rückgängig gemacht wurden und man diese jetzt doch wieder will.
Resets verändern die Historie des Repository. Deshalb dürfen solche Änderungen nicht gemacht werden, wenn die Änderungen bereits zu einem Remoteserver gepusht wurden.
Stattdessen muss dann git revert $HASH_COMMIT verwendet werden. Dadurch wird ein neuer Commit erzeugt, der die Änderung rückgängig macht.
Remoteserver hinzufügen
git remote add origin $URL
Änderungen zum Server senden
git push
Änderungen vom Server holen und anwenden
git pull
Tags
Mit Hilfe von Tags können einzelnen Commits mit einem Tag markiert werden, wodurch u.a. das Auffinden erleichtert wird. Ein Tag kann z.B. der Zeitpunkt für eine Versionsnummer sein.
Tag erstellen
git tag -a $TAG_NAME -m "$NACHRICHT" $HASH_COMMIT
$HASH_COMMIT ist optional, um den Tag auf einen alten Commit anzuwenden. Wird dieser nicht angegeben, dann gilt der Tag für den letzten gemachten Commit.
Tags auflisten
git tag
Commit zu bestimmten Tag anzeigen
git show $TAG_NAME
Rebase
git rebase $SOURCE_BRANCH
Nehmen wir an es gibt zwei Branches, einen v1 und einen v2 Branch. Ein Bug soll korrigiert werden, den es schon in v1 gab und der nun in beiden Branches korrigiert werden muss. D.h. die normale Vorgehensweise ist, diesen in v1 zu korrigieren und nach v2 zu mergen.
Dadurch hat v2 einen zusätzlichen Commit mit den Änderungen aus v1. Eine Alternative dazu stellt rebasing dar. Hiermit können wir so tun, als ob der v2 erst erstellt wurde, nachdem die Korrektur in v1 gemacht wurde.
Wichtiger Zusatz: rebasing von Änderungen, die bereits an einen Remoteserver publiziert wurden, sollten vermieden werden 😉.
Interaktives Rebasing
git rebase -i HEAD~5
Beim interaktiven Rebasing öffnet sich der Standard git-Editor, mit dem ich entscheiden kann, was in meinem Fall mit den letzten 5 Commits gemacht werden kann. Damit habe ich z.B. die Möglichkeit einen bestimmten Commit zu löschen oder mehrere Commits in einen Commit zusammenzuführen.