Von Gast (nicht überprüft) , 29 April 2026

Übersicht

git subtree add --prefix=<path> <repo> <ref> [--squash]
git subtree pull --prefix=<path> <repo> <ref>
git subtree push --prefix=<path> <repo> <ref>
git subtree split --prefix=<path> -b <new-branch>

Beschreibung

Der git subtree-Befehl ist eine Alternative zu Submodules, die den Inhalt eines anderen Projekts direkt in ein Unterverzeichnis Ihres Repos mergt. Anders als bei Submodules brauchen Subtree-Konsumenten keine speziellen Schritte — die Dateien sind einfach da. Der Preis ist, dass die fremde Historie in Ihre eigene aufgenommen wird.

Die zwei Hauptoperationen sind add (initialer Import, oft mit --squash, um die Historie zu verflachen) und pull (Upstream-Änderungen einbringen). Um Änderungen zurückzusenden, filtert git subtree push Commits heraus, die das Präfix berühren, und pusht sie zum Upstream-Repo.

Im täglichen Einsatz integriert sich git subtree eng mit Shell-Aliasen, Editor-Plugins und Continuous Integration. Power-User fügen oft Aliase hinzu, die Flags kombinieren, die sie immer übergeben, oder wickeln den Befehl in Skripte, die Teamkonventionen durchsetzen. Die Ausgabeformatierung kann über Git-Config angepasst werden — Pretty-Formate, Farbschemata und Pager-Verhalten sind alle einstellbar. Wenn etwas schiefgeht, ist der erste Diagnoseschritt üblicherweise, den Befehl erneut mit GIT_TRACE=1 in der Umgebung auszuführen, was die zugrunde liegenden Plumbing-Aufrufe offenlegt. Für ungewöhnliche Situationen öffnet die --help-Ausgabe (git subtree --help) die vollständige Manpage mit Details zu jeder Option, einschließlich solcher, die in alltäglichen Workflows selten verwendet werden, aber für Debugging oder Skripting im großen Maßstab essentiell sind.

Zu verstehen, wie git subtree mit dem Rest von Gits Datenmodell interagiert — der Objektdatenbank, dem Index, Refs und dem Working Tree — zahlt sich aus. Jeder Befehl operiert auf einer Teilmenge dieser Stücke, und zu wissen, welche er berührt, hilft Ergebnisse vorherzusagen und sich von Fehlern zu erholen. Das Lesen der offiziellen Git-Dokumentation neben praktischer Übung in einem Wegwerf-Repository ist der schnellste Weg, die Nuancen zu verinnerlichen. Die meisten Produktionsprobleme mit Git rühren von einer von drei Ursachen: überraschendem Standardverhalten, partiellen Netzwerkoperationen oder dem Umschreiben bereits geteilter Historie. Ein funktionierendes mentales Modell der Nebenwirkungen von git subtree hilft, alle drei zu vermeiden.

Häufige Optionen

UnterbefehlBeschreibung
addImportiert ein externes Repo in ein Unterverzeichnis.
pullMergt Upstream-Änderungen für dieses Präfix.
pushPusht reine Präfix-Historie zurück zum Upstream.
mergeMergt einen beliebigen Tree in das Präfix.
splitExtrahiert die Historie eines Unterverzeichnisses als eigenständigen Branch.
--squashVerflacht fremde Historie zu einem einzelnen Commit.
--prefix=<path>Unterverzeichnis, in das das Subtree gelegt werden soll.

Beispiele

git subtree add --prefix=vendor/foo https://github.com/lib/foo.git main --squash
    # foo nach vendor/foo importieren, Historie squashen

    git subtree pull --prefix=vendor/foo https://github.com/lib/foo.git main --squash
    # Updates pullen

    git subtree split --prefix=lib -b lib-only
    # lib/ als eigenen Branch zum Teilen extrahieren

    git subtree push --prefix=vendor/foo upstream main
    # Präfix-bezogene Commits zurück zum Upstream senden

Häufige Fehler

--squash bei manchen Operationen zu mischen und bei anderen nicht erzeugt eine chaotische Historie. Wählen Sie einen Modus und bleiben Sie dabei. Subtree-Merges erzeugen nicht-triviale Commit-Graphen, die manche Tooling verwirren. git subtree split kann auf großen Historien langsam sein.

Verwandte Befehle

git submodule, git merge, git filter-repo