tipos - ¿En qué se diferencia una etiqueta de una sucursal en Git? ¿Qué debo usar, aquí?
¿qué hace git log-oneline? (10)
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); Ellos no cambian.
- Las ramas son nombres simbólicos para la línea de desarrollo . Los nuevos compromisos se crean en la parte superior de la rama. El puntero de rama avanza naturalmente, apuntando a confirmaciones más nuevas y más recientes.
Desde el punto de vista técnico :
- las etiquetas residen en
refs/tags/
namespace, y pueden apuntar a etiquetas de objetos (anotadas y opcionalmente etiquetas firmadas por GPG) o directamente a un objeto de confirmación (etiqueta liviana menos usada para nombres locales), o en casos muy raros, incluso a objetos de árbol u objeto blob (por ejemplo, firma GPG). - las ramas residen en
refs/heads/
namespace, y solo pueden apuntar para confirmar objetos . El punteroHEAD
debe referirse 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
refs/remotes/<remote>/
namespace, y siguen las ramas ordinarias en el repositorio<remote>
.
Véase también la página 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 solo repositorio de git puede rastrear un número arbitrario de sucursales, pero su árbol de trabajo está asociado con solo una de ellas (la rama "actual" o "desprotegida"), y HEAD apunta a esa rama.
etiqueta
Una referencia que apunta a una etiqueta u objeto de cometer. En contraste con una cabecera, una etiqueta no se cambia por un compromiso. Las etiquetas (no los objetos de etiqueta) se almacenan en
$GIT_DIR/refs/tags/
. [...]. Una etiqueta se usa generalmente para marcar un punto en particular en la cadena de ascendencia de confirmación.etiquetar objeto
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".
Tengo algunas dificultades para entender cómo usar etiquetas en lugar de ramas en git .
Acabo de mover la versión actual de nuestro código de cvs a git , y ahora voy a trabajar en un subconjunto de ese código para una característica particular. Algunos otros desarrolladores también trabajarán en esto, pero no todos los desarrolladores de nuestro grupo se van a preocupar por esta característica. ¿Debo estar creando una rama o una etiqueta? ¿En qué situaciones debería estar usando uno frente al otro?
Las etiquetas pueden ser firmadas o sin firmar ; Las ramas nunca se firman.
Las etiquetas firmadas nunca se pueden mover porque están unidas criptográficamente (con una firma) a un compromiso en particular. Las etiquetas sin firmar no están vinculadas y es posible moverlas (pero las etiquetas en movimiento no son un caso de uso normal).
Las sucursales no solo pueden pasar a un compromiso diferente, sino que se espera que lo hagan. Debe utilizar una rama para su proyecto de desarrollo local. No tiene sentido comprometer el trabajo en un repositorio Git "en una etiqueta".
Las ramas son de madera y crecen del tronco del árbol. Las etiquetas están hechas de papel (derivado de la madera) y se cuelgan como adornos navideños de varios lugares en el árbol.
Su proyecto es el árbol, y su característica que se agregará al proyecto crecerá en una rama. La respuesta es rama.
Lo que debe tener en cuenta, proveniente de CVS, es que ya no crea directorios al configurar una rama.
No más "etiqueta adhesiva" (que se puede aplicar a un solo archivo), o "etiqueta de rama".
Las ramas y etiquetas son dos objetos diferentes en Git, y siempre se aplican a todo el repositorio.
Ya no tendrí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 sucursales se emulan a través de etiquetas para CVS, copias de directorio para SVN.
Su pregunta tiene sentido si está acostumbrado a revisar una etiqueta y comenzar a trabajar en ella .
El cual no deberías;)
Se supone que una etiqueta representa un contenido inmutable , que se utiliza solo para acceder a él con la garantía de obtener el mismo contenido cada vez.
En Git, la historia de las revisiones es una serie de confirmaciones, que forman una gráfica.
Una rama es un camino de esa gráfica.
x--x--x--x--x # one branch
/
--y----y # another branch
1.1
^
|
# a tag pointing to a commit
- Si selecciona una etiqueta, deberá crear una rama para comenzar a trabajar desde ella.
- Si realiza el pago de una sucursal, verá directamente la última confirmación ("HEAD") de esa sucursal.
Vea la respuesta de Jakub Narębski para todos los aspectos técnicos, pero francamente, en este punto, no necesita (aún) todos los detalles;)
El punto principal es: si una etiqueta es un puntero simple a un compromiso, nunca podrá modificar su contenido. Necesitas una rama.
En su caso, cada desarrollador que trabaja en una característica específica:
- Deben crear su propia rama en su respectivo repositorio.
- rastrear ramas desde 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 sucursales de sus colegas, puede rastrear solo la sucursal 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.
Parece que la mejor manera de explicar es que las etiquetas actúan como ramas de solo lectura. Puede usar una rama como una etiqueta, pero puede actualizarla involuntariamente con nuevos confirmaciones. Se garantiza que las etiquetas apuntan a la misma confirmación siempre que existan.
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 pegajosos:
Un repositorio nuevo tiene solo uno de esos (llamado master
), que se mueve automáticamente a la última página (think commit ) que ha escrito. Sin embargo, tiene la libertad de crear y usar más marcadores, para marcar otros puntos de interés en el libro, para que pueda volver a ellos rápidamente.
Además, siempre puedes mover un marcador particular a alguna otra página del libro (usando git-reset
, por ejemplo); Los puntos de interés suelen variar con el tiempo.
Etiquetas
Puedes pensar en las etiquetas como encabezados de capítulos .
Puede contener un título (pensar 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 colocado en un control remoto compartido), no debe moverla a ningún otro lugar del libro.
Una etiqueta representa una versión de una rama en particular en un momento en el tiempo. 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 de nuevo en otra rama para unificarlos.
Por lo general, etiquetará una versión particular para que pueda volver a crearla, por ejemplo, esta es la versión que enviamos a XYZ Corp. Una rama es más una estrategia para proporcionar actualizaciones continuas en una versión particular del código mientras continúa hacer el desarrollo en él. Hará una rama de la versión entregada, continúe el desarrollo en la línea principal, pero haga correcciones de errores en la rama que representa la versión entregada. Eventualmente, volverá a combinar estas correcciones de errores en la línea principal. A menudo usarás tanto la ramificación como el etiquetado juntos. Tendrá varias etiquetas que pueden aplicarse tanto a la línea principal como a sus sucursales que marcan versiones particulares (las que se entregan a los clientes, por ejemplo) a lo largo de cada sucursal que desee recrear: para entrega, 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.
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 se utiliza normalmente para agregar características a un proyecto.
sencillo:
Se espera que las etiquetas siempre apunten a la misma versión de un proyecto, mientras que se espera que los jefes avancen a medida que avance el desarrollo.
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 for Computer Scientist ; explica lo que hace cada tipo de objeto en Git, incluidas las ramas y las etiquetas.