git Cheatsheet
Einrichten · Repository anlegen · Lokale Änderungen · Committen · Dateien verschieben und entfernen · Historie · Branches · Tags · Remote · Merge und Rebase · Stash · Rückgängig machen · Suchen · Ignorieren · Aliases · git flow · Gute Praxis · Quellen
Einrichten
| Befehl | Wirkung |
|---|---|
git config --global user.name "Vorname Nachname" |
Name für alle Commits festlegen |
git config --global user.email "mail@example.com" |
E-Mail für alle Commits festlegen |
git config --global core.editor vi |
Editor für Commit-Nachrichten |
git config --global merge.tool meld |
Werkzeug für Merge-Konflikte |
git config --global color.ui auto |
Farbige Ausgabe im Terminal |
git config --list |
Alle wirksamen Einstellungen anzeigen |
git config --global --list |
Nur die Einstellungen des Benutzers (~/.gitconfig) |
git config --local --list |
Nur die Einstellungen des Repositorys (.git/config) |
git config --system --list |
Nur die systemweiten Einstellungen |
git help <befehl> |
Hilfe zu einem Befehl |
Repository anlegen
Repository anlegen
| Befehl | Wirkung |
|---|---|
git init |
Aktuelles Verzeichnis zum Repository machen |
git init <verzeichnis> |
Neues Verzeichnis als Repository anlegen |
git clone <url> |
Bestehendes Repository kopieren, per https:// oder ssh:// |
Lokale Änderungen
Lokale Änderungen
| Befehl | Wirkung |
|---|---|
git status |
Geänderte, neue und vorgemerkte Dateien |
git diff |
Änderungen, die noch nicht vorgemerkt sind |
git diff <datei> |
Dasselbe für eine Datei |
git diff --staged |
Vorgemerkte Änderungen, also der nächste Commit |
git add <datei> |
Datei für den nächsten Commit vormerken |
git add . |
Alle Änderungen im Verzeichnis vormerken |
git add -p <datei> |
Änderungen stückweise auswählen und vormerken |
git reset <datei> |
Datei aus der Vormerkung nehmen, Änderung bleibt erhalten |
Committen
| Befehl | Wirkung |
|---|---|
git commit |
Vorgemerkte Änderungen committen, Nachricht im Editor |
git commit -m "Nachricht" |
Dasselbe mit Nachricht direkt |
git commit -a |
Alle Änderungen an bekannten Dateien ohne add committen |
git commit -am "Nachricht" |
-a und -m kombiniert |
git commit --amend |
Letzten Commit ändern (Nachricht oder Inhalt) |
git commit --amend --no-edit |
Vorgemerktes in den letzten Commit, Nachricht bleibt |
git commit --amend --date="<datum>" |
Datum des letzten Commits ändern |
Bereits veröffentlichte Commits nicht mehr mit --amend ändern: Andere haben sie schon.
Dateien verschieben und entfernen
Dateien verschieben und entfernen
| Befehl | Wirkung |
|---|---|
git mv <alt> <neu> |
Datei umbenennen oder verschieben und vormerken |
git rm <datei> |
Datei löschen und das Löschen vormerken |
git rm --cached <datei> |
Datei aus git entfernen, auf der Platte behalten |
Historie
| Befehl | Wirkung |
|---|---|
git log |
Alle Commits, neueste zuerst |
git log --oneline |
Ein Commit pro Zeile |
git log -p <datei> |
Änderungen an einer Datei über alle Commits |
git log --follow <datei> |
Historie einer Datei, auch über Umbenennungen hinweg |
git log --author="name" |
Nur Commits einer Person |
git log main..feature |
Commits in feature, die in main fehlen |
git log --oneline <a>..<b> --left-right |
Unterschiede zweier Branches mit Richtungspfeilen |
git diff <branch1>...<branch2> |
Inhaltlicher Unterschied zweier Branches |
git show <commit> |
Inhalt und Metadaten eines Commits |
git blame <datei> |
Wer hat welche Zeile wann geändert |
git reflog |
Jede Bewegung von HEAD, auch verworfene Commits |
Branches
| Befehl | Wirkung |
|---|---|
git branch |
Lokale Branches auflisten |
git branch -r |
Remote-Branches auflisten |
git branch -av |
Alle Branches mit letztem Commit |
git branch --merged |
Branches, die schon gemergt sind |
git branch <name> |
Neuen Branch anlegen, ohne zu wechseln |
git switch <name> |
Zu einem Branch wechseln (älter: git checkout <name>) |
git switch -c <name> |
Neuen Branch anlegen und wechseln (älter: git checkout -b) |
git switch - |
Zurück zum vorherigen Branch |
git checkout -b <neu> <basis> |
Neuen Branch auf Basis eines anderen anlegen |
git checkout <commit> -b <neu> |
Neuen Branch ab einem bestimmten Commit |
git checkout --track <remote>/<branch> |
Lokalen Branch anlegen, der einem Remote-Branch folgt |
git branch -m <neuer-name> |
Aktuellen Branch umbenennen |
git branch -d <name> |
Gemergten Branch löschen |
git branch -D <name> |
Branch löschen, auch wenn nicht gemergt |
Tags
| Befehl | Wirkung |
|---|---|
git tag |
Tags auflisten |
git tag -n |
Tags mit Nachricht auflisten |
git tag <name> |
Einfachen Tag auf den aktuellen Commit setzen |
git tag -a <name> -m "Nachricht" |
Annotierten Tag mit Nachricht setzen |
git push --tags |
Alle Tags veröffentlichen |
Remote
| Befehl | Wirkung |
|---|---|
git remote -v |
Alle Remotes mit URL |
git remote show <remote> |
Details zu einem Remote |
git remote add <name> <url> |
Remote hinzufügen |
git remote rename <alt> <neu> |
Remote umbenennen |
git remote rm <name> |
Remote entfernen |
git fetch <remote> |
Änderungen holen, aber nicht einarbeiten |
git pull |
Holen und in den aktuellen Branch mergen |
git pull --rebase <remote> <branch> |
Holen und eigene Commits obendrauf setzen |
git push <remote> <branch> |
Lokale Commits hochladen |
git push <remote> --delete <branch> |
Branch auf dem Remote löschen |
git branch -dr <remote>/<branch> |
Nur die lokale Kopie eines Remote-Branches löschen |
Merge und Rebase
Merge und Rebase
| Befehl | Wirkung |
|---|---|
git merge <branch> |
<branch> in den aktuellen Branch mergen |
git rebase <branch> |
Eigene Commits auf <branch> neu aufsetzen |
git rebase -i <commit> |
Commits nach <commit> umordnen, zusammenfassen oder umschreiben |
git rebase --continue |
Nach gelöstem Konflikt weitermachen |
git rebase --abort |
Rebase abbrechen, alter Stand ist wieder da |
git mergetool |
Konflikte im eingestellten Werkzeug lösen |
git cherry-pick <commit> |
Einzelnen Commit in den aktuellen Branch übernehmen |
Einen gelösten Konflikt markierst Du mit git add <datei>. Commits, die schon veröffentlicht sind, nicht rebasen.
Stash
| Befehl | Wirkung |
|---|---|
git stash |
Unfertige Änderungen beiseitelegen |
git stash push -m "Nachricht" |
Dasselbe mit Beschreibung (älter: git stash save) |
git stash list |
Alle Stashes anzeigen |
git stash show stash@{0} |
Inhalt eines Stashes |
git stash pop |
Neuesten Stash zurückholen und entfernen |
git stash apply stash@{n} |
Stash zurückholen, aber behalten |
git stash drop stash@{n} |
Stash löschen (ohne Angabe: den neuesten) |
git stash clear |
Alle Stashes löschen |
git stash branch <name> stash@{0} |
Neuen Branch aus einem Stash anlegen |
Rückgängig machen
Rückgängig machen
| Befehl | Wirkung |
|---|---|
git restore <datei> |
Ungespeicherte Änderungen einer Datei verwerfen (älter: git checkout HEAD <datei>) |
git checkout <branch> -- <datei> |
Datei im Stand eines anderen Branches holen |
git reset --hard HEAD |
Alle lokalen Änderungen verwerfen |
git revert <commit> |
Neuer Commit, der <commit> aufhebt, Historie bleibt |
git reset <commit> |
HEAD zurücksetzen, Änderungen bleiben als ungespeichert erhalten |
git reset --keep <commit> |
HEAD zurücksetzen, nicht committete Änderungen bleiben |
git reset --hard <commit> |
HEAD zurücksetzen, alles danach verwerfen |
git reset --hard <remote>/<branch> |
Lokalen Branch exakt auf den Remote-Stand setzen |
reset --hard löscht Arbeit endgültig. Was nur committet war, findet sich meist noch über git reflog.
Suchen
| Befehl | Wirkung |
|---|---|
git grep "text" |
Text in allen Dateien suchen |
git grep "text" v2.5 |
Text in einer bestimmten Version suchen |
git log -S "text" |
Commits finden, die text hinzufügen oder entfernen |
git log -S "muster" --pickaxe-regex |
Dasselbe mit regulärem Ausdruck |
Ignorieren
| Befehl | Wirkung |
|---|---|
git ls-files --others --ignored --exclude-standard |
Alle ignorierten Dateien anzeigen |
git rm -r --cached . |
Alles aus dem Index nehmen, danach git add .: neue .gitignore greift auch für schon verfolgte Dateien |
Aliases
| Befehl | Kurzform danach |
|---|---|
git config --global alias.st status |
git st |
git config --global alias.co checkout |
git co |
git config --global alias.br branch |
git br |
git config --global alias.ci commit |
git ci |
git config --global alias.unstage 'reset HEAD --' |
git unstage <datei> |
git config --global alias.last 'log -1 HEAD' |
git last |
git flow
git flow ist eine Erweiterung für einen festen Branch-Ablauf mit develop, Feature-, Release- und Hotfix-Branches.
| Befehl | Wirkung |
|---|---|
git flow init |
Im Repository einrichten (-d übernimmt die Vorgaben) |
git flow feature start <name> |
Feature-Branch von develop anlegen |
git flow feature finish <name> |
Feature in develop mergen und Branch löschen |
git flow feature publish <name> |
Feature auf den Remote hochladen |
git flow feature track <name> |
Veröffentlichtes Feature lokal verfolgen |
git flow release start <version> |
Release-Branch von develop anlegen |
git flow release publish <version> |
Release hochladen |
git flow release finish <version> |
Release in main und develop mergen und taggen |
git flow hotfix start <version> |
Hotfix-Branch von main anlegen |
git flow hotfix finish <version> |
Hotfix in main und develop mergen und taggen |
Gute Praxis
- Ein Thema pro Commit. Zwei Bugfixes sind zwei Commits. Mit
git add -plassen sich Teile einer Datei getrennt committen. - Oft committen. Kleine Commits lassen sich leichter verstehen, prüfen und zurücknehmen.
- Nichts Halbfertiges committen. Für einen sauberen Stand vor dem Branch-Wechsel ist
git stashda. - Vor dem Commit testen. Erst recht, bevor andere die Änderung bekommen.
- Gute Nachrichten schreiben. Erste Zeile höchstens 50 Zeichen im Imperativ („Fix login“), dann eine Leerzeile, dann warum und was sich ändert.
- git ist kein Backup. Commits fassen zusammengehörige Änderungen zusammen, keine zufälligen Dateistände.
- Branches nutzen. Für Features, Bugfixes und Experimente.
- Ein Ablauf fürs Team. Merge oder Rebase, git flow oder nicht: Hauptsache, alle machen es gleich.