-
1. Erste Schritte
- 1.1 Über Versionskontrolle
- 1.2 Eine kurze Geschichte von Git
- 1.3 Was ist Git?
- 1.4 Die Kommandozeile
- 1.5 Git installieren
- 1.6 Erstmalige Git-Einrichtung
- 1.7 Hilfe bekommen
- 1.8 Zusammenfassung
-
2. Git Grundlagen
-
3. Git Branching
- 3.1 Branches im Überblick
- 3.2 Grundlegendes Branching und Merging
- 3.3 Branch-Management
- 3.4 Branching-Workflows
- 3.5 Remote-Branches
- 3.6 Rebasing
- 3.7 Zusammenfassung
-
4. Git auf dem Server
- 4.1 Die Protokolle
- 4.2 Git auf einem Server einrichten
- 4.3 Generieren Ihres SSH-Public-Keys
- 4.4 Einrichten des Servers
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Drittanbieter-Hosting-Optionen
- 4.10 Zusammenfassung
-
5. Verteiltes Git
-
6. GitHub
-
7. Git-Werkzeuge
- 7.1 Revisionsauswahl
- 7.2 Interaktives Staging
- 7.3 Stashing und Bereinigen
- 7.4 Ihre Arbeit signieren
- 7.5 Suchen
- 7.6 Historie umschreiben
- 7.7 Reset entmystifiziert
- 7.8 Fortgeschrittenes Merging
- 7.9 Rerere
- 7.10 Debugging mit Git
- 7.11 Submodule
- 7.12 Bundling
- 7.13 Ersetzen
- 7.14 Credential-Speicher
- 7.15 Zusammenfassung
-
8. Git anpassen
-
9. Git und andere Systeme
- 9.1 Git als Client
- 9.2 Migration zu Git
- 9.3 Zusammenfassung
-
10. Git-Interna
- 10.1 Plumbing und Porcelain
- 10.2 Git-Objekte
- 10.3 Git-Referenzen
- 10.4 Packfiles
- 10.5 Die Refspec
- 10.6 Übertragungsprotokolle
- 10.7 Wartung und Datenwiederherstellung
- 10.8 Umgebungsvariablen
- 10.9 Zusammenfassung
-
Anhang A: Git in anderen Umgebungen
- A1.1 Grafische Oberflächen
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Zusammenfassung
-
Anhang B: Git in Ihre Anwendungen einbetten
- A2.1 Kommandozeilen-Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
Anhang C: Git-Befehle
- A3.1 Einrichtung und Konfiguration
- A3.2 Projekte abrufen und erstellen
- A3.3 Grundlegendes Snapshotting
- A3.4 Branching und Merging
- A3.5 Projekte teilen und aktualisieren
- A3.6 Inspektion und Vergleich
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-Mail
- A3.10 Externe Systeme
- A3.11 Administration
- A3.12 Plumbing-Befehle
10.8 Git Internals - Umgebungsvariablen
Umgebungsvariablen
Git läuft immer in einer bash-Shell und verwendet eine Reihe von Shell-Umgebungsvariablen, um sein Verhalten zu steuern. Gelegentlich ist es nützlich zu wissen, welche das sind und wie sie verwendet werden können, um Git dazu zu bringen, sich so zu verhalten, wie Sie es wünschen. Dies ist keine erschöpfende Liste aller Umgebungsvariablen, auf die Git achtet, aber wir werden die nützlichsten behandeln.
Globales Verhalten
Einige allgemeine Verhaltensweisen von Git als Computerprogramm hängen von Umgebungsvariablen ab.
GIT_EXEC_PATH bestimmt, wo Git nach seinen Unterprogrammen sucht (wie git-commit, git-diff und andere). Sie können die aktuelle Einstellung überprüfen, indem Sie git --exec-path ausführen.
HOME wird normalerweise nicht als anpassbar betrachtet (zu viele andere Dinge hängen davon ab), aber es ist der Ort, an dem Git nach der globalen Konfigurationsdatei sucht. Wenn Sie eine wirklich portable Git-Installation wünschen, komplett mit globaler Konfiguration, können Sie HOME im Shell-Profil von portablem Git überschreiben.
PREFIX ist ähnlich, aber für die systemweite Konfiguration. Git sucht diese Datei unter $PREFIX/etc/gitconfig.
GIT_CONFIG_NOSYSTEM, wenn gesetzt, deaktiviert die Verwendung der systemweiten Konfigurationsdatei. Dies ist nützlich, wenn Ihre Systemkonfiguration Ihre Befehle beeinträchtigt, Sie aber keinen Zugriff haben, um sie zu ändern oder zu entfernen.
GIT_PAGER steuert das Programm, das verwendet wird, um mehrseitige Ausgaben auf der Kommandozeile anzuzeigen. Wenn dies nicht gesetzt ist, wird PAGER als Fallback verwendet.
GIT_EDITOR ist der Editor, den Git startet, wenn der Benutzer Text bearbeiten muss (z. B. eine Commit-Nachricht). Wenn nicht gesetzt, wird EDITOR verwendet.
Repository-Speicherorte
Git verwendet mehrere Umgebungsvariablen, um zu bestimmen, wie es mit dem aktuellen Repository interagiert.
GIT_DIR ist der Speicherort des .git-Ordners. Wenn dies nicht angegeben ist, durchsucht Git den Verzeichnisbaum nach oben, bis es ~ oder / erreicht, und sucht bei jedem Schritt nach einem .git-Verzeichnis.
GIT_CEILING_DIRECTORIES steuert das Verhalten bei der Suche nach einem .git-Verzeichnis. Wenn Sie auf Verzeichnisse zugreifen, deren Laden langsam ist (z. B. auf einem Bandlaufwerk oder über eine langsame Netzwerkverbindung), möchten Sie vielleicht, dass Git früher aufhört zu suchen, als es sonst tun würde, insbesondere wenn Git beim Erstellen Ihrer Shell-Eingabeaufforderung aufgerufen wird.
GIT_WORK_TREE ist der Speicherort der Wurzel des Arbeitsverzeichnisses für ein Nicht-Bare-Repository. Wenn --git-dir oder GIT_DIR angegeben ist, aber keines von --work-tree, GIT_WORK_TREE oder core.worktree angegeben ist, wird das aktuelle Arbeitsverzeichnis als oberste Ebene Ihres Arbeitsbaums betrachtet.
GIT_INDEX_FILE ist der Pfad zur Indexdatei (nur für Nicht-Bare-Repositories).
GIT_OBJECT_DIRECTORY kann verwendet werden, um den Speicherort des Verzeichnisses anzugeben, das sich normalerweise unter .git/objects befindet.
GIT_ALTERNATE_OBJECT_DIRECTORIES ist eine durch Doppelpunkte getrennte Liste (formatiert als /dir/one:/dir/two:…), die Git mitteilt, wo nach Objekten gesucht werden soll, wenn sie sich nicht in GIT_OBJECT_DIRECTORY befinden. Wenn Sie viele Projekte mit großen Dateien haben, die exakt dieselben Inhalte haben, können Sie damit vermeiden, zu viele Kopien davon zu speichern.
Pfadspezifikationen
Eine „Pfadspezifikation“ bezieht sich darauf, wie Sie Pfade zu Dingen in Git angeben, einschließlich der Verwendung von Wildcards. Diese werden in der Datei .gitignore verwendet, aber auch auf der Kommandozeile (git add *.c).
GIT_GLOB_PATHSPECS und GIT_NOGLOB_PATHSPECS steuern das Standardverhalten von Wildcards in Pfadspezifikationen. Wenn GIT_GLOB_PATHSPECS auf 1 gesetzt ist, verhalten sich Wildcard-Zeichen als Wildcards (was der Standard ist); wenn GIT_NOGLOB_PATHSPECS auf 1 gesetzt ist, passen sich Wildcard-Zeichen nur selbst an, was bedeutet, dass etwas wie *.c nur eine Datei *namens* „\*.c“ abgleichen würde, anstatt jede Datei, deren Name mit .c endet. Sie können dies in Einzelfällen überschreiben, indem Sie die Pfadspezifikation mit :(glob) oder :(literal) beginnen, wie in :(glob)\*.c.
GIT_LITERAL_PATHSPECS deaktiviert beide oben genannten Verhaltensweisen; keine Wildcard-Zeichen funktionieren, und die Override-Präfixe sind ebenfalls deaktiviert.
GIT_ICASE_PATHSPECS setzt alle Pfadspezifikationen auf den Fall-unabhängigen Betrieb.
Committing
Die endgültige Erstellung eines Git-Commit-Objekts erfolgt normalerweise durch git-commit-tree, das diese Umgebungsvariablen als primäre Informationsquelle verwendet und nur auf Konfigurationswerte zurückgreift, wenn diese nicht vorhanden sind.
GIT_AUTHOR_NAME ist der menschenlesbare Name im Feld „author“.
GIT_AUTHOR_EMAIL ist die E-Mail-Adresse für das Feld „author“.
GIT_AUTHOR_DATE ist der Zeitstempel, der für das Feld „author“ verwendet wird.
GIT_COMMITTER_NAME setzt den menschenlesbaren Namen für das Feld „committer“.
GIT_COMMITTER_EMAIL ist die E-Mail-Adresse für das Feld „committer“.
GIT_COMMITTER_DATE wird für den Zeitstempel im Feld „committer“ verwendet.
EMAIL ist die Fallback-E-Mail-Adresse, falls der Konfigurationswert user.email nicht gesetzt ist. Wenn *dieser* nicht gesetzt ist, greift Git auf den Systembenutzer und die Hostnamen zurück.
Netzwerk
Git verwendet die curl-Bibliothek für Netzwerkoperationen über HTTP, daher gibt GIT_CURL_VERBOSE an, dass Git alle von dieser Bibliothek generierten Meldungen ausgeben soll. Dies ist ähnlich wie bei curl -v auf der Kommandozeile.
GIT_SSL_NO_VERIFY weist Git an, SSL-Zertifikate nicht zu überprüfen. Dies kann manchmal notwendig sein, wenn Sie ein selbstsigniertes Zertifikat verwenden, um Git-Repositories über HTTPS bereitzustellen, oder wenn Sie einen Git-Server einrichten, aber noch kein vollständiges Zertifikat installiert haben.
Wenn die Datenrate einer HTTP-Operation niedriger als GIT_HTTP_LOW_SPEED_LIMIT Bytes pro Sekunde für länger als GIT_HTTP_LOW_SPEED_TIME Sekunden ist, bricht Git diese Operation ab. Diese Werte überschreiben die Konfigurationswerte http.lowSpeedLimit und http.lowSpeedTime.
GIT_HTTP_USER_AGENT setzt den User-Agent-String, den Git bei der Kommunikation über HTTP verwendet. Der Standardwert ist ein Wert wie git#2.0.0.
Diffing und Merging
GIT_DIFF_OPTS ist eine Fehlbezeichnung. Die einzig gültigen Werte sind -u<n> oder --unified=<n>, die die Anzahl der Kontextzeilen steuern, die in einem git diff-Befehl angezeigt werden.
GIT_EXTERNAL_DIFF wird als Überschreibung für den Konfigurationswert diff.external verwendet. Wenn er gesetzt ist, ruft Git dieses Programm auf, wenn git diff aufgerufen wird.
GIT_DIFF_PATH_COUNTER und GIT_DIFF_PATH_TOTAL sind nützlich innerhalb des Programms, das von GIT_EXTERNAL_DIFF oder diff.external angegeben wird. Ersteres repräsentiert, welche Datei in einer Serie diff-geändert wird (beginnend mit 1), und letzteres ist die Gesamtzahl der Dateien im Stapel.
GIT_MERGE_VERBOSITY steuert die Ausgabe für die rekursive Merge-Strategie. Die erlaubten Werte sind wie folgt:
-
0 gibt nichts aus, außer möglicherweise einer einzelnen Fehlermeldung.
-
1 zeigt nur Konflikte.
-
2 zeigt auch Dateiänderungen an.
-
3 zeigt an, wann Dateien übersprungen werden, weil sie nicht geändert wurden.
-
4 zeigt alle Pfade an, während sie verarbeitet werden.
-
5 und höher zeigen detaillierte Debugging-Informationen an.
Der Standardwert ist 2.
Debugging
Möchten Sie *wirklich* wissen, was Git tut? Git verfügt über eine recht vollständige Reihe von Traces, und Sie müssen sie nur einschalten. Die möglichen Werte dieser Variablen sind wie folgt:
-
„true“, „1“ oder „2“ – die Trace-Kategorie wird an stderr geschrieben.
-
Ein absoluter Pfad, der mit
/beginnt – die Trace-Ausgabe wird in diese Datei geschrieben.
GIT_TRACE steuert allgemeine Traces, die in keine bestimmte Kategorie passen. Dazu gehört die Erweiterung von Aliassen und die Delegation an andere Unterprogramme.
$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554 trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga'
20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341 trace: run_command: 'less'
20:12:49.899675 run-command.c:192 trace: exec: 'less'
GIT_TRACE_PACK_ACCESS steuert die Nachverfolgung des Zugriffs auf Packdateien. Das erste Feld ist die angesprochene Packdatei, das zweite ist der Offset innerhalb dieser Datei.
$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
GIT_TRACE_PACKET aktiviert die Paket-Level-Nachverfolgung für Netzwerkoperationen.
$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46 packet: git< 0000
20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git#2.0.4
20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]
GIT_TRACE_PERFORMANCE steuert die Protokollierung von Leistungsdaten. Die Ausgabe zeigt, wie lange jede einzelne git-Aufrufung dauert.
$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc'
GIT_TRACE_SETUP zeigt Informationen darüber an, was Git über das Repository und die Umgebung entdeckt, mit der es interagiert.
$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315 setup: git_dir: .git
20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318 setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Sonstiges
GIT_SSH, wenn gesetzt, ist ein Programm, das anstelle von ssh aufgerufen wird, wenn Git versucht, eine Verbindung zu einem SSH-Host herzustellen. Es wird aufgerufen wie $GIT_SSH [username@]host [-p <port>] <command>. Beachten Sie, dass dies nicht der einfachste Weg ist, anzupassen, wie ssh aufgerufen wird; es unterstützt keine zusätzlichen Kommandozeilenparameter. Um zusätzliche Kommandozeilenparameter zu unterstützen, können Sie GIT_SSH_COMMAND verwenden, ein Wrapper-Skript schreiben und GIT_SSH darauf setzen oder die Datei ~/.ssh/config verwenden.
GIT_SSH_COMMAND setzt den SSH-Befehl, der verwendet wird, wenn Git versucht, eine Verbindung zu einem SSH-Host herzustellen. Der Befehl wird von der Shell interpretiert, und zusätzliche Kommandozeilenargumente können mit ssh verwendet werden, wie z. B. GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo.
GIT_ASKPASS ist eine Überschreibung des Konfigurationswerts core.askpass. Dies ist das Programm, das immer dann aufgerufen wird, wenn Git den Benutzer nach Anmeldeinformationen fragen muss. Es kann eine Textaufforderung als Kommandozeilenargument erwarten und sollte die Antwort auf stdout zurückgeben (siehe Credential Storage für mehr zu diesem Untersystem).
GIT_NAMESPACE steuert den Zugriff auf Namespaced Refs und ist äquivalent zum Flag --namespace. Dies ist hauptsächlich auf der Serverseite nützlich, wo Sie möglicherweise mehrere Forks eines einzelnen Repositorys in einem Repository speichern möchten, wobei nur die Refs getrennt gehalten werden.
GIT_FLUSH kann verwendet werden, um Git zu zwingen, nicht gepufferte E/A zu verwenden, wenn inkrementell auf stdout geschrieben wird. Ein Wert von 1 bewirkt, dass Git häufiger flusht, ein Wert von 0 bewirkt, dass die gesamte Ausgabe gepuffert wird. Der Standardwert (wenn diese Variable nicht gesetzt ist) ist die Auswahl eines geeigneten Pufferungsschemas, abhängig von der Aktivität und dem Ausgabemodus.
GIT_REFLOG_ACTION ermöglicht es Ihnen, den beschreibenden Text festzulegen, der in das Reflog geschrieben wird. Hier ist ein Beispiel:
$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'My message'
[master 9e3d55a] My message
$ git reflog -1
9e3d55a HEAD@{0}: my action: My message