git: Vorbereiten und Erzeugen von Commits

Mittels eines Commits werden Änderungen an einer oder mehrerer Dateien in das (lokale) Repository übertragen. Ein Commit referenziert dabei immer den Zustand aller verwalteter Dateien zum Zeitpunkt des Commits; im Repository sind demnach die verschiedenen Zustände jeder Datei eines Projekts über die Zeit hinweg konserviert.

Der Befehl git status gibt Auskunft über den Zustand des Working Trees, wie, dass es Änderungen gibt, die noch nicht im Index sind, oder aber, dass diese bereits für einen Commit vorgemerkt wurden.

Einen Commit zu erzeugen ist einfach:

$ git commit [-m <nachricht>]

Wird keine Nachricht über die Kommandozeile übergeben, wird ein Editor geöffnet, der als Kommentar Auskunft über den zu machenden Commit gibt. Zeilen, die kein Kommentar sind, werden als Commit-Nachricht gewertet; wurde eine Nachricht verfasst, wird nach dem Beenden des Editors der Commit gemacht – andernfalls wird er abgebrochen.

Commits vorbereiten

Bevor jedoch ein Commit erzeugt werden kann, müssen zunächst die Änderungen ausgewählt werden, die dort hineinfließen sollen. Git hat dafür eine, als Index bezeichnete, Zwischenstufe zwischen dem Arbeitsverzeichnis – auch Working Tree genannt – und dem Repository.

[ Working Tree ] → [ Index ] → [ Repository ]

Aufgrund der Existenz dieser Zwischenebene zeigt ein einfaches git diff die Unterschiede zwischen Index und Working Tree, während git diff --staged die Unterschiede zwischen Index und Repository zeigt.

Der Index dient dem Vorbereiten von Commits. Um eine neue Datei hinzuzufügen oder alle Änderungen an einer Datei zu übernehmen, wird folgender Befehl ohne weitere Parameter als den Namen der Datei verwendet:

$ git add <datei>
Der Index ermöglicht es aber auch, nur bestimmte Änderungen einer Datei einem Commit hinzuzufügen. Dafür kennt das Kommando die Option --patch (-p), das einen interaktiven Modus startet, in dem einzeln für lose zusammenhängende Zeilen (Hunks) entschieden werden kann, wie damit verfahren werden soll.
$ git add --patch
...
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?
Wählt man das Fragezeichen als Antwort wird einem angezeigt was die anderen Antworten zu bedeuten haben. Dazu gehört unter anderem auch, einen Hunk in kleinere Hunks aufzuspalten, falls dies nötig sein sollte.

Um dem Index hinzugefügte Änderungen wieder daraus zu entfernen, kennt git das Kommando reset. Genau wie add kann auch hier die Option -p verwendet werden, um Änderungen Hunk-weise zu verwalten.

$ git reset [-p]

Letzten Commit verbessern

Manchmal kommt es vor, dass man Änderungen vergisst, die auch noch zu einem Commit dazugehört hätten. In diesem Fall kann man sie wie gewohnt dem Index hinzufügen und anschließend mit der Option --amend commiten. Hierbei kann auch die Commit-Nachricht geändert werden.

git commit --amend

Commit ansehen

Auch um einen einzelnen Commit zu untersuchen kennt git ein eigenes Kommando:

$ git show [<referenz>]
Das Kommando zeigt die ID, den Autor, den Zeitpunkt, die Beschreibung und die Änderungen des Commits an. Wird kein weiterer Parameter übergeben, wird der aktuelle HEAD als Referenz verwendet, also der letzte Commit des aktuellen Branches. Möglich sind aber auch ein Branch-Name oder eine Commit-ID (SHA1-Prüfsumme).

Geschrieben von Annika Stahlberg in git am um 14:16 | Kommentare (0) | Trackbacks (0) read on

Konfiguration von git

Konfigurationen gelten entweder für das aktuelle Repository (lokal), für den aktuellen System-Benutzer (global), oder sogar für das ganze System – die Reihenfolge entspricht auch der Priorität beim Einlesen durch git; kann git lokal keinen Wert für eine Option finden, wird in der globalen Konfiguration und danach in der der Systemebene nachgesehen. Letzteres erfordert jedoch root-Rechte und ist eher ungewöhnlich.

[ Lokal ] → [ Global ] → [ System ]

Für das Setzen von Konfigurationen hat git ein eigenes Kommando:

$ git config <option> <wert>
Ohne weitere Optionen (oder mit der Option --local) gilt die Konfiguration für das aktuelle Repository und wird in /pfad/zu/repository/.git/config gespeichert. Die Option --global setzt eine globale Konfiguration in /pfad/zu/repository/.git/config, analog dazu setzt --system diese systemweit in /etc/gitconfig.
Um sich die gesetzten Konfigurationen anzeigen zu lassen, gibt es die Kommando-Option --list.

Eine wichtige Konfiguration sind der Name und die E-Mail-Adresse des git-Benutzers, die man in der Regel global setzt und nur für einzelne Repositories lokal überschreibt.

$ git config --global user.name 'Annika Stahlberg'
$ git config --global user.email stahlberg@devdesk.de

Aliase

Für git-Kommandos (inklusive Optionen) können Aliases gesetzt werden. Die Syntax hierfür lautet:

$ git config alias.<alias-name> <alias>
Ist einem beispielsweise der Befehl git checkout zu lang und man möchte stattdessen immer nur git co tippen, setzt man hierfür einen Alias.
$ git config --global alias.co checkout

Weiterführende Lektüre

Geschrieben von Annika Stahlberg in git am um 13:06 | Kommentare (0) | Trackbacks (0) read on

Aktuelle Einträge

Categories