¿Qué significan "rama", "etiqueta" y "tronco" en los repositorios de Subversion?


1193

He visto mucho estas palabras en torno a las discusiones de Subversion (y supongo que en el repositorio general).
He estado usando SVN para mis proyectos durante los últimos años, pero nunca he entendido el concepto completo de estos directorios.

¿Qué quieren decir?


29
Aquí hay un buen artículo que encontré explicando cómo / cuándo usar el tronco, la rama y las etiquetas. No había usado el control de fuente antes, pero este artículo lo hizo bastante fácil de entender para un novato como yo. Día a día con Subversion
badmoon

Respuestas:


910

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

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

  • Branch será una copia del código derivado de un cierto punto en el enlace troncal que se utiliza para aplicar cambios importantes al código mientras se preserva la integridad del código en el enlace troncal. Si los cambios principales funcionan según el plan, generalmente se fusionan nuevamente en el tronco.

  • La etiqueta será un momento en el tronco o una rama que desea conservar. Las dos razones principales para la preservación serían que esta es una versión principal del software, ya sea alfa, beta, RC o RTM, o este es el punto más estable del software antes de que se aplicaran revisiones importantes en el tronco.

En proyectos de código abierto, las ramas principales que no son aceptadas en el tronco por 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.

Los subárboles de rama y etiqueta se distinguen del tronco de las siguientes maneras:

Subversion permite a los administradores de sistemas crear scripts de enlace que se activan para su ejecución cuando ocurren ciertos eventos; por ejemplo, cometer un cambio en el repositorio. Es muy común que una implementación típica del repositorio de Subversion trate cualquier ruta que contenga "/ tag /" para que esté protegida contra escritura después de la creación; El resultado neto es que las etiquetas, una vez creadas, son inmutables (al menos para los usuarios "normales"). Esto se realiza a través de los scripts de enlace, que imponen la inmutabilidad al evitar cambios adicionales si la etiqueta es un nodo principal del objeto cambiado.

Subversion también ha agregado características, desde la versión 1.5, relacionadas con el "seguimiento de fusión de sucursales" para que los cambios comprometidos con una rama puedan fusionarse nuevamente en el tronco con soporte para la fusión incremental "inteligente".


284
La confusión con las etiquetas y las ramas es que en svn realmente no hay distinción entre ellas, además del nombre del directorio. En svn puede confirmar cambios en una etiqueta, y de hecho es difícil evitarlo. La mayoría de los otros VCS tratan las etiquetas como instantáneas inmutables (puntos en el tiempo).
Ken Liu el

44
TagsEl directorio también se usa a menudo para pruebas y verificación de hitos por parte del usuario habitual. Este sería un buen lugar para poner un prototipo también (solo algunas ideas sobre mi cabeza).
Jeff Noel

66
@KenLiu Hay ganchos que pueden hacer que las etiquetas sean inmutables. Es decir, puede crear y retirar una etiqueta, pero no realizar ningún cambio. Por supuesto, una etiqueta que es solo parte del repositorio significa que el historial completo está disponible. Si alguien cambia una etiqueta, puede rastrear eso y por qué. En muchos VCS, si modifica una etiqueta, es posible que no haya forma de saberlo.
David W.

3
Tal vez deberían mencionarse las ramas estables : los cambios realizados allí normalmente no se fusionan nuevamente en el tronco .
Wolf

44
Tengo entendido que en un "mundo perfecto" no debería ocurrir ningún desarrollo en el tronco, el tronco siempre debe ser el código exacto que está en vivo o el código que está a punto de ser lanzado en vivo. como tal que haría de las ramas el principal cuerpo de desarrollo.
MikeT

556

En primer lugar, como señalan @AndrewFinnell y @KenLiu, en SVN los nombres de directorio en sí mismos no significan nada: "troncal, ramas y etiquetas" son simplemente una convención común utilizada por la mayoría de los repositorios. No todos los proyectos usan todos los directorios (es razonablemente común no usar "etiquetas") y, de hecho, nada le impide llamarlos como desee, aunque romper la convención a menudo es confuso.

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

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

  • Ramas : cada vez que lanzas una versión principal, se crea una rama. Esto le permite hacer correcciones de errores y hacer una nueva versión sin tener que lanzar las características más recientes, posiblemente sin terminar o sin probar.

  • Etiquetas : cada vez que lanza una versión (versión final, versión candidatas (RC) y versiones beta), crea una etiqueta para ella. Esto le proporciona una copia del código en un punto en el tiempo tal como estaba en ese estado, lo que le permite regresar 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 livianas: 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 ningún 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 un lanzamiento.


Por ejemplo, supongamos que comienza un nuevo proyecto. Empiezas a trabajar en "trunk", en lo que finalmente se lanzará como versión 1.0.

  • tronco / - versión de desarrollo, próximamente 1.0
  • ramas / - vacías

Una vez que finaliza 1.0.0, ramifica el tronco en una nueva rama "1.0" y crea una etiqueta "1.0.0". Ahora trabaje en lo que finalmente será 1.1 continúa en el tronco

  • 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 reparas en el tronco y luego combinas las correcciones en la rama 1.0. También puede hacer lo contrario y corregir los errores en la rama 1.0 y luego fusionarlos nuevamente con el tronco, pero comúnmente los proyectos se quedan con la fusión en un solo sentido para disminuir la posibilidad de perder algo. A veces, un error solo se puede corregir en 1.0 porque es obsoleto en 1.1. Realmente no importa: solo desea asegurarse de no lanzar 1.1 con los mismos errores que se han corregido en 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. Entonces crea una etiqueta "1.0.1" desde la rama 1.0 y libera el código. En este punto, el tronco 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

Finalmente, está casi listo para lanzar la versión 1.1, pero primero desea hacer una versión beta. En este caso, probablemente haga una rama "1.1" y una etiqueta "1.1beta1". Ahora, el trabajo en lo que será 1.2 (o tal vez 2.0) continúa en el tronco, pero el trabajo en 1.1 continúa en la rama "1.1".

  • tronco / - versión de desarrollo, próximamente 1.2
  • sucursales / 1.0 - próxima versión 1.0.2
  • sucursales / 1.1 - próxima versión 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 liberas 1.1 final, haces una etiqueta "1.1" desde 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). La conclusión importante es que para 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 las características. Aquí es donde ramifica el tronco (o una de sus ramas de lanzamiento) y trabaja en una nueva característica de forma aislada. Una vez que se completa la función, la vuelve a fusionar y elimina la rama.

  • tronco / - versión de desarrollo, próximamente 1.2
  • sucursales / 1.1 - próxima versión 1.1.0
  • sucursales / ui-rewrite - rama de características experimentales

La idea de esto es cuando estás trabajando en algo disruptivo (que podría retrasar o interferir con otras personas para que hagan su trabajo), algo experimental (que tal vez ni siquiera lo logre), o posiblemente algo que lleva mucho tiempo (y tiene miedo de que mantenga una versión 1.2 cuando esté listo para ramificarse 1.2 desde el tronco), puede hacerlo de forma aislada en rama. En general, lo mantiene actualizado con troncal fusionando los cambios en él todo el tiempo, lo que facilita la reintegración (fusión a troncal) cuando haya terminado.


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


66
@baruch - Eso está completamente mal. Las etiquetas son livianas y son (en lo que respecta a Subversion en sí) idénticas a las ramas.
Josh Kelley

77
Me encanta el detalle del caso de uso. Gracias @gregmac.
Jeromy French

2
¿Puedo obtener un presupuesto sobre dónde se dice que las etiquetas / ramas son livianas? No parece ser así ..
Cardin Lee JH

3
Esta debería ser la respuesta aceptada, que es mucho mejor ^^
Nam G VU

44
@Cardin No tengo referencia en este momento, pero es importante tener en cuenta que las etiquetas son livianas en el servidor, pero no en el cliente. Si revisa todas las etiquetas, obtendrá tantas copias completas. Sin embargo, si observa el tamaño del repositorio en el servidor, solo aumentará unos pocos bytes por etiqueta. Esta es la razón por la que no debe pagar el directorio raíz, en general.
gregmac

97

Además de lo que Nick ha dicho, puede encontrar más información en Streamed Lines: Patrones de ramificación para el desarrollo de software paralelo

ingrese la descripción de la imagen aquí

En esta figura mainestá el tronco, rel1-maintes una rama y 1.0es una etiqueta.


1
@Wolf podría ser, ese diagrama es bastante genérico independientemente de las herramientas. Todos los SCM usan palabras diferentes pero los mismos conceptos, no hay diferencia entre troncal y Principal; o baúl y amo. Ese diagrama muestra cómo mi compañía actual usa SVN.
gbjbaanb

@gbjbaanb Gracias por compartir. ... y las etiquetas no parecen ser abordadas por la pregunta. ¿Es pura coincidencia (también en su empresa actual) que ninguna fusión vaya de sucursales principales a sucursales mantenidas?
Wolf

@ Wolf No es casualidad: solo bifurca del tronco, haz el trabajo, vuelve a unirte al tronco. Luego bifurca del tronco a una rama etiqueta. Estamos considerando otra 'troncal' llamada Integración que ha terminado las ramas fusionadas para la prueba que no constituye una versión, la troncal todavía se usa para aquellas ramas que decidimos poner en la próxima versión. La única vez que se fusiona de una troncal a una rama es actualizar una rama de larga ejecución, pero es mejor (y más fácil) simplemente crear una nueva rama de la troncal y fusionar los cambios de su antigua rama si es necesario.
gbjbaanb

75

En general (vista agnóstica de herramientas), una rama es el mecanismo utilizado para el desarrollo paralelo. Un SCM puede tener de 0 a n ramas. Subversion tiene 0.

  • Trunk es una rama principal recomendada por Subversion , pero de ninguna manera estás obligado a crearla. ¡Podría llamarlo 'principal' o 'lanzamientos', o no tener uno en absoluto!

  • Branch representa un esfuerzo de desarrollo. Nunca debe nombrarse después de un recurso (como 'vonc_branch') sino después de:

    • un propósito 'myProject_dev' o 'myProject_Merge'
    • un perímetro de liberación 'myProjetc1.0_dev'o myProject2.3_Merge' o 'myProject6..2_Patch1' ...
  • Tag es una instantánea de archivos para volver fácilmente a ese estado. El problema es que la etiqueta y la rama son las mismas en Subversion . Y definitivamente recomendaría el enfoque paranoico:

    puede usar uno de los scripts de control de acceso provistos con Subversion para evitar que alguien haga algo más que crear nuevas copias en el área de etiquetas.

Una etiqueta es final. Su contenido nunca debería cambiar. NUNCA. Siempre. ¿Olvidó una línea en la nota de lanzamiento? Crea una nueva etiqueta. Obsoleto o eliminar el viejo.

Ahora, leo mucho sobre "fusionar tal y tal en tal y tal rama, y ​​finalmente en la rama del tronco". Eso se llama flujo de trabajo de fusión y no hay nada obligatorio aquí . No es porque tenga una rama troncal que deba fusionar nada.

Por convención, la rama troncal puede representar el estado actual de su desarrollo, pero eso es para un proyecto secuencial simple, que es un proyecto que tiene:

  • sin desarrollo 'por adelantado' (para la preparación de la próxima versión siguiente que implica tales cambios que no son compatibles con el desarrollo 'troncal' actual)
  • sin refactorización masiva (para probar una nueva opción técnica)
  • sin mantenimiento a largo plazo de una versión anterior

Porque con uno (o todos) de esos escenarios, obtienes cuatro 'troncos', cuatro 'desarrollos actuales', y no todo lo que haces en esos desarrollos paralelos necesariamente tendrá que fusionarse nuevamente en 'troncal'.


38

En SVN, una etiqueta y una rama son muy similares.

Etiqueta = un segmento definido en el tiempo, generalmente usado para lanzamientos

Branch = también un segmento definido en el tiempo en el que el desarrollo puede continuar, generalmente se usa para versiones principales como 1.0, 1.5, 2.0, etc., luego, cuando lo libera, etiqueta la rama. Esto le permite continuar admitiendo una versión de producción mientras avanza con cambios importantes en el tronco

Troncal = espacio de trabajo de desarrollo, aquí es donde debería ocurrir todo el desarrollo, y luego los cambios se fusionaron con las versiones de la rama.


30

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

  • El tronco es donde mantiene su línea principal de desarrollo. La carpeta de ramas es donde puedes crear, bueno, ramas, 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 podrían no llegar a ningún lado, o tal vez sea para la próxima versión, que luego fusionará nuevamente en el tronco cuando se estabilice.

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

Pero como dije, para SVN, una carpeta es una carpeta. branch, trunky tag son solo una convención.

Estoy usando la palabra 'copiar' generosamente. SVN en realidad no hace copias completas de las cosas en el repositorio.


13

El enlace troncal es la línea de desarrollo que contiene el código fuente y las funciones más recientes. Debería 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 otro modo rompería la construcción. Las nuevas características a menudo se crean en una rama y luego se fusionan nuevamente en el tronco. Las ramas a menudo contienen código que no está necesariamente aprobado para la línea de desarrollo desde la que se bifurcó. Por ejemplo, un programador podría intentar una optimización en algo en una rama y solo fusionarse nuevamente 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 mayor frecuencia para tomar una copia de lo que se lanzó a un cliente para que pueda tener acceso fácilmente a lo que está utilizando 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.


12

Ahora que es lo que pasa con el desarrollo de software, no hay un conocimiento consistente sobre nada, todo el mundo parece tenerlo a su manera, pero eso es porque es una disciplina relativamente joven de todos modos.

Aquí está mi manera simple y simple,

trunk : el directorio de trunk contiene el cuerpo de trabajo más actual, aprobado y fusionado. Al contrario de lo que muchos han confesado, mi baúl es solo para trabajo limpio, ordenado y aprobado, y no es un área de desarrollo, sino más bien un área de liberación.

En un momento dado, cuando el tronco parece estar listo para liberarse, se etiqueta y se libera.

sucursales : el directorio de sucursales contiene experimentos y trabajos en curso. El trabajo debajo de una rama permanece allí hasta que se apruebe su fusión en el tronco. Para mí, esta es el área donde se realiza todo el trabajo.

Por ejemplo: puedo tener una rama de iteración 5 para una quinta ronda de desarrollo del producto, tal vez una rama prototipo 9 para una novena ronda de experimentación, y así sucesivamente.

etiquetas : el directorio de etiquetas contiene instantáneas de las ramas aprobadas y las versiones troncales. Cada vez que se aprueba la fusión de una rama en el tronco, o se realiza una liberación del tronco, se realiza una instantánea de la rama aprobada o la liberación del tronco debajo de las etiquetas.

Supongo que con las etiquetas puedo saltar de un lado a otro en el tiempo para señalar puntos de interés con bastante facilidad.


10

Encontré este gran tutorial sobre SVN cuando estaba buscando el sitio web del autor del libro de cocina de programación de aplicaciones de visión por computadora OpenCV 2 y pensé que debería compartirlo.

Tiene un tutorial sobre cómo usar SVN y lo que significan las frases 'trunk', 'tag' y 'branch'.

Citado directamente de su tutorial:

La versión actual de su proyecto de software, en la que su equipo está trabajando actualmente, generalmente se encuentra en un directorio llamado troncal . A medida que el proyecto evoluciona, el desarrollador actualiza esa versión para corregir errores, agrega nuevas funciones) y envía sus cambios en ese directorio.

En cualquier momento, 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 que otros desarrolladores trabajan en el prototipo. Pondría estas nuevas líneas de desarrollo del proyecto en un directorio llamado sucursales .


9

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

El directorio de sucursales es para mantener sus sucursales, sean las que sean.

El directorio de etiquetas es básicamente para etiquetar un determinado conjunto de archivos. Lo hace para cosas como lanzamientos, donde desea que "1.0" sean estos archivos en estas revisiones y "1.1" sean estos archivos en estas revisiones. Por lo general, no modifica 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 ).


9

Una de las razones por las cuales todos tienen una definición ligeramente diferente es porque Subversion implementa cero soporte para ramas y etiquetas. Subversion básicamente dice: Observamos 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 un nombre de convenciones lugar . Entonces, por supuesto, todos son libres de tener convenciones ligeramente diferentes. Para comprender la diferencia entre una etiqueta real y una simple convención de copia + nomenclatura, consulte la entrada de Wikipedia Etiquetas y ramas de Subversion .


8

Etiqueta = un segmento definido en el tiempo, generalmente usado 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 cual me parece bastante confuso: un sistema de control de revisión que no sabe nada sobre ramas o etiquetas. Desde el punto de vista de la implementación, creo que la forma de Subversion de crear "copias" es muy inteligente, pero tener que saberlo es lo que llamaría una abstracción permeable .

O tal vez he estado usando CVS demasiado tiempo.


Una perspectiva alternativa es que lo contrario es cierto, que imponer el concepto de etiquetas en el modelo de objeto de subversión sería una abstracción permeable en la dirección opuesta. Como supongo que ya sabes, la subversión fue una reacción a CVS, un intento de "hacer CVS correctamente". No pude encontrar la referencia, pero los diseñadores de subversión originales han dicho que descartaron el concepto de etiquetas 100% deliberadamente, que la distinción entre ramas y etiquetas es puramente una cuestión de política. Si los equipos quieren imponer políticas y convenciones sobre el modelo de objetos de subversion, que así sea. Eso es exactamente lo que tenemos hoy.
Darryl

6

Creo que parte de la confusión proviene de la diferencia entre el concepto de una etiqueta y la implementación en SVN. Para SVN, una etiqueta es una rama que es una copia. La modificación de etiquetas se considera incorrecta y, de hecho, herramientas como TortoiseSVN le avisarán si intenta modificar algo con ../tags/ .. en la ruta.


5

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

Básicamente, una rama es una forma de trabajar en cambios en el código sin afectar el tronco. Digamos que desea agregar una nueva característica que es bastante complicada. Desea poder registrar los cambios a medida que los realiza, pero no desea que afecten 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 sucursal. Los cambios realizados en la rama no afectan a la troncal, por lo que la troncal aún puede utilizarse, lo que permite que otros continúen trabajando allí (como hacer correcciones de errores o pequeñas mejoras). Una vez que haya terminado su función, integraría la rama nuevamente en el tronco. Esto movería todos sus cambios de la rama a la troncal.

Hay una serie de patrones que las personas usan para las ramas. Si tiene un producto con múltiples versiones principales compatibles a la vez, generalmente cada versión sería una rama. Donde trabajo tenemos una sucursal de control de calidad y una sucursal de producción. Antes de lanzar nuestro código al control de calidad, integramos los cambios en la rama de control de calidad y luego lo implementamos desde allí. Al lanzar 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 a lo que probó el control de calidad.

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


4

Tronco : después de completar cada sprint en ágil, salimos con un producto parcialmente enviable. Estas versiones se mantienen en el maletero.

Sucursales : todos los códigos de desarrollos paralelos para cada sprint en curso se mantienen en sucursales.

Etiquetas : cada vez que lanzamos una versión beta de un producto parcialmente enviable, hacemos una etiqueta para ello. 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.


Este es su flujo de trabajo particular, no es aplicable en general.
Jason S

4

Para las personas familiarizadas con GIT, master en GIT es equivalente a troncal en SVN.

La rama y la etiqueta tienen la misma terminología tanto en GIT como en SVN.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.