git für Nicht-Programmierer - Teil 2 - Dateien in der Versionskontrolle
veröffentlicht am 12.11.2017 mit 1559 Worten - Lesezeit: 8 Minute(n) in * PROGRAMME * SOFTWARE * TUTORIALS *
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:

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
- in den Index (Staging Area) melden
- 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/{name}/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/{name}/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
P.S.: Kleine Änderungen, Einfügungen oder Korrekturen können in den letzten getätigten Commit quasi ’nachgereicht’ werden mit dem Befehl git commit --amend.
Schlußhinweis
Wie die meisten anderen Kommandozeilenwerkzeuge verfügen auch git add und git commit über eine große Anzahl von zusätzlichen 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)
weitere Artikel
- git für Nicht-Programmierer - Teil 3 - Versionsstände untersuchen und wiederherstellen
- git für Nicht-Programmierer - Teil 1 - Installation und Einrichtung
- git für Nicht-Programmierer - Die Grundlagen
- Hugo und die Krux mit dem Zeilenumbruch
- Trennung von Struktur und Design/Inhalt und Layout
