Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
- 2.49.1 → 2.52.0 keine Änderungen
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 keine Änderungen
-
2.48.0
2025-01-10
- 2.45.1 → 2.47.3 keine Änderungen
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 keine Änderungen
-
2.44.0
2024-02-23
- 2.43.2 → 2.43.7 keine Änderungen
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.39.1 → 2.42.4 keine Änderungen
-
2.39.0
2022-12-12
- 2.25.1 → 2.38.5 keine Änderungen
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 keine Änderungen
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 keine Änderungen
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 keine Änderungen
-
2.20.0
2018-12-09
- 2.18.1 → 2.19.6 keine Änderungen
- 2.18.0 keine Änderungen
- 2.17.0 → 2.17.6 keine Änderungen
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.13.7 → 2.14.6 keine Änderungen
-
2.12.5
2017-09-22
- 2.11.4 keine Änderungen
-
2.10.5
2017-09-22
- 2.7.6 → 2.9.5 keine Änderungen
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
- 2.2.3 → 2.4.12 keine Änderungen
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
BESCHREIBUNG
Ein Git-Repository gibt es in zwei verschiedenen Ausprägungen
-
ein
.gitVerzeichnis im Stammverzeichnis des Arbeitsbaums; -
ein <projekt>
.gitVerzeichnis, das ein Bare Repository ist (d.h. ohne eigenen Arbeitsbaum), das typischerweise zum Austausch von Historien mit anderen verwendet wird, indem hinein gepusht und daraus gefetcht wird.
Hinweis: Sie können auch eine einfache Textdatei .git im Stammverzeichnis Ihres Arbeitsbaums haben, die gitdir: <pfad> enthält, um auf das eigentliche Verzeichnis zu verweisen, das das Repository enthält. Dieser Mechanismus wird als gitfile bezeichnet und wird normalerweise über die Befehle git submodule und git worktree verwaltet. Er wird oft für einen Arbeitsbaum eines ausgecheckten Submoduls verwendet, um es Ihnen im übergeordneten Superprojekt zu ermöglichen, einen Branch auszuchecken, der das Submodul nicht enthält (git checkout). Der checkout muss den gesamten Arbeitsbaum des Submoduls entfernen, ohne das Submodul-Repository zu verlieren.
Diese Dinge können in einem Git-Repository existieren.
- objects
-
Objektspeicher, der mit diesem Repository verknüpft ist. Normalerweise ist ein Objektspeicher in sich geschlossen (d.h. alle Objekte, auf die von einem darin gefundenen Objekt verwiesen wird, sind auch darin enthalten), aber es gibt einige Möglichkeiten, dies zu verletzen.
-
Sie könnten ein unvollständiges, aber lokal nutzbares Repository haben, indem Sie einen flachen Klon erstellen. Siehe git-clone[1].
-
Sie könnten die Mechanismen
objects/info/alternatesoder$GIT_ALTERNATE_OBJECT_DIRECTORIESverwenden, um Objekte von anderen Objektspeichern zu leihen. Ein Repository mit einer solchen unvollständigen Objektspeicherstruktur ist nicht geeignet, um über langsame Transportschichten veröffentlicht zu werden, ist aber ansonsten in Ordnung, solangeobjects/info/alternatesauf die Objektspeicher verweist, von denen es Objekte leiht.Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/objects" verwendet wird.
-
- objects/[0-9a-f][0-9a-f]
-
Ein neu erzeugtes Objekt wird in seiner eigenen Datei gespeichert. Die Objekte werden in 256 Unterverzeichnissen verteilt, wobei die ersten beiden Zeichen des SHA1-Objektnamens verwendet werden, um die Anzahl der Verzeichniseinträge in
objectsselbst überschaubar zu halten. Objekte, die hier gefunden werden, werden oft als entpackte (oder lose) Objekte bezeichnet. - objects/pack
-
Packs (Dateien, die viele Objekte in komprimierter Form speichern, zusammen mit Indexdateien, die zufälligen Zugriff ermöglichen) befinden sich in diesem Verzeichnis.
- objects/info
-
Zusätzliche Informationen über den Objektspeicher werden in diesem Verzeichnis aufgezeichnet.
- objects/info/packs
-
Diese Datei hilft langsamen Transportschichten dabei, herauszufinden, welche Packs in diesem Objektspeicher verfügbar sind. Jedes Mal, wenn ein Pack hinzugefügt oder entfernt wird, sollte
gitupdate-server-infoausgeführt werden, um diese Datei aktuell zu halten, wenn das Repository für langsame Transportschichten veröffentlicht wird. git repack tut dies standardmäßig. - objects/info/alternates
-
Diese Datei zeichnet Pfade zu alternativen Objektspeichern auf, von denen dieser Objektspeicher Objekte leiht, ein Pfad pro Zeile. Beachten Sie, dass nicht nur native Git-Tools sie lokal verwenden, sondern auch der HTTP-Fetcher versucht, sie remote zu verwenden; dies funktioniert normalerweise, wenn Sie relative Pfade (relativ zur Objektbank, nicht zum Repository!) in Ihrer Alternates-Datei haben, aber es funktioniert nicht, wenn Sie absolute Pfade verwenden, es sei denn, der absolute Pfad im Dateisystem und die Web-URL sind dieselben. Siehe auch
objects/info/http-alternates. - objects/info/http-alternates
-
Diese Datei zeichnet URLs zu alternativen Objektspeichern auf, von denen dieses Repository Objekte leiht, die verwendet werden, wenn das Repository über HTTP abgerufen wird.
- refs
-
Referenzen werden in Unterverzeichnissen dieses Verzeichnisses gespeichert. Der Befehl git prune weiß, dass er Objekte erhalten soll, die von Refs in diesem Verzeichnis und seinen Unterverzeichnissen erreichbar sind. Dieses Verzeichnis wird ignoriert (außer refs/bisect, refs/rewritten und refs/worktree), wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/refs" verwendet wird.
- refs/heads/
name -
speichert die Spitzen-Commit-Objekte des Branches
name - refs/tags/
name -
speichert jeden Objektnamen (nicht unbedingt ein Commit-Objekt oder ein Tag-Objekt, das auf ein Commit-Objekt zeigt).
- refs/remotes/
name -
speichert die Spitzen-Commit-Objekte von Branches, die von einem entfernten Repository kopiert wurden.
- refs/replace/<obj-sha1>
-
speichert die SHA-1 des Objekts, das <obj-sha1> ersetzt. Dies ist ähnlich wie info/grafts und wird intern von git-replace[1] verwendet und gepflegt. Solche Refs können zwischen Repositories ausgetauscht werden, während grafts dies nicht können.
- packed-refs
-
speichert die gleichen Informationen wie refs/heads/, refs/tags/ und ähnliche auf effizientere Weise. Siehe git-pack-refs[1]. Diese Datei wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/packed-refs" verwendet wird.
- HEAD
-
Ein Symref (siehe Glossar) auf den Namespace
refs/heads/, der den aktuell aktiven Branch beschreibt. Er hat nicht viel Bedeutung, wenn das Repository nicht mit einem Arbeitsbaum verbunden ist (d.h. ein Bare Repository), aber ein gültiges Git-Repository muss die HEAD-Datei haben; einige Porcelains verwenden sie möglicherweise, um den designierten "Standard"-Branch des Repositories zu erraten (normalerweise master). Es ist legal, wenn der benannte Branch name nicht (noch) existiert. In einigen älteren Konfigurationen ist es ein symbolischer Link anstelle eines Symrefs, der auf den aktuellen Branch verweist.HEAD kann auch direkt einen bestimmten Commit speichern, anstatt ein Symref zu sein, das auf den aktuellen Branch zeigt. Ein solcher Zustand wird oft als detached HEAD bezeichnet. Siehe git-checkout[1] für Details.
- config
-
Repository-spezifische Konfigurationsdatei. Diese Datei wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/config" verwendet wird.
- config.worktree
-
Arbeitsverzeichnis-spezifische Konfigurationsdatei für das Hauptarbeitsverzeichnis in einer Konfiguration mit mehreren Arbeitsverzeichnissen (siehe git-worktree[1]).
- branches
-
Eine veraltete Methode zum Speichern von Kurzbezeichnungen, die für die Angabe einer URL für git fetch, git pull und git push verwendet werden. Eine Datei kann als
branches/<name> gespeichert werden und dann kann name für diese Befehle anstelle des repository Arguments angegeben werden. Siehe den Abschnitt REMOTES in git-fetch[1] für Details. Dieser Mechanismus ist veraltet und wird wahrscheinlich nicht in modernen Repositories gefunden. Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/branches" verwendet wird.Git wird aufhören, Remotes aus diesem Verzeichnis in Git 3.0 zu lesen.
- hooks
-
Hooks sind Anpassungsskripte, die von verschiedenen Git-Befehlen verwendet werden. Eine Handvoll Beispiel-Hooks werden installiert, wenn git init ausgeführt wird, aber alle sind standardmäßig deaktiviert. Um sie zu aktivieren, muss das
.sampleSuffix vom Dateinamen durch Umbenennen entfernt werden. Lesen Sie githooks[5] für weitere Details zu jedem Hook. Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/hooks" verwendet wird. - common
-
Wenn mehrere Arbeitsbäume verwendet werden, sind die meisten Dateien in $GIT_DIR pro Arbeitsbaum, mit wenigen bekannten Ausnahmen. Alle Dateien unter common werden jedoch zwischen allen Arbeitsbäumen geteilt.
- index
-
Die aktuelle Indexdatei für das Repository. Sie wird in einem Bare Repository normalerweise nicht gefunden.
-
Der gemeinsame Indexteil, auf den von $GIT_DIR/index und anderen temporären Indexdateien verwiesen wird. Nur im Split-Index-Modus gültig.
- info
-
Zusätzliche Informationen über das Repository werden in diesem Verzeichnis aufgezeichnet. Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/info" verwendet wird.
- info/refs
-
Diese Datei hilft langsamen Transportschichten dabei, herauszufinden, welche Refs in diesem Repository verfügbar sind. Wenn das Repository für langsame Transportschichten veröffentlicht wird, sollte diese Datei jedes Mal von git update-server-info neu generiert werden, wenn ein Tag oder Branch erstellt oder geändert wird. Dies geschieht normalerweise über den Hook
hooks/update, der vom Befehl git-receive-pack ausgeführt wird, wenn Sie in das Repository git pushen. - info/grafts
-
Diese Datei zeichnet gefälschte Commit-Ahneninformationen auf, um vorzutäuschen, dass die Menge der Eltern eines Commits anders ist, als der Commit tatsächlich erstellt wurde. Eine Zeile pro Eintrag beschreibt einen Commit und seine gefälschten Eltern, indem ihre 40-stelligen hexadezimalen Objektnamen durch ein Leerzeichen getrennt und mit einem Zeilenumbruch abgeschlossen werden.
Beachten Sie, dass der Graft-Mechanismus veraltet ist und zu Problemen beim Übertragen von Objekten zwischen Repositories führen kann; siehe git-replace[1] für ein flexibleres und robusteres System, das dasselbe tut.
- info/exclude
-
Diese Datei speichert nach Konvention der Porcelains die Liste der Ausschlussmuster.
.gitignoreist die ignoriere Datei pro Verzeichnis. git status, git add, git rm und git clean schauen sie an, aber die Kern-Git-Befehle schauen sie nicht an. Siehe auch: gitignore[5]. - info/attributes
-
Definiert, welche Attribute einem Pfad zugewiesen werden sollen, ähnlich wie bei pro Verzeichnis
.gitattributesDateien. Siehe auch: gitattributes[5]. - info/sparse-checkout
-
Diese Datei speichert Sparse-Checkout-Muster. Siehe auch: git-read-tree[1].
- remotes
-
Speichert Kurzbezeichnungen für URLs und Standard-Refnamen für die Interaktion mit entfernten Repositories über die Befehle git fetch, git pull und git push. Siehe den Abschnitt REMOTES in git-fetch[1] für Details. Dieser Mechanismus ist veraltet und wird wahrscheinlich nicht in modernen Repositories gefunden. Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/remotes" verwendet wird.
Git wird aufhören, Remotes aus diesem Verzeichnis in Git 3.0 zu lesen.
- logs
-
Protokolle von Änderungen an Refs werden in diesem Verzeichnis gespeichert. Siehe git-update-ref[1] für weitere Informationen. Dieses Verzeichnis wird ignoriert (außer logs/HEAD), wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/logs" verwendet wird.
- logs/refs/heads/
name -
Protokolliert alle Änderungen, die an der Branch-Spitze namens
namevorgenommen wurden. - logs/refs/tags/
name -
Protokolliert alle Änderungen, die am Tag namens
namevorgenommen wurden. - shallow
-
Dies ist ähnlich wie
info/grafts, wird aber intern vom Shallow-Clone-Mechanismus verwendet und gepflegt. Siehe die Option--depthzu git-clone[1] und git-fetch[1]. Diese Datei wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist und stattdessen "$GIT_COMMON_DIR/shallow" verwendet wird. - commondir
-
Wenn diese Datei existiert, wird $GIT_COMMON_DIR (siehe git[1]) auf den in dieser Datei angegebenen Pfad gesetzt, wenn er nicht explizit gesetzt ist. Wenn der angegebene Pfad relativ ist, ist er relativ zu $GIT_DIR. Das Repository mit commondir ist ohne das von "commondir" referenzierte Repository unvollständig.
- modules
-
Enthält die Git-Repositories der Submodule.
- worktrees
-
Enthält administrative Daten für verknüpfte Arbeitsbäume. Jedes Unterverzeichnis enthält den arbeitsbaumbezogenen Teil eines verknüpften Arbeitsbaums. Dieses Verzeichnis wird ignoriert, wenn $GIT_COMMON_DIR gesetzt ist, in welchem Fall stattdessen "$GIT_COMMON_DIR/worktrees" verwendet wird.
- worktrees/<id>/gitdir
-
Eine Textdatei, die den absoluten Pfad zurück zur .git-Datei enthält, die hierher verweist. Dies wird verwendet, um zu prüfen, ob das verknüpfte Repository manuell entfernt wurde und dieses Verzeichnis nicht mehr benötigt wird. Die mtime dieser Datei sollte jedes Mal aktualisiert werden, wenn das verknüpfte Repository aufgerufen wird.
- worktrees/<id>/locked
-
Wenn diese Datei existiert, ist der verknüpfte Arbeitsbaum möglicherweise auf einem tragbaren Gerät und nicht verfügbar. Die Existenz dieser Datei verhindert, dass
worktrees/<id> entweder automatisch oder manuell durchgitworktreeprunebereinigt wird. Die Datei kann einen String enthalten, der erklärt, warum das Repository gesperrt ist. - worktrees/<id>/config.worktree
-
Arbeitsverzeichnis-spezifische Konfigurationsdatei.
Git Repository Format Versionen
Jedes Git-Repository wird mit einer numerischen Version im Schlüssel core.repositoryformatversion seiner config-Datei gekennzeichnet. Diese Version gibt die Regeln für die Operationen auf den Repository-Daten auf der Festplatte an. Eine Implementierung von Git, die eine bestimmte von einem Repository auf der Festplatte angezeigte Version nicht versteht, DARF NICHT auf diesem Repository operieren; dies birgt die Gefahr, nicht nur falsche Ergebnisse zu erzielen, sondern tatsächlich Daten zu verlieren.
Aufgrund dieser Regel sollten Versionserhöhungen auf ein absolutes Minimum beschränkt werden. Stattdessen bevorzugen wir generell diese Strategien:
-
Erhöhung der Formatversionsnummern einzelner Datendateien (z.B. Index, Packfiles, etc.). Dies beschränkt die Inkompatibilitäten nur auf diese Dateien.
-
Einführung neuer Daten, die bei Verwendung durch ältere Clients ordnungsgemäß abgebaut werden (z.B. Pack-Bitmap-Dateien werden von älteren Clients ignoriert, die einfach nicht von der von ihnen bereitgestellten Optimierung profitieren).
Eine Erhöhung der Repository-Formatversion sollte nur Teil einer Änderung sein, die nicht unabhängig versioniert werden kann. Wenn man beispielsweise die Erreichbarkeitsregeln für Objekte oder die Regeln für das Sperren von Refs ändern würde, würde dies eine Erhöhung der Repository-Formatversion erfordern.
Beachten Sie, dass dies nur für den direkten Zugriff auf die Festplatteninhalte des Repositories gilt. Ein älterer Client, der nur Formatversion 0 versteht, kann sich immer noch über git:// mit einem Repository der Formatversion 1 verbinden, solange der Serverprozess Formatversion 1 versteht.
Die bevorzugte Strategie für die Einführung einer Versionserhöhung (sei es für das gesamte Repository oder für eine einzelne Datei) ist, Git beizubringen, das neue Format zu lesen, und das Schreiben des neuen Formats mit einem Konfigurationsschalter oder einer Kommandozeilenoption zu ermöglichen (für Experimente oder für diejenigen, denen die Abwärtskompatibilität mit älteren Gits egal ist). Dann, nach einer langen Periode, um die Lesefähigkeit verbreitet werden zu lassen, können wir das Schreiben des neuen Formats standardmäßig umschalten.
Die derzeit definierten Formatversionen sind:
Version 0
Dies ist das Format, das von der ursprünglichen Version von Git definiert wurde, einschließlich, aber nicht beschränkt auf das Format des Repository-Verzeichnisses, der Repository-Konfigurationsdatei und der Objekt- und Ref-Speicherung. Die vollständige Beschreibung des Verhaltens von Git liegt außerhalb des Rahmens dieses Dokuments.
Version 1
Dieses Format ist identisch mit Version 0, mit den folgenden Ausnahmen:
-
Beim Lesen der Variablen
core.repositoryformatversionmuss eine Git-Implementierung, die Version 1 unterstützt, auch alle Konfigurationsschlüssel im Abschnittextensionsder Konfigurationsdatei lesen. -
Wenn ein Repository der Version 1 irgendwelche
extensions.*Schlüssel angibt, die das laufende Git nicht implementiert hat, darf die Operation NICHT fortgesetzt werden. Ebenso, wenn der Wert eines bekannten Schlüssels von der Implementierung nicht verstanden wird, darf die Operation NICHT fortgesetzt werden.
Beachten Sie, dass, wenn keine Erweiterungen in der Konfigurationsdatei angegeben sind, core.repositoryformatversion auf 0 gesetzt werden SOLLTE (das Setzen auf 1 bietet keinen Vorteil und macht das Repository inkompatibel mit älteren Git-Implementierungen).
Die definierten Erweiterungen sind im Abschnitt extensions.* von git-config[1] angegeben. Jede Implementierung, die eine neue Erweiterung definieren möchte, sollte dies dort vermerken, um den Namen zu beanspruchen.
GIT
Teil der git[1] Suite