Clones Superficiales en Git: Cuándo y Cómo Usarlos

Usa clones superficiales para verificaciones rápidas de Git en CI y trabajos temporales, y aprende cómo profundizar o deshacer la superficialidad cuando necesites más historial.

Clones Superficiales en Git: Cuándo y Cómo Usarlos

Los clones superficiales en Git obtienen solo una parte del historial de confirmaciones. Son útiles cuando un trabajo de CI, un paso de despliegue o una tarea de inspección rápida necesita el código actual pero no años de historial.

No son la mejor opción predeterminada para cada estación de trabajo de desarrollador. Un clon superficial puede ahorrar tiempo y espacio en disco, pero también limita los comandos basados en el historial hasta que obtengas más confirmaciones.

¿Qué es un Clon Superficial?

Un clon estándar obtiene suficiente historial para el trabajo normal de ramas, inspección de historial, verificación de etiquetas antiguas e investigación sin conexión. Un clon superficial trunca ese historial a una profundidad que tú eliges.

Por ejemplo, --depth 1 obtiene la confirmación más reciente de la rama seleccionada. --depth 50 obtiene un historial más reciente, pero aún no la ascendencia completa.

Beneficios de Usar Clones Superficiales

El principal beneficio es un menor costo de transferencia:

  • Verificación inicial más rápida para repositorios grandes.
  • Menor uso de disco en agentes de compilación de corta duración.
  • Menor uso de ancho de banda en redes lentas o medidas.
  • Menos historial que Git debe procesar durante el clon inicial.

En un pipeline de CI que compila la confirmación actual y descarta el espacio de trabajo, un clon superficial suele ser una ventaja clara.

Desventajas y Limitaciones de los Clones Superficiales

La compensación es la falta de historial:

  • git log se detiene en el límite superficial.
  • git blame puede no ser capaz de seguir cambios antiguos.
  • Las etiquetas o confirmaciones antiguas pueden no estar disponibles hasta que se obtengan.
  • Los rebases y fusiones pueden ser más difíciles si Git necesita una base de fusión faltante.
  • Algunos flujos de trabajo de lanzamiento o auditoría esperan un historial completo.

Si tu trabajo a menudo implica depurar regresiones antiguas, preparar lanzamientos o aplicar cambios a versiones anteriores, comienza con un clon completo.

Cómo Crear un Clon Superficial

Usa git clone --depth:

git clone --depth <número> <url_del_repositorio>

Por ejemplo, para clonar un repositorio y obtener solo las últimas 10 confirmaciones:

git clone --depth 10 https://github.com/ejemplo/repositorio-grande.git

Para un trabajo de compilación que solo necesita la punta de la rama:

git clone --depth 1 https://github.com/ejemplo/proyecto.git

Para clonar una rama específica:

git clone --depth 1 -b develop https://github.com/ejemplo/proyecto.git

También puedes agregar --single-branch cuando solo quieras historial para esa rama:

git clone --depth 1 --single-branch --branch develop https://github.com/ejemplo/proyecto.git

Gestión de Clones Superficiales

Obtener Más Historial (Profundizar el Clon)

Si necesitas más historial después de clonar, profundiza el repositorio:

git fetch --deepen=50 origin

Eso obtiene 50 confirmaciones más allá del límite superficial actual.

También puedes establecer la profundidad total que deseas:

git fetch --depth=100 origin

El punto importante: git remote set-depth no es un comando válido de Git. La profundidad se controla a través de las opciones de clon y fetch.

Obtener Etiquetas

Los clones superficiales pueden no incluir todas las etiquetas, especialmente las que apuntan a confirmaciones antiguas. Obtén etiquetas solo si tu flujo de trabajo las necesita:

git fetch --tags origin

Deshacer la Superficialidad de un Repositorio

Para convertir un clon superficial en un clon completo, obtén el resto del historial:

git fetch --unshallow origin

Este comando descargará el historial restante del repositorio remoto.

Empujar desde un Clon Superficial

Empujar desde un clon superficial puede funcionar cuando tus nuevas confirmaciones se basan en la punta de la rama remota que obtuviste. Sin embargo, sigue siendo una mala opción para el desarrollo a largo plazo porque la falta de historial puede hacer que los rebases, la resolución de conflictos y la revisión sean más difíciles.

Si encuentras problemas de empuje o fusión relacionados con el historial, obtén más historial o deshaz la superficialidad del clon antes de continuar.

Cuándo Usar Clones Superficiales

Úsalos cuando el trabajo sea de corta duración y el historial no sea importante:

  • Verificación de CI/CD.
  • Inspección de solo lectura.
  • Entornos de reproducción temporales.
  • Compilaciones de documentación.
  • Repositorios grandes en redes lentas.

Cuándo No Usar Clones Superficiales

Evítalos cuando necesites regularmente:

  • git log, git blame o git bisect profundos.
  • Trabajo de lanzamiento que use etiquetas antiguas.
  • Trabajo complejo de fusión o rebase.
  • Depuración sin conexión a través del historial.
  • Flujos de trabajo de contribución que esperen un clon completo.

Conclusión Práctica

Usa git clone --depth 1 para trabajos desechables que solo necesiten el código más reciente. Usa un clon completo para el desarrollo normal a menos que tengas una razón clara para no hacerlo.

Si un clon superficial comienza a estorbar, profúndalo con git fetch --deepen=<número> origin o conviértelo con git fetch --unshallow origin. Eso suele ser más rápido y seguro que luchar contra errores de historial faltante un comando a la vez.