¿En qué se diferencian las tags git de las twigs git?

Intento entender cuándo debo usar tags vs branches para administrar mi código base.

Una label representa una versión de una twig en particular en un momento determinado. Una twig 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 twig pueden eventualmente fusionarse en otra twig para unificarlos.

Por lo general, labelrá una versión particular para que pueda volver a crearla, por ejemplo, esta es la versión que enviamos a XYZ Corp. Una twig es más una estrategia para proporcionar actualizaciones continuas sobre una versión particular del código mientras continúa hacer desarrollo en él. Hará una twig de la versión entregada, continuará el desarrollo en la línea principal, pero corregirá las fallas de la twig que representa la versión entregada. Eventualmente, combinará estas correcciones de errores nuevamente en la línea principal. A menudo utilizará tanto la ramificación como el labeldo. Tendrá varias tags que se pueden aplicar tanto a la línea principal como a sus twigs que marcan versiones particulares (las entregadas a los clientes, por ejemplo) a lo largo de cada twig 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 hacerlo, pero estos ejemplos te darán una idea de las diferencias.

Desde el punto de vista teórico :

  • las tags son nombres simbólicos para una revisión dada. Siempre apuntan al mismo object (generalmente: a la misma revisión); ellos no cambian
  • las twigs son nombres simbólicos para la línea de desarrollo . Se crean nuevos commits en la parte superior de la twig. El puntero de la twig avanza de forma natural, apuntando a confirmaciones más nuevas y más recientes.

Desde el punto de vista técnico :

  • las tags residen en refs/tags/ namespace, y pueden apuntar a objects de label (anotados y opcionalmente GPG firman tags) o directamente a commit object (label liviana less utilizada para nombres locales), o en casos muy raros incluso a tree object o blob object (por ejemplo, firma de GPG).
  • las twigs residen en refs/heads/ namespace, y solo pueden apuntar a objects commit . El puntero HEAD debe hacer reference a una bifurcación (reference simbólica) o directamente a una confirmación (HEAD desconectado o bifurcación sin nombre).
  • las twigs de seguimiento remoto residen en refs/remotes/<remote>/ namespace, y siguen las twigs ordinarias en el repository <remote> .

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

twig

Una "twig" es una línea activa de desarrollo. La confirmación más reciente en una twig se conoce como la punta de esa twig. La punta de la twig es referenceda por un encabezado de twig, que avanza a medida que se realiza un desarrollo adicional en la twig. Un único repository git puede rastrear un número arbitrario de twigs, pero su tree de trabajo está asociado con solo una de ellas (la twig "actual" o "desprotegida"), y HEAD apunta a esa twig.

label

Una reference que apunta a una label o un object de confirmación. A diferencia de un encabezado, una label no se modifica mediante una confirmación. Las tags (no los objects de label) se almacenan en $GIT_DIR/refs/tags/ . […]. Una label generalmente se usa para marcar un punto particular en la cadena de ancestros de compromiso.

object de label

Un object que contiene una reference que apunta a otro object, que puede contener un post como un object de confirmación. También puede contener una firma (PGP), en cuyo caso se denomina "object de label firmado".

Si piensas en tu repository como un libro que relata el progreso de tu proyecto …

Sucursales

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

enter image description here

Un nuevo repository tiene solo uno de esos (llamado master ), que se mueve automáticamente a la última página (pensar cometer ) 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 puedes mover un marcador en particular a alguna otra página del libro (usando git-reset , por ejemplo); los puntos de interés generalmente varían con el time.

Etiquetas

Puedes pensar en tags como encabezados de capítulos .

marcadores

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

Lo que necesita saber, viniendo de CVS, es que ya no crea directorys cuando configura una sucursal.
No más "label adhesiva" (que se puede aplicar a un solo file), o "label de twig".
La twig y las tags son dos objects diferentes en Git, y siempre se aplican al repository completo .

Ya no (con SVN esta vez) tendrá que estructurar explícitamente su repository 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 twigs se emulan a través de tags para CVS, copys de directory para SVN.

Su pregunta tiene sentido si está acostumbrado a pagar una label, y comienza a trabajar en ella .
Que no deberías;)
Se supone que una label representa un contenido inmutable , utilizado solo para acceder a ella con la garantía de get siempre el mismo contenido.

En Git, la historia de las revisiones es una serie de compromisos, formando un gráfico.
Una twig 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 pagas una label, deberás crear una twig para comenzar a trabajar desde ella.
  • Si selecciona una sucursal, verá directamente la última confirmación ('HEAD') de esa sucursal.

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

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


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

  • debería crear su propia sucursal en su respectivo repository
  • rastrear twigs desde los repositorys de sus colegas (el que trabaja en la misma function)
  • tirando / empujando para compartir tu trabajo con tus compañeros.

En lugar de rastrear directamente las twigs de sus colegas, podría rastrear solo la twig de un repository central "oficial" al que todos empujan su trabajo para integrar y compartir el trabajo de todos para esta característica en particular.

Las twigs están hechas de madera y crecen desde el tronco del tree. Las tags están hechas de papel (derivado de madera) y se cuelgan como adornos de Navidad de varios lugares del tree.

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

Parece que la mejor manera de explicarlo es que las tags actúan como twigs de solo lectura. Puede usar una twig como una label, pero puede actualizarla inadvertidamente con nuevas confirmaciones. Se garantiza que las tags apunten al mismo compromiso mientras existan.

The Git Parable 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 para Computer Scientist ; explica qué hace cada tipo de object en Git, incluidas las twigs y las tags.

Las tags pueden ser firmadas o no ; las twigs nunca se firman.

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

Las sucursales no solo pueden pasar a una confirmación diferente, sino que se espera que lo hagan. Debe usar una sucursal para su proyecto de desarrollo local. No tiene sentido confiar el trabajo a un repository de Git "en una label".

Una label se usa para marcar una versión, más específicamente hace reference a un punto en el time en una twig. Una twig se usa generalmente para agregar características a un proyecto.

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

Sucursal : será una copy del código derivado de un cierto punto en el tronco que se usa para aplicar cambios importantes al código mientras se preserva la integridad del código en el tronco. Si los principales cambios funcionan de acuerdo con el plan, generalmente se fusionan en el tronco.

Etiqueta : será un punto en el time en el tronco o una twig que desea conservar. Las dos razones principales para la preservación serían que, o bien 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 las principales revisiones en el troncal.

sencillo:

Se espera que las tags siempre apunten a la misma versión de un proyecto, mientras que se espera que las cabezas avancen a medida que avanza el desarrollo.

Manual de usuario de Git