Da Anonimo (non verificato) , 29 Aprile 2026

Sinossi

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>

Descrizione

Il comando git subtree è un'alternativa ai submodule che mergia il contenuto di un altro progetto direttamente in una sottodirectory del tuo repo. A differenza dei submodule, i consumatori di subtree non hanno bisogno di passi speciali — i file sono semplicemente lì. Il costo è che la storia esterna viene incorporata nella tua.

Le due operazioni principali sono add (importazione iniziale, spesso con --squash per appiattire la storia) e pull (porta dentro le modifiche upstream). Per mandare indietro le modifiche, git subtree push filtra i commit che toccano il prefisso e li pusha al repo upstream.

Nell'uso quotidiano, git subtree si integra con alias e CI.

Capire il modello dati di Git aiuta a prevedere i risultati.

Opzioni comuni

SottocomandoDescrizione
addImporta un repo esterno in una sottodirectory.
pullMergia modifiche upstream per quel prefisso.
pushPusha la storia solo del prefisso indietro upstream.
mergeMergia un tree arbitrario nel prefisso.
splitEstrae la storia di una sottodirectory come branch standalone.
--squashAppiattisce la storia esterna in un singolo commit.
--prefix=<path>Sottodirectory sotto cui mettere il subtree.

Esempi

git subtree add --prefix=vendor/foo https://github.com/lib/foo.git main --squash
# Importa foo in vendor/foo, squashando la storia

git subtree pull --prefix=vendor/foo https://github.com/lib/foo.git main --squash
# Pull degli aggiornamenti

git subtree split --prefix=lib -b lib-only
# Estrae lib/ come proprio branch per la condivisione

git subtree push --prefix=vendor/foo upstream main
# Manda commit limitati al prefisso indietro all'upstream

Errori comuni

Mescolare --squash su alcune operazioni e non altre crea storia disordinata. Scegli una modalità e attieniti ad essa. I merge subtree producono grafi di commit non triviali che confondono alcuni strumenti. git subtree split può essere lento su storie grandi.

Comandi correlati

git submodule, git merge, git filter-repo