svn - tortoise create branch from trunk




¿Qué significa “rama”, “etiqueta” y “troncal” en los repositorios de Subversion? (11)

Etiqueta = una porción definida en el tiempo, usualmente utilizada para lanzamientos

Creo que esto es lo que normalmente se entiende por "etiqueta". Pero en Subversion:

Realmente no tienen ningún significado formal. Una carpeta es una carpeta para SVN.

lo que me parece bastante confuso: un sistema de control de revisiones que no sabe nada sobre ramas o etiquetas. Desde el punto de vista de la implementación, creo que la forma en que Subversion crea "copias" es muy inteligente, pero tener que saberlo es lo que llamaría una abstracción con fugas .

O tal vez acabo de usar CVS demasiado tiempo.

He visto estas palabras mucho en torno a las discusiones sobre Subversión (y supongo que es un depósito general). He estado usando SVN para mis proyectos en los últimos años, pero nunca he comprendido el concepto completo de estos directorios.

¿Qué quieren decir?



El troncal es la línea de desarrollo que contiene el código fuente y las características más recientes. Debe tener las últimas correcciones de errores, así como las últimas características agregadas al proyecto.

Las ramas generalmente se usan para hacer algo lejos del tronco (u otra línea de desarrollo) que de otra manera rompería la construcción. Las nuevas características a menudo se construyen en una rama y luego se combinan de nuevo en el tronco. Las sucursales a menudo contienen códigos que no están necesariamente aprobados para la línea de desarrollo desde la que se ramificó. Por ejemplo, un programador podría intentar una optimización en algo en una rama y fusionarse solo en la línea de desarrollo una vez que la optimización sea satisfactoria.

Las etiquetas son instantáneas del repositorio en un momento determinado. Ningún desarrollo debe ocurrir en estos. Se usan con más frecuencia para llevar una copia de lo que se lanzó a un cliente para que pueda tener acceso fácilmente a lo que está usando un cliente.

Aquí hay un enlace a una muy buena guía de repositorios:

También vale la pena leer los artículos en Wikipedia.


El directorio troncal es el directorio con el que probablemente esté más familiarizado, porque se usa para guardar los cambios más recientes. Su base de código principal debe estar en el tronco.

El directorio de sucursales es para sujetar tus sucursales, sean las que sean.

El directorio de etiquetas es básicamente para etiquetar un determinado conjunto de archivos. Usted hace esto para cosas como lanzamientos, donde quiere que "1.0" sea estos archivos en estas revisiones y "1.1" que sean estos archivos en estas revisiones. Normalmente no modificas las etiquetas una vez que están hechas. Para obtener más información sobre las etiquetas, consulte el Capítulo 4. Ramificación y fusión (en Control de versiones con Subversion ).


En primer lugar, como señalan @AndrewFinnell y @KenLiu, en SVN los nombres de los directorios en sí mismos no significan nada, "troncales, ramas y etiquetas" son simplemente una convención común que es utilizada por la mayoría de los repositorios. No todos los proyectos usan todos los directorios (es bastante común que no se usen "etiquetas" en absoluto), y de hecho, nada impide que los llames como te gustaría, aunque romper la convención es a menudo confuso.

Describiré probablemente el escenario de uso más común de ramas y etiquetas, y daré un ejemplo de cómo se usan.

  • Tronco : principal área de desarrollo. Aquí es donde vive su próxima versión importante del código, y generalmente tiene todas las características más nuevas.

  • Ramas : Cada vez que liberas una versión principal, se crea una rama. Esto le permite hacer correcciones de errores y hacer una nueva versión sin tener que liberar las funciones más nuevas, posiblemente sin terminar o no probadas.

  • Etiquetas : cada vez que lanzas una versión (versión final, versión candidata (RC) y betas) creas una etiqueta para ella. Esto le da una copia puntual del código tal como estaba en ese estado, lo que le permite volver atrás y reproducir cualquier error si es necesario en una versión anterior, o volver a lanzar una versión anterior exactamente como estaba. Las ramas y etiquetas en SVN son ligeras: en el servidor, no hace una copia completa de los archivos, solo un marcador que dice "estos archivos se copiaron en esta revisión" que solo ocupa unos pocos bytes. Con esto en mente, nunca debe preocuparse por crear una etiqueta para cualquier código publicado. Como dije anteriormente, las etiquetas a menudo se omiten y, en cambio, un registro de cambios u otro documento aclara el número de revisión cuando se realiza una publicación.

Por ejemplo, digamos que empiezas un nuevo proyecto. Comienzas a trabajar en "troncal", en lo que finalmente se lanzará como la versión 1.0.

  • tronco / - versión de desarrollo, que pronto será 1.0
  • ramas / - vacio

Una vez que finaliza la versión 1.0.0, ramifica el tronco en una nueva rama "1.0" y crea una etiqueta "1.0.0". Ahora el trabajo en lo que eventualmente será 1.1 continúa en baúl.

  • tronco / - versión de desarrollo, que pronto será 1.1
  • sucursales / 1.0 - 1.0.0 versión de lanzamiento
  • tags / 1.0.0 - 1.0.0 versión de lanzamiento

Te encuentras con algunos errores en el código, los arreglas en el tronco y luego fusionas los arreglos en la rama 1.0. También puede hacer lo contrario, y corregir los errores en la rama 1.0 y luego combinarlos de nuevo en el tronco, pero normalmente los proyectos se adhieren a la fusión de una sola vía para disminuir la posibilidad de perder algo. A veces, un error solo se puede corregir en 1.0 porque está obsoleto en 1.1. Realmente no importa: solo quiere asegurarse de no lanzar la versión 1.1 con los mismos errores que se han corregido en la versión 1.0.

  • tronco / - versión de desarrollo, que pronto será 1.1
  • sucursales / 1.0 - próxima versión 1.0.1
  • tags / 1.0.0 - 1.0.0 versión de lanzamiento

Una vez que encuentre suficientes errores (o tal vez un error crítico), decide hacer una versión 1.0.1. Así que crea una etiqueta "1.0.1" desde la rama 1.0 y libera el código. En este punto, el troncal contendrá lo que será 1.1, y la rama "1.0" contiene el código 1.0.1. La próxima vez que lance una actualización a 1.0, sería 1.0.2.

  • tronco / - versión de desarrollo, que pronto será 1.1
  • sucursales / 1.0 - próxima versión 1.0.2
  • tags / 1.0.0 - 1.0.0 versión de lanzamiento
  • tags / 1.0.1 - 1.0.1 versión de lanzamiento

Eventualmente, estás casi listo para la versión 1.1, pero primero quieres hacer una versión beta. En este caso, es probable que hagas una rama "1.1" y una etiqueta "1.1beta1". Ahora, el trabajo en lo que será 1.2 (o 2.0 tal vez) continúa en el tronco, pero el trabajo en 1.1 continúa en la rama "1.1".

  • tronco / - versión de desarrollo, que pronto será 1.2
  • sucursales / 1.0 - próxima versión 1.0.2
  • sucursales / 1.1 - próximo lanzamiento 1.1.0
  • tags / 1.0.0 - 1.0.0 versión de lanzamiento
  • tags / 1.0.1 - 1.0.1 versión de lanzamiento
  • tags / 1.1beta1 - 1.1 beta 1 versión de lanzamiento

Una vez que lanzas la versión 1.1 final, haces una etiqueta "1.1" de la rama "1.1".

También puede continuar manteniendo 1.0 si lo desea, portando correcciones de errores entre las tres ramas (1.0, 1.1 y troncal). Lo importante es que por cada versión principal del software que está manteniendo, tiene una rama que contiene la última versión del código para esa versión.

Otro uso de las ramas es para características. Aquí es donde se bifurca el tronco (o una de sus ramas de lanzamiento) y se trabaja en una nueva función de forma aislada. Una vez que se completa la función, vuelve a combinarla y elimina la rama.

  • tronco / - versión de desarrollo, que pronto será 1.2
  • sucursales / 1.1 - próximo lanzamiento 1.1.0
  • sucursales / ui-rewrite - rama característica experimental

La idea de esto es cuando estás trabajando en algo disruptivo (que podría retrasar o interferir con otras personas para que no realicen su trabajo), algo experimental (que puede que ni siquiera lo logre), o posiblemente algo que demore mucho tiempo. (y tiene miedo si se sostiene una versión 1.2 cuando esté listo para derivar 1.2 desde el tronco), puede hacerlo de forma aislada en la rama. Por lo general, lo mantiene actualizado con el tronco combinando cambios en él todo el tiempo, lo que hace que sea más fácil volver a integrarlo (fusionarse con el tronco) cuando haya terminado.

También tenga en cuenta que el esquema de versiones que usé aquí es solo uno de muchos. Algunos equipos hacen correcciones de errores / versiones de mantenimiento como 1.1, 1.2, etc., y cambios importantes como 1.x, 2.x, etc. El uso aquí es el mismo, pero puede llamar a la rama "1" o "1 .x "en lugar de" 1.0 "o" 1.0.x ". (Aparte, el control de versiones semántico es una buena guía sobre cómo hacer números de versión).


Encontré este gran tutorial sobre SVN cuando buscaba en el sitio web del author del author de recetas de programación de aplicaciones de visión de computadora OpenCV 2 y pensé que debía compartirlo.

Tiene un tutorial sobre cómo usar SVN y lo que significan las frases 'tronco', 'etiqueta' y 'rama'.

Citado directamente de su tutorial:

La versión actual de su proyecto de software, en el que trabaja su equipo actualmente, generalmente se encuentra en un directorio llamado troncal . A medida que el proyecto evoluciona, el desarrollador actualiza los errores que corrigen la versión, agrega nuevas funciones y envía los cambios en ese directorio.

En cualquier momento dado, es posible que desee congelar una versión y capturar una instantánea del software tal como está en esta etapa del desarrollo. Esto generalmente corresponde a las versiones oficiales de su software, por ejemplo, las que entregará a sus clientes. Estas instantáneas se encuentran en el directorio de etiquetas de su proyecto.

Finalmente, a menudo es útil crear, en algún momento, una nueva línea de desarrollo para su software. Esto sucede, por ejemplo, cuando desea probar una implementación alternativa en la que tiene que modificar su software pero no desea enviar estos cambios al proyecto principal hasta que decida si adopta la nueva solución. El equipo principal puede continuar trabajando en el proyecto mientras otros desarrolladores trabajan en el prototipo. Debería poner estas nuevas líneas de desarrollo del proyecto bajo un directorio llamado sucursales .


Hmm, no estoy seguro de estar de acuerdo con que la etiqueta Nick re sea similar a una rama. Una etiqueta es solo un marcador

  • Trunk sería el cuerpo principal del desarrollo, desde el inicio del proyecto hasta el presente.

  • Branch será una copia del código derivado de un cierto punto en el troncal que se utiliza para aplicar cambios importantes en el código y preservar la integridad del código en el troncal. Si los cambios principales funcionan de acuerdo con el plan, generalmente se fusionan nuevamente en el tronco.

  • Tag será un punto en el tiempo en el tronco o una rama que desea conservar. Las dos razones principales para la conservación serían que esta es una versión importante del software, ya sea alfa, beta, RC o RTM, o este es el punto más estable del software antes de que se apliquen las revisiones más importantes en el tronco.

En los proyectos de código abierto, las principales sucursales que no son aceptadas en el troncal por parte de las partes interesadas del proyecto pueden convertirse en la base de los tenedores , por ejemplo, proyectos totalmente separados que comparten un origen común con otro código fuente.


No estoy realmente seguro de qué es la "etiqueta", pero la rama es un concepto de control de fuente bastante común.

Básicamente, una rama es una forma de trabajar en los cambios en el código sin afectar el tronco. Digamos que quieres agregar una nueva característica que es bastante complicada. Desea poder verificar los cambios a medida que los realiza, pero no desea que afecte al tronco hasta que haya terminado con la función.

Primero crearías una rama. Esto es básicamente una copia del tronco desde el momento en que hizo la rama. Entonces harías todo tu trabajo en la rama. Cualquier cambio realizado en la rama no afecta al tronco, por lo que el tronco aún se puede utilizar, lo que permite que otros continúen trabajando allí (como hacer correcciones de errores o pequeñas mejoras). Una vez que haya completado su función, integrará la rama nuevamente en el tronco. Esto movería todos tus cambios de la rama al tronco.

Hay una serie de patrones que las personas usan para las ramas. Si tiene un producto con varias versiones principales admitidas a la vez, generalmente cada versión sería una rama. Donde trabajo tenemos una rama de control de calidad y una rama de producción. Antes de lanzar nuestro código a QA, integramos los cambios a la rama de QA y luego implementamos desde allí. Al realizar la liberación a producción, integramos desde la rama de control de calidad a la rama de producción, por lo que sabemos que el código que se ejecuta en producción es idéntico al que probó el control de calidad.

Aquí está la entrada de Wikipedia en las ramas , ya que probablemente explican las cosas mejor que yo. :)


Realmente no tienen ningún significado formal. Una carpeta es una carpeta para SVN. Son una forma generalmente aceptada de organizar tu proyecto.

  • El tronco es donde mantienes tu línea principal de desarrollo. La carpeta de sucursales es donde puedes crear, bueno, sucursales, que son difíciles de explicar en una breve publicación.

  • Una rama es una copia de un subconjunto de su proyecto en el que trabaja por separado del tronco. Tal vez sea para experimentos que no vayan a ninguna parte, o tal vez para la próxima versión, que luego volverá a fusionar con el tronco cuando se estabilice.

  • Y la carpeta de etiquetas es para crear copias etiquetadas de su repositorio, generalmente en los puntos de control de liberación.

Pero como dije, para SVN, una carpeta es una carpeta. branch , trunk y etiqueta son solo una convención.

Estoy usando la palabra "copia" liberalmente. SVN no hace copias completas de las cosas en el repositorio.


Una de las razones por las que todos tienen una definición ligeramente diferente es porque Subversion implementa soporte cero para sucursales y etiquetas. Básicamente, Subversion dice: vimos ramas y etiquetas con todas las funciones en otros sistemas y no las encontramos útiles, por lo que no implementamos nada. Simplemente haga una copia en un nuevo directorio con una convención de nombres en su lugar . Entonces, por supuesto, todos son libres de tener convenciones ligeramente diferentes. Para comprender la diferencia entre una etiqueta real y una mera convención de copia + denominación, consulte la entrada de Wikipedia Etiquetas y ramas de Subversion .


Tronco : Después de completar cada sprint en Agile, salimos con un producto parcialmente despachable. Estos lanzamientos se mantienen en baúl.

Sucursales : Todos los códigos de desarrollo paralelos para cada sprint en curso se mantienen en las sucursales.

Etiquetas : Cada vez que lanzamos una versión beta de un producto que se puede enviar parcialmente, creamos una etiqueta para él. Esto nos da el código que estaba disponible en ese momento, lo que nos permite volver a ese estado si es necesario en algún momento durante el desarrollo.





trunk