Git verwaltet Dateien
in einem sogenannten Depot
unterhalb des Verzeichnisses .git
.
Das Projektverzeichnis selbst enthält nur die Dateien des
aktuell ausgecheckten Zweigs, die sogenannte Arbeitskopie.
Wechselt man auf einen anderen Zweig, tauscht Git diese
Dateien aus.
Der
Kopf (head) von jedem
Zweig (branch) zeigt auf den neuesten
Stand (commit) und dieser wiederum
in einer einfach verketteten Liste auf seinen Vorgänger.
Zu jedem dieser Knoten gehört ein
Baum (tree), der auf eine Menge von
Blob-Objekten verweist,
welche letztendlich die Text- oder Binärdaten des Projekts enthalten.
Jedes dieser durch eine Prüfsumme identifizierbaren Objekte kann durch ein
Etikett (tag)
einen menschenlesbaren Namen kommen. Der
Index ist ein spezieller Baum,
der die Änderungen in der Arbeitskopie aufnimmt und beim
commit
an das entsprechende Objekt angehängt wird.
Jeder Programmierer sollte zuerst einmal Vor- und Nachname
sowie seine Elektropost-Adresse hinterlegen. Diese und alle
weiteren Einstellungen werden in ~/.gitconfig
gespeichert.
git config --global user.name "DisplayName" git config --global user.email "User@Host" git config --global alias.show-graph \ 'log --graph --abbrev-commit --pretty=oneline' git config --list
Um den Überblick zu behalten, kann man den aktuellen Zweig im Prompt anzeigen.
~/.bashrc… export GIT_PS1_SHOWDIRTYSTATE=1 . /usr/lib/git-core/git-sh-prompt PS1='$? \u@\h:\w$(__git_ps1)\$ '
Um ein neues Projekt zu starten, legen wir einfach ein
neues Verzeichnis an und rufen dort git init
auf.
Dieses Kommando erzeugt lediglich das versteckte Verzeichnis
.git
mit der entsprechenden Unterstruktur.
mkdir Project cd Project git init
Beim Bauen von Programmen entstehen oft Artefakte (zum Beispiel Objektdateien beim Übersetzen von C-Programmen), die man nicht verwalten möchte.
.gitignore*.o
Die in der Arbeitskopie bereits vorhandenen oder neu
angelegten Dateien und Verzeichnisse werden nicht automatisch
verwaltet. Man muss diese mit den Kommandos
add
im Index vormerken. Gibt man ein Verzeichnis an,
werden rekursiv alle dort befindlichen Dateien hinzugefügt.
git add Path
Geänderte Dateien anzeigen, die noch nicht vorgemerkt wurden:
git status
Schließlich tragen wir die im Index vorgemerkten Änderungen ein und versehen diesen Eintrag mit einer Nachricht, die den Zweck der Änderung beschreibt.
git commit -m "Message"
Manchmal möchte man eine bestimmte Änderung zurücknehmen.
Ein revert
erzeugt einen neuen Stand, der eine
oder mehrere zurückliegende Änderungen rückgängig macht.
git revert Commit
In seltenen Fällen möchte man den Zweig auf einen alten Stand zurücksetzen und alle nachfolgenden Änderungen unwiderruflich löschen.
git reset Commit
Um bei der Entwicklung von neuen Funktionen oder bei größeren Umbauarbeiten keine anderen Entwickler zu stören, spaltet man für solche Vorhaben einen neuen Zweig ab.
git branch feature/a git checkout feature/a … git commit
Damit sich dieser Zweig nicht allzu weit vom Master entfernt,
sollte man die Änderungen gelegnetlich nachvollziehen.
Nach einem erfolgreichen rebase
sieht es so aus,
als entspränge der Zweig dem aktuellen Stand des Masters.
git rebase master
Sobald die Entwicklung fertig gestellt ist, führt man die
Änderungen im Master zusammen. Das Ergebnis eines
merge
ist ein neuer Stand, der alle Änderungen
im Zweig enthält.
git checkout master git merge feature/a
Bei gravierenden Änderungen, zum Beispiel wenn man einen Meilenstein erreicht hat, sollte man diesen Stand etikettieren.
git tag Version [-m Message]
Bisherige Änderungen auflisten:
git log [-n Count]
Details eines bestimmten Änderung anzeigen:
git show Commit
Änderungen einzelner oder aller Dateien in der Arbeitskopie zum letzten Stand anzeigen:
git diff [Path]
Änderungen zwischen zwei Ständen anzeigen:
git diff Commit Commit
Änderungen graphisch ansehen:
git difftool --dir-diff --tool=meld
Depot von einem Server (zum Beispiel
GitHub,
GitLab oder
Gitea)
in ein neues Unterverzeichnis auf dem Arbeitsrechner holen. Die
URL
des Servers wird in .git/config
unter dem Namen
origin
gespeichert.
git clone git://Host:User/Project
Weitere Server hinzufügen, ändern und entfernen:
git remote add Server Url git remote rename Server NewServer git remote rm Server
Änderungen vom Server ins eigene Depot holen.
Ein pull
ist die Kombination aus
fetch
(holt Änderungen vom Server) gefolgt von
merge
(verschmilzt die Änderungen mit der Arbeitskopie).
git pull [-u Server]
Änderungen aus dem eigenen Depot zum Server hochladen
git push [-u Server]
Diese Auflistung soll nur einen Überblick über die
verfügbaren Kommandos und Optionen vermitteln
und erhebt keinen Anspruch auf Vollständigkeit.
Als authoritative Quelle gelten nur die Manpages und
die offizielle Dokumentation. Alle Optionen werden in
git(1)
ausführlich beschrieben.
Beg..End
) oder Anzahl (~Count
)origin
Kommando | Operand | Beschreibung | |
---|---|---|---|
git | help | [Command] | Hilfe anzeigen |
Depot | |||
init | Neues Depot erstellen | ||
config | Key=Value | Option anzeigen und setzen | |
Suche | |||
log | Commit | Historie der Meldungen ausgeben | |
show | [Object] | Details anzeigen | |
grep | Regex [Path] | Muster in Arbeitskopie suchen | |
bisect | Binärsuche beginnen | ||
Stand | |||
status | [Path] | Vorgemerkte und geänderte Dateien anzeigen | |
add | Path … | Neue oder geänderte Datei im Index vormerken | |
mv | Path Path | Datei umbenennen | |
rm | Path … | Datei löschen | |
commit | Vorgemerkte Dateien ins Depot übertragen | ||
tag | Version [Commit] | Stand etikettieren | |
Zweig | |||
branch | [Branch] | Zweige auflisten oder Neuen erzeugen | |
checkout | Branch | Arbeitskopie auf diesen Stand bringen | |
diff | [Commit …] [Path] | Unterschiede zwischen zwei Ständen anzeigen | |
merge | Commit | Änderungen aus Zweig als neuen Commit in den Master holen | |
rebase | Branch | Commits aus Master nachholen und so Abzweigungspunkt verschieben | |
Server | |||
clone | Url [Path] | Depot von einem Server herunterladen | |
remote | Server [Url] | Server mit URL assoziieren | |
fetch | [Server] | Änderungen vom Server holen | |
pull | [Server] | Dito, und Arbeitskopie aktualisieren | |
push | [Server] | Änderungen zum Server hochladen |
--system | Systemweite Einstellungen aus /etc/gitconfig |
--global | Benutzerspezifische Einstellungen aus ~/.gitconfig |
--local | Depotspezifische Einstellungen aus .git/config |
-l | Alle Variablen auflisten |
-Number | Anzahl der Meldungen limitieren |
--since=Date | Zeitraum von |
--unitl=Date | Zeitraum bis |
--unitl=Date | Zeitraum bis |
--pretty=oneline|short|medium|full|fuller|email|raw | Ausgabe hübsch formatieren |
--pretty=oneline|short|medium|full|fuller|email|raw | Ausgabe hübsch formatieren |
-i | Groß-/Kleinschreibung ignorieren |
-w | Ganze Wörter suchen |
-e Regex | Weiteren Ausdruck verodern |
start | Binärsuche beginnen |
bad [Commit] | Version als fehlerhaft markieren |
good [Commit] | Version als korrekt markieren |
reset | Binärsuche beenden |
--interactive | Modifizierte Dateien einzeln beurteilen |
-r | Verzeichnis rekursiv löschen |
-m Message | Zweck der Änderung beschreiben |
-d Branch | Zweig löschen |
-m [OldBranch] NewBranch | Zweig umbenennen |
-c [OldBranch] NewBranch | Zweig kopieren |
-f | Lokale Änderungen verwefen |
-b NewBranch | Neuen Zweig erzeugen |
--patch | Patch erzeugen |
--summary | Überblick anzeigen |
--minimal | Teuren Algorithmus verwenden |
-m Message | Zweck beschreiben |
--abort | Verschmelzung abbrechen |
--continue | Verschmelzung fortführen |
--continue | Konflikte behoben, Verschmelzung fortführen |
--skip | Aktuellen Stand überspringen |
--abort | Alles rückgängig machen und abbrechen |
--quit | Verschmelzung halbfertig beenden |
--list | Etiketten auflisten |
--sign | Etikette signieren |
--verify | Signatur verifizieren |
--delete Tag | Etikett löschen |
--local | Lokales Depot einfach kopieren |
--bare | Depot ohne Arbeitskopie anlegen |
--mirror | Depot spiegeln |
--origin Server | Alternativen Namen verwenden (statt origin ) |
--branch | Anderen Branch auswählen (statt master ) |
add Server Url | Weiteren Server hinzufügen |
mv Server NewServer | Server anders benennen |
rm Server | Server entfernen |
prune [Server] | Obsolete Zweige löschen |
--all | Alle Zweige aktualisieren |
--prune | Obsolete Zweige löschen |
--tags | Tags holen |
--all | Alle Zweige aktualisieren |
--all | Alle Zweige hochladen |
--prune | Obsolete Zweige löschen |
--tags | Tags hochladen |