Git Rundumschlag

13. April 2019

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.