Por Anónimo (no verificado) , 29 Abril 2026

Sinopsis

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>

Descripción

El comando git subtree es una alternativa a git submodule para incluir el historial de otro repo dentro del tuyo. A diferencia de los submódulos, subtree fusiona el contenido directamente en tu repo, así que tus colaboradores no necesitan pasos adicionales tras un clone.

Usa git subtree add para incluir, git subtree pull para actualizar y git subtree push para enviar cambios de vuelta al repo upstream. La trampa es que el historial se vuelve más complejo y los splits no siempre son exactos.

En el uso diario, este comando se integra estrechamente con alias de shell, plugins de editor e integración continua. Los usuarios avanzados a menudo añaden alias que combinan los flags que siempre pasan. El formato de salida puede personalizarse vía configuración de Git. Cuando algo sale mal, ejecuta el comando con GIT_TRACE=1 para revelar las llamadas plumbing subyacentes.

Entender cómo este comando interactúa con el resto del modelo de datos de Git rinde dividendos. Cada comando opera sobre algún subconjunto de las piezas (objetos, index, refs, árbol de trabajo), y saber cuáles toca ayuda a predecir resultados y a recuperarse de errores.

Opciones comunes

SubcomandoDescripción
addImport an external repo into a subdirectory.
pullMerge upstream changes for that prefix.
pushPush prefix-only history back upstream.
mergeMerge an arbitrary tree into the prefix.
splitExtract a subdirectory's history as a standalone branch.
--squashFlatten foreign history into a single commit.
--prefix=<path>Subdirectory under which to place the subtree.

Ejemplos

git subtree add --prefix=vendor/foo https://github.com/lib/foo.git main --squash
# Import foo into vendor/foo, squashing history

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

git subtree split --prefix=lib -b lib-only
# Extract lib/ as its own branch for sharing

git subtree push --prefix=vendor/foo upstream main
# Send prefix-scoped commits back to upstream

Errores comunes

Mixing --squash on some operations and not others creates messy history. Pick one mode and stick with it. Subtree merges produce nontrivial commit graphs that confuse some tooling. git subtree split can be slow on large histories.

Comandos relacionados

git submodule, git merge, git filter-repo