zur Startseite

Druckausgabe von https://privat.albicker.org
Iveco Daily 4x4, Hunde und multithematisches Blog - Bernhard Albicker

git für Nicht-Programmierer - Teil 2 - Dateien in der Versionskontrolle

veröffentlicht am 12.11.2017

Auf Basis des Grundlagenartikels mit einer Erklärung des Programmes git und den Aufgaben und Möglichkeiten, die eine Versionsverwaltung bietet, ging es im Teil 1 dieser Serie um die Installation und Einrichtung von git. Heute geht es um die Erläuterung der wesentlichen Arbeitsschritte bei der Nutzung von git.

git benutzen

Das Nutzungsszenario

Ich gehe im Rahmen dieses Teils des Tutorials von einem Entwickler oder Autor aus, der Schritt für Schritt einzelne Teilaufgaben eines Projekts abarbeitet - und das nur lokal auf seinem eigenen Rechner:

Struktur von git

Der Einfachheit halber stammen alle Beispiele aus der Erstellung dieses Tutorials im Rahmen meiner Hugo-Webseite.

Arbeit mit und an Dateien

Ein File verändern

Im Teil 1 dieser Serie haben wir ein bestehendes Projekt mittels git init der Versionskontrolle unterworfen. Was bedeutet das?

git verfolgt von nun an, ob im Arbeitsverzeichnis bestehende Files verändert oder gelöscht werden. Wird z. B. dieser Artikel 2017-11-12-start-mit-git-teil2.md erweitert und abgespeichert, so meldet der Befehl git status:

~/Webseiten/homepage $ git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

	geändert:       content/blog/2017-11-12-start-mit-git-teil2.md

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

Das bedeutet: Die Datei wurde geändert. Wenn ich diesen (Zwischen)Zustand sichern will, dann muß ich diesen

  1. in den Index (Staging Area) melden
  2. danach in das lokale Repository übertragen

Schritt 1

geschieht mittels git add:

~/Webseiten/homepage $ git add content/blog/2017-11-12-start-mit-git-teil2.md

mit dem Ergebnis:

~/Webseiten/homepage $ git status
Auf Branch master
zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)

	geändert:       content/blog/2017-11-12-start-mit-git-teil2.md

Rückgängig machen ließe sich dieser Schritt, wie in der Terminal-Ausgabe beschrieben, mittels:

~/Webseiten/homepage $ git reset HEAD content/blog/2017-11-12-start-mit-git-teil2.md
Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:
M	content/blog/2017-11-12-start-mit-git-teil2.md

und wieder zur Kontrolle:

~/Webseiten/homepage $ git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

	geändert:       content/blog/2017-11-12-start-mit-git-teil2.md

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

Schritt 2

wird nach der Ausführung von git add mittels git commit durchgeführt:

~/Webseiten/homepage $ git commit -m 'git Tutorial Teil 2 erstellt'
[master d34fcc5] git Tutorial Teil 2 erstellt
 1 file changed, 75 insertions(+), 3 deletions(-)

Die Option -m ermöglicht es, dem so im Repository gespeicherten Zwischenstand eine Beschreibung mitzugeben, anhand derer die Arbeitsschritte im Repository wieder gefunden werden können.
Die Terminal-Antwort nennt die ID und Beschreibung des Commits sowie eine Zusammenfassung, hier: in 1 geänderten File wurden 75 Ergänzungen und 3 Löschungen vorgenommen.

Eine Liste dieser gespeicherten Arbeitsschritte (= commits) erhält man mittels git log:

~/Webseiten/homepage $ git log
commit d34fcc576d630a51e084f756f3485ffa1052ce87
Author: {benutzername} <mail@domain.tld>
Date:   Sun Nov 12 14:32:14 2017 +0100

    git Tutorial Teil 2 erstellt

commit e41d68aeedc513994b0b72bfabcb0ae87a7c3970
Author: {benutzername} <mail@domain.tld>
Date:   Sat Nov 4 11:53:16 2017 +0100

    neue Artikel und Kommentare

commit bb3db0fc5bebeb7487496fd356b7174c14e5ae0e
Author: {benutzername} <mail@domain.tld>
Date:   Thu Mar 23 18:02:04 2017 +0100

    sitemap.xml angepaßt auf echte Seiten

Dabei fällt auf, daß die nacheinander gespeicherten Commits als “Namen” 40-stellige - zufällig aussehende - Codes tragen, sog. “Hashes”. Alle Commits in Git werden nach ihrer SHA-1-Summe benannt (Commit-ID), die aus dem Inhalt und den Metadaten des Commits errechnet wird. Es ist sozusagen eine inhaltsabhängige Versionsnummer.
Für den Umgang mit Commits reicht i. A. die Angabe der ersten 7 Stellen des Hash des jeweiligen Commits.

Files erstellen / umbenennen / löschen

Neues File

Die zu überwachenden Files müssen git natürlich bekannt sein. Wird ein neues File erstellt, im Beispiel ein dritter Teil dieses Tutorials 2017-11-12-start-mit-git-teil3.md, dann liefert ein git status folgendes Ergebnis:

~/Webseiten/homepage $ git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

Unversionierte Dateien:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)

	content/blog/2017-11-12-start-mit-git-teil3.md

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

git merkt also, daß da eine Datei hinzugekommen ist. Im Weiteren kann also mit dieser Datei genauso umgegangen werden wie für modifizierte Dateien im vorigen Abschnitt gezeigt, z. B. Vormerken für einen Commit:

~/Webseiten/homepage $ git add content/blog/2017-11-12-start-mit-git-teil3.md
~/Webseiten/homepage $ git status
Auf Branch master
zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)

	neue Datei:     content/blog/2017-11-12-start-mit-git-teil3.md

etc.

Datei umbenennen

Ein File innerhalb git umzubenennen oder an einen anderen Speicherort zu verschieben - beides wird mit dem Befehl git mv erledigt:

~/Webseiten/homepage $ git mv content/blog/2017-11-12-start-mit-git-teil3.md content/blog/2017-11-12-start-mit-git-teil3.txt
~/Webseiten/homepage $ git status
Auf Branch master
zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)

	neue Datei:     content/blog/2017-11-12-start-mit-git-teil3.txt

Die bereits im letzten Schritt vorgemerkte Datei wird umbenannt und bleibt vorgemerkt für den nächsten Commit.

Datei löschen

Der Befehl git rm löscht das File aus dem Index, also der Versionskontrolle, aber auch vom Datenträger.

~/Webseiten/homepage $ git rm -f content/blog/2017-11-12-start-mit-git-teil3.txt
rm 'content/blog/2017-11-12-start-mit-git-teil3.txt'
~/Webseiten/homepage $ git status
Auf Branch master
nichts zu committen, Arbeitsverzeichnis unverändert

Die zusätzliche Option -f (git rm -f) wird benötigt, wenn die Datei gegenüber dem gesicherten Stand im Repository geändert ist und mittels git add für den nächsten Commit vorgemerkt ist, sie erzwingt das Löschen in diesem Fall.

Soll die Datei im Arbeitsverzeichnis erhalten bleiben, dann verwende man git rm --cached.

~/Webseiten/homepage $ git rm --cached content/blog/2017-11-12-start-mit-git-teil3.txt
rm 'content/blog/2017-11-12-start-mit-git-teil3.txt'
~/Webseiten/homepage $ git status
Auf Branch master
Unversionierte Dateien:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)

	content/blog/2017-11-12-start-mit-git-teil3.txt

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

In diesem Fall bleibt die Datei selbst als ‘unversioniert’ auf dem Datenträger zurück.

Mehrere Dateien

Bisher haben wir jeweils nur eine Datei hinzugefügt, geändert oder gelöscht. In der täglichen Arbeit werden bei der Erledigung eines Arbeitspakets aber meist mehrere Dateien “angefaßt”. Um alles “auf einen Rutsch” in den Index und später in den nächsten Commit übernehmen zu können, verfügt git add über die Option -A: Änderungen von allen versionierten und unversionierten Dateien hinzufügen:
Ausgangssituation:

~/Webseiten/homepage $ git status
Auf Branch master
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git checkout -- <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)

	geändert:       content/blog/2017-11-12-start-mit-git-teil2.md
	geändert:       themes/albicker/static/css/schrift.css

Unversionierte Dateien:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)

	content/blog/2017-11-12-start-mit-git-teil3.md

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

Wir haben zwei geänderte und eine neue (unversionierte) Dateien. Mittels git add -A werden diese auf einmal dem Index (Staging Area) hinzugefügt:

~/Webseiten/homepage $ git add -A
~/Webseiten/homepage $ git status
Auf Branch master
zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)

	geändert:       content/blog/2017-11-12-start-mit-git-teil2.md
	neue Datei:     content/blog/2017-11-12-start-mit-git-teil3.md
	geändert:       themes/albicker/static/css/schrift.css

und können dann in einem Commit gesichert werden:

~/Webseiten/homepage $ git commit -m 'Demo-Commit fuer Tutorial'
[master 4b0da1b] Demo-Commit fuer Tutorial
 3 files changed, 240 insertions(+), 123 deletions(-)
 create mode 100644 content/blog/2017-11-12-start-mit-git-teil3.md

Schlußhinweis

Wie die meisten anderen Kommandozeilenwerkzeuge verfügen auch git add und git commit über eine große Anzahl von zusätzlichrn Optionen, die über die Hilfefunktion aufgelistet werden können:

~/Webseiten/homepage $ git add -h
Verwendung: git add [<Optionen>] [--] <Pfadspezifikation>...

    -n, --dry-run         Probelauf
    -v, --verbose         erweiterte Ausgaben

    -i, --interactive     interaktives Auswählen
    -p, --patch           Blöcke interaktiv auswählen
    -e, --edit            aktuelle Unterschiede editieren und anwenden
    -f, --force           das Hinzufügen andernfalls ignorierter Dateien erlauben
    -u, --update          versionierte Dateien aktualisieren
    -N, --intent-to-add   nur speichern, dass der Pfad später hinzugefügt werden soll
    -A, --all             Änderungen von allen versionierten und unversionierten Dateien hinzufügen
    --ignore-removal      gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)
    --refresh             nichts hinzufügen, nur den Index aktualisieren
    --ignore-errors       Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden konnten
    --ignore-missing      prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden

bzw.

~/Webseiten/homepage $ git commit -h
Verwendung: git commit [<Optionen>] [--] <Pfadspezifikation>...

    -q, --quiet           Zusammenfassung nach erfolgreichem Commit unterdrücken
    -v, --verbose         Unterschiede in Commit-Beschreibungsvorlage anzeigen

Optionen für Commit-Beschreibung
    -F, --file <Datei>    Beschreibung von Datei lesen
    --author <Autor>      Autor eines Commits überschreiben
    --date <Datum>        Datum eines Commits überschreiben
    -m, --message <Beschreibung>
                          Commit-Beschreibung
    -c, --reedit-message <Commit>
                          Beschreibung des angegebenen Commits wiederverwenden und editieren
    -C, --reuse-message <Commit>
                          Beschreibung des angegebenen Commits wiederverwenden
    --fixup <Commit>      eine automatisch zusammengesetzte Beschreibung zum Nachbessern des angegebenen Commits verwenden
    --squash <Commit>     eine automatisch zusammengesetzte Beschreibung beim "squash" des angegebenen Commits verwenden
    --reset-author        Sie als Autor des Commits setzen (verwendet mit -C/-c/--amend)
    -s, --signoff         'Signed-off-by:'-Zeile hinzufügen
    -t, --template <Datei>
                          angegebene Vorlagendatei verwenden
    -e, --edit            Bearbeitung des Commits erzwingen
    --cleanup <Standard>  wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen
    --status              Status in die Commit-Beschreibungsvorlage einfügen
    -S, --gpg-sign[=<GPG-Schlüsselkennung>]
                          Commit mit GPG signieren

Optionen für Commit-Inhalt
    -a, --all             alle geänderten Dateien committen
    -i, --include         die angegebenen Dateien zusätzlich zum Commit vormerken
    --interactive         interaktives Hinzufügen von Dateien
    -p, --patch           interaktives Hinzufügen von Änderungen
    -o, --only            nur die angegebenen Dateien committen
    -n, --no-verify       "pre-commit hook" umgehen
    --dry-run             anzeigen, was committet werden würde
    --short               Status im Kurzformat anzeigen
    --branch              Branchinformationen anzeigen
    --porcelain           maschinenlesbare Ausgabe
    --long                Status im Langformat anzeigen (Standard)
    -z, --null            Einträge mit NUL-Zeichen abschließen
    --amend               vorherigen Commit ändern
    --no-post-rewrite     "post-rewrite hook" umgehen
    -u, --untracked-files[=<Modus>]
                          unversionierte Dateien anzeigen, optionale Modi: all, normal, no. (Standard: all)