¿Cómo es una etiqueta diferente de una rama en Git? ¿Cuál debería usar aquí?

616

Tengo algunas dificultades para entender cómo usar etiquetas en lugar de ramas en.

Acabo de mover la versión actual de nuestro código de a , y ahora voy a trabajar en un subconjunto de ese código para una característica en particular. Algunos otros desarrolladores también estarán trabajando en esto, pero no todos los desarrolladores de nuestro grupo se preocuparán por esta característica. ¿Debo estar creando una rama o una etiqueta? ¿En qué situaciones debo usar uno versus el otro?

Bialecki
fuente
44
Dado que la búsqueda web sobre cómo usar la etiqueta git me trajo primero a ese enlace, agrego que hay una mejor respuesta (en mi humilde opinión) sobre una etiqueta aquí: stackoverflow.com/questions/35979642/…
Alexei Martianov

Respuestas:

520

Una etiqueta representa una versión de una rama en 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 fusionarse nuevamente en otra rama para unificarlos.

Por lo general, podrás etiquetar una versión particular de modo que usted puede volver a crearlo, por ejemplo, esta es la versión que enviamos a XYZ Corp . Una ramaes más una estrategia para proporcionar actualizaciones continuas en una versión particular del código mientras se continúa desarrollando en él. Hará una rama de la versión entregada, continuará el desarrollo en la línea principal, pero corregirá errores en la rama que representa la versión entregada. Eventualmente, fusionará estas correcciones de errores nuevamente en la línea principal. A menudo utilizará tanto la ramificación como el etiquetado juntos. Tendrá varias etiquetas que pueden aplicarse tanto a la línea principal como a sus ramas que marcan versiones particulares (las entregadas a los clientes, por ejemplo) a lo largo de cada rama que desee recrear: para la entrega, el diagnóstico de errores, etc.

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

tvanfosson
fuente
40
en su caso, quiere usar ramas, tal vez también debería tener esto en cuenta en su respuesta;)
knittl
13
AFAIK, las etiquetas no son únicas por rama. Por lo tanto, no puede dar los mismos nombres para diferentes confirmaciones en ramas separadas.
MI
55
@MY Ciertamente no es algo malo, en mi humilde opinión. Especialmente en la forma descrita por tvanfosson, tener más de una etiqueta con el mismo nombre en diferentes ramas podría ser difícil de mantener. Dado el ejemplo, creo que si pudiera tener etiquetas con el mismo nombre en diferentes ramas, rápidamente se establecería como una mala práctica. Es bueno saber que no puedes, sin embargo. Gracias mi!
Giratorio
28
Una etiqueta es solo un alias para un hash de confirmación. De la misma manera que puede pagar un commit con git checkout 88c9f229fusted, puede hacer algo como esto git checkout your_tagy pagará el commit aliasted por la etiqueta.
jterm
66
@jterm, ¿no son alias de ramas también? La única diferencia es que un alias de rama se remite automáticamente al commit más reciente de la cadena.
Viktor Molokostov
529

Desde el punto de vista teórico :

  • Las etiquetas son nombres simbólicos para una revisión dada . Siempre apuntan al mismo objeto (generalmente: a la misma revisión); No cambian.
  • Las ramas son nombres simbólicos para la línea de desarrollo . Se crean nuevos commits en la parte superior de la rama. El puntero de la rama avanza naturalmente, apuntando a confirmaciones más y más nuevas.

Desde el punto de vista técnico :

  • las etiquetas residen en el refs/tags/espacio de nombres y pueden apuntar a objetos de etiqueta ( etiquetas anotadas y opcionalmente firmadas por GPG) o directamente a un objeto de compromiso (etiqueta ligera menos utilizada para nombres locales), o en casos muy raros incluso a objetos de árbol u objetos de blob (por ejemplo, firma GPG )
  • las ramas residen en el refs/heads/espacio de nombres y solo pueden apuntar a objetos de confirmación . El HEADpuntero debe hacer referencia a una rama (referencia simbólica) o directamente a una confirmación (HEAD separada o rama sin nombre).
  • las ramas de seguimiento remoto residen en el refs/remotes/<remote>/espacio de nombres y siguen ramas normales en el repositorio remoto <remote>.

Consulte también la página de manual de gitglossary :

rama

Una "rama" es una línea activa de desarrollo. La confirmación más reciente en una rama se conoce como la punta de esa rama. La punta de la rama está referenciada por una cabeza de rama, que avanza a medida que se realiza un desarrollo adicional en la rama. Un único repositorio de git puede rastrear un número arbitrario de ramas, pero su árbol de trabajo está asociado con solo una de ellas (la rama "actual" o "extraída"), y HEAD apunta a esa rama.

etiqueta

Una referencia apuntando a una etiqueta u objeto de confirmación. A diferencia de un encabezado, una etiqueta no se cambia por una confirmación. Las etiquetas (no los objetos de etiqueta) se almacenan en $GIT_DIR/refs/tags/. [...] Una etiqueta se usa generalmente para marcar un punto particular en la cadena de ascendencia de confirmación.

objeto de etiqueta

Un objeto que contiene una referencia que apunta a otro objeto, que puede contener un mensaje como un objeto de confirmación. También puede contener una firma (PGP), en cuyo caso se denomina "objeto de etiqueta firmada".

Jakub Narębski
fuente
36
Pregunta: si trata una rama como una etiqueta (es decir, la crea, luego nunca la actualiza), ¿hay alguna diferencia real?
Steve Bennett
30
@SteveBennett absolutamente. Contiene información diferente (puede firmar una etiqueta, puede agregar una descripción a una rama). Puede mover una rama (por lo que incluso si nunca la actualiza, aún puede volver a crearla). No puede mover una etiqueta (está vinculada a una confirmación específica). Puedes elegir empujar una rama. Las etiquetas no se envían de forma predeterminada. Nunca debe usar uno para el otro (a menos que esté realmente en una mentalidad SVN, en cuyo caso debe "desaprender" tan rápido si desea continuar con git).
VonC
19
@SteveBennett: Hay una diferencia en cómo Git trata las ramas frente a cómo trata las etiquetas. Además de lo que dijo VonC, no puede avanzar la etiqueta por error: " git checkout <tag>" generaría una rama anónima sin nombre (llamada 'HEAD separada') y seleccionaría el estado de la etiqueta. La creación de una nueva confirmación lo hace en esta rama sin nombre y no cambia a qué apunta la etiqueta.
Jakub Narębski
6060
En mi opinión, las ramas son líneas de tiempo separadas (mundo paralelo), y las etiquetas son momentos específicos en una línea de tiempo.
Eonil
25
Nadie aquí lo ha mencionado todavía, pero puede usar una etiqueta como punto para iniciar una rama:git checkout -b <branch name> <tag name>
143

Si piensa en su repositorio como un libro que narra el progreso de su proyecto ...

Ramas

Puedes pensar en una rama como uno de esos marcadores adhesivos :

ingrese la descripción de la imagen aquí

Un nuevo repositorio tiene solo uno de esos (llamado master), que se mueve automáticamente a la última página (think commit ) que ha escrito. Sin embargo, puede crear y usar más marcadores para marcar otros puntos de interés en el libro, de modo que pueda volver a ellos rápidamente.

Además, siempre puede mover un marcador particular a otra página del libro (usando git-reset , por ejemplo); Los puntos de interés suelen variar con el tiempo.

Etiquetas

Puede pensar en las etiquetas como encabezados de capítulos .

marcadores

Puede contener un título (piense en etiquetas anotadas ) o no. Una etiqueta es similar pero diferente a una rama, ya que marca un punto de interés histórico en el libro. Para mantener su aspecto histórico, una vez que ha compartido una etiqueta (es decir, la ha empujado a un control remoto compartido), no debe moverla a otro lugar del libro.

jub0bs
fuente
16
Me imagino que una rama sería un libro, y los marcadores son etiquetas. Puede continuar escribiendo un libro, pero no puede editarlo. Tag es solo un momento fijo en el libro.
Mārtiņš Briedis
55
@Jubobs Me gustó la explicación de la rama como línea de desarrollo. Un libro sería una rama. Puede comenzar un nuevo libro en función del lugar donde dejó la rama principal. Puede escribirlos en paralelo y luego intentar fusionarse en un solo libro / rama.
Mārtiņš Briedis
2
@ MārtiņšBriedis Entiendo la forma en que te gusta pensar en una rama, pero creo que, en Git, eso es realmente engañoso. Vea stackoverflow.com/questions/25068543/…
jub0bs
2
esta es realmente una respuesta para
ahorrar
2
Si comienza a escribir un libro y tiene las primeras 50 páginas, puede copiarlo (crear una nueva rama a partir de él) y continuar escribiendo dos libros simultáneamente (o darle la copia del libro a otro escritor - desarrollador) y finalmente puede fusionar el cambia del otro libro a tu libro.
barell
42

Lo que debe tener en cuenta, proveniente de CVS, es que ya no crea directorios al configurar una sucursal.
No más "etiqueta adhesiva" (que se puede aplicar a un solo archivo) o "etiqueta de rama".
Branch y tags son dos objetos diferentes en Git, y siempre se aplican al repositorio total .

Ya no debería (con SVN esta vez) estructurar explícitamente su repositorio con:

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

Esa estructura proviene del hecho de que CVS es un sistema de revisión y no un sistema de versión (ver Control de fuente vs. Control de revisión? ).
Eso significa que las ramas se emulan a través de etiquetas para CVS, copias de directorio para SVN.

Su pregunta tiene sentido si está acostumbrado a pagar una etiqueta y comienza a trabajar en ella .
Lo que no deberías;)
Se supone que una etiqueta representa un elemento inmutable contenido , que se usa solo para acceder a ella con la garantía de obtener el mismo contenido cada vez.

En Git, el historial de revisiones es una serie de confirmaciones, formando un gráfico.
Una rama es una ruta de ese gráfico

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Si desprotege una etiqueta, deberá crear una rama para comenzar a trabajar desde ella.
  • Si realiza el pago de una rama, verá directamente la última confirmación ('HEAD') de esa rama.

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

El punto principal es: una etiqueta que es un puntero simple a una confirmación, nunca podrá modificar su contenido. Necesitas una rama


En su caso, cada desarrollador trabaja en una función específica:

  • deben crear su propia rama en su repositorio respectivo
  • rastrear sucursales de los repositorios de sus colegas (el que trabaja en la misma función)
  • tirar / empujar para compartir su trabajo con sus compañeros.

En lugar de rastrear directamente las ramas de sus colegas, puede rastrear solo la rama de un repositorio central "oficial" al cual todos empujan su trabajo para integrar y compartir el trabajo de todos para esta característica en particular.

VonC
fuente
1
gracias por aclarar cómo funcionan las ramas y las etiquetas :) no podría entenderlo completamente sin su ejemplo.
ufk
3
@VonC: Creo que te refieres a "SVN" en tu respuesta y no a "CVS". CVS no tiene la estructura de directorios; SVN hace. De hecho, el etiquetado en git me recuerda mucho más al etiquetado en RCS / CVS que al etiquetado en SVN (donde tag == rama degenerada).
Chris Cleeland
1
@ChrisCleeland buen punto. Intenté separar un poco más los puntos CVS y SVN en la respuesta (editada).
VonC
37

Las ramas están hechas de madera y crecen desde el tronco del árbol. Las etiquetas están hechas de papel (derivado de la madera) y cuelgan como adornos navideños de varios lugares del árbol.

Su proyecto es el árbol, y su característica que se agregará al proyecto crecerá en una rama. La respuesta es rama.

Jason
fuente
3
amor por la analogía
doz87
16

Parece que la mejor manera de explicar es que las etiquetas actúan como ramas de solo lectura. Puede usar una rama como etiqueta, pero puede actualizarla inadvertidamente con nuevas confirmaciones. Las etiquetas están garantizadas para apuntar a la misma confirmación siempre que existan.

Vassili Gorshkov
fuente
11
Las etiquetas están garantizadas para apuntar a la misma confirmación siempre que existan. No del todo cierto. De hecho, puede mover una etiqueta con git tag -f.
jub0bs
14

Las etiquetas pueden ser firmadas o sin firmar ; Las ramas nunca se firman.

Las etiquetas firmadas nunca pueden moverse porque están vinculadas criptográficamente (con una firma) a una confirmación particular. Las etiquetas sin firmar no están vinculadas y es posible moverlas (pero mover etiquetas no es un caso de uso normal).

Las sucursales no solo pueden moverse a una confirmación diferente, sino que se espera que lo hagan. Debe usar una rama para su proyecto de desarrollo local. No tiene sentido comprometer el trabajo en un repositorio Git "en una etiqueta".

Greg Hewgill
fuente
12

Me gusta pensar en las ramas como a dónde vas , las etiquetas como dónde has estado .

Una etiqueta se siente como un marcador de un punto importante en particular en el pasado, como el lanzamiento de una versión.

Mientras que una rama es un camino particular, el proyecto se está yendo hacia abajo y, por lo tanto, el marcador de rama avanza con usted. Cuando termine, combine / elimine la rama (es decir, el marcador). Por supuesto, en ese punto, podría elegir etiquetar esa confirmación.

Gazzer
fuente
10

La parábola de Git explica cómo se crea un DVCS típico y por qué sus creadores hicieron lo que hicieron. Además, es posible que desee echar un vistazo a Git for Computer Scientist ; explica qué hace cada tipo de objeto en Git, incluidas las ramas y las etiquetas.

Bombe
fuente
6

Una etiqueta se usa para marcar una versión, más específicamente hace referencia a un punto en el tiempo en una rama. Una rama generalmente se usa para agregar características a un proyecto.

Número45
fuente
4

simple:

Se espera que las etiquetas siempre apunten a la misma versión de un proyecto, mientras que los jefes deben avanzar a medida que avanza el desarrollo.

Manual de usuario de Git

Bar Horing
fuente
4

la respuesta simple es:

rama: el puntero de rama actual se mueve con cada confirmación en el repositorio

pero

etiqueta: la confirmación de que una etiqueta apunta no cambia, de hecho, la etiqueta es una instantánea de esa confirmación.

jsina
fuente