617 votos

¿Cuál es la diferencia entre una etiqueta y una rama en git?

Esta es probablemente una pregunta fácil, pero tengo algunas dificultades para entender cómo usar etiquetas vs. ramas en el git. Si hay alguna documentación que debería estar leyendo, siéntase libre de señalármela.

La situación en la que me encuentro es que acabo de mover la versión actual de nuestro código de CVS a Git y ahora voy a estar trabajando en un subconjunto de ese código para una característica en particular. Algunos otros desarrolladores también trabajarán en esto, pero no todos los desarrolladores de nuestro grupo se preocuparán por esta característica. ¿Debería crear una rama o una etiqueta? ¿Cuál es la idea general de cuándo debería usar una en lugar de la otra?

530voto

Jakub Narębski Puntos 87537

Desde el teórico punto de vista:

  • etiquetas son nombres simbólicos para un determinado revisión . Siempre apuntan al mismo objeto (normalmente: a la misma revisión); no cambian.
  • sucursales son nombres simbólicos para línea de desarrollo . Los nuevos commits se crean en la parte superior de la rama. El puntero de la rama avanza naturalmente, apuntando a lo más nuevo commits.

Desde el técnico punto de vista:

  • etiquetas residen en refs/tags/ espacio de nombres, y puede apuntar a etiquetar los objetos (anotado y opcionalmente con etiquetas firmadas por GPG) o directamente a commit objeto (etiqueta ligera menos usada para los nombres locales), o en casos muy raros hasta objeto de árbol o objeto de la mancha (por ejemplo, la firma de GPG).
  • sucursales residen en refs/heads/ espacio de nombres, y sólo puede apuntar a commit objetos . El HEAD El puntero debe referirse a una rama (referencia simbólica) o directamente a una commit (cabeza separada o rama sin nombre).
  • ramas de rastreo remoto residen en refs/remotes/<remote>/ espacio de nombres, y seguir las ramas ordinarias en el repositorio remoto <remote> .

Ver también gitglosario manga:

sucursal

Una "rama" es una línea activa de desarrollo. La más reciente commit en una rama se denomina la punta de esa rama. La punta de la rama se refiere a la cabeza de la misma, que avanza a medida que se realiza un desarrollo adicional en la rama. Un solo repositorio git puede rastrear un número arbitrario de ramas, pero tu árbol de trabajo está asociado a una sola de ellas (la rama "actual" o "sacada"), y HEAD apunta a esa rama.

etiqueta

Un árbitro señalando una etiqueta o un objeto commit. A diferencia de una cabeza, una etiqueta no se cambia por un commit. Las etiquetas (no los objetos de las etiquetas) se almacenan en $GIT_DIR/refs/tags/ . [...]. Una etiqueta se usa más típicamente para marcar un punto particular en la cadena de ascendencia commit.

objeto de la etiqueta

Un objeto que contiene un árbitro que apunta a otro objeto, que puede contener un mensaje como un objeto commit. También puede contener una firma (PGP), en cuyo caso se llama "objeto de etiqueta firmada".

522voto

tvanfosson Puntos 268301

Una etiqueta representa una versión de una rama particular en un momento dado. Una rama representa un hilo de desarrollo separado que puede ejecutarse simultáneamente con otros esfuerzos de desarrollo en la misma base de código. Los cambios en una rama pueden eventualmente ser fusionados de nuevo en otra rama para unificarlos.

Normalmente se etiqueta una versión particular para poder recrearla, por ejemplo, esta es la versión que enviamos a XYZ Corp. Una sucursal es más una estrategia para proporcionar actualizaciones continuas de una versión particular del código mientras se continúa desarrollando en ella. Harás una rama de la versión entregada, continuarás el desarrollo en la línea principal, pero harás correcciones de errores en la rama que representa la versión entregada. Eventualmente, fusionarás estas correcciones de errores de nuevo en la línea principal. A menudo usarás tanto la ramificación como el etiquetado juntos. Tendrás varias etiquetas que se pueden aplicar tanto a la línea principal como a sus ramas que marcan versiones particulares (las que se entregan a los clientes, por ejemplo) a lo largo de cada rama que quieras recrear -- para la entrega, el diagnóstico de errores, etc.

En realidad es más complicado que esto - o tan complicado como quieras hacerlo - pero estos ejemplos deberían darte una idea de las diferencias.

42voto

VonC Puntos 414372

Lo que tienes que darte cuenta, viniendo de CVS, es que ya no creas directorios cuando se establece una sucursal.
No más "etiqueta adhesiva" (que se puede aplicar a una sola carpeta), o "etiqueta de rama".
Las ramas y las etiquetas son dos objetos diferentes en Git, y siempre se aplican a la todos repo.

Ya no tendrías (con SVN esta vez) que estructurar explícitamente tu repositorio con:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

Esa estructura viene del hecho de que el CVS es un sistema de revisión y no un sistema de versiones (véase ¿Control de la fuente vs. Control de Revisión? ).
Eso significa que las ramas son emuladas a través de etiquetas para CVS, copias de directorio para SVN.

Su pregunta tiene sentido si usted está acostumbrado a pagar una etiqueta, y empezar a trabajar en él .
Lo cual no deberías ;)
Se supone que una etiqueta representa una inmutable de la empresa, que sólo se utiliza para acceder a ella con la garantía de obtener el mismo contenido cada vez.

En Git, la historia de las revisiones es una serie de commits, formando un gráfico.
Una rama es un camino de ese gráfico

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Si compruebas una etiqueta, tendrás que crear una rama para empezar a trabajar a partir de ella.
  • Si compruebas una rama, verás directamente la última commit it('HEAD') de esa rama.

Ver La respuesta de Jakub Narębski para todos los tecnicismos, pero francamente, en este punto, no necesitas (todavía) todos los detalles ;)

El punto principal es: una etiqueta siendo un simple puntero a un commit, nunca podrá modificar su contenido. Necesitas una rama.


En su caso, cada desarrollador trabajando en una característica específica:

  • deben crear su propia sucursal en su respectivo depósito
  • rastrear las ramas de los depósitos de sus colegas (el que trabaja en la misma característica)
  • tirando/empujando con el fin de compartir tu trabajo con tus compañeros.

En lugar de rastrear directamente las ramas de tus colegas, podrías rastrear sólo la rama de un repositorio central "oficial" al que cada uno empuja su trabajo para integrar y compartir el trabajo de todos para esta característica en particular.

16voto

Parece que la mejor manera de explicarlo es que las etiquetas actúan como ramas de sólo lectura. Puedes usar una rama como etiqueta, pero puedes actualizarla sin querer con la nueva commits. Se garantiza que las etiquetas apuntan a lo mismo commits siempre que existan.

10voto

Bombe Puntos 34185

El Git Parabel explica cómo se crea un típico DVCS y por qué sus creadores hicieron lo que hicieron. Además, puede que quieras echar un vistazo a Git for Computer Scientist explica lo que hace cada tipo de objeto en Git, incluyendo las ramas y las etiquetas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X