Mejores prácticas de ramificación y etiquetado de Git


141

Actualmente estoy aprendiendo a usar Git leyendo Pro Git . Ahora mismo estoy aprendiendo sobre ramificaciones y etiquetas. Mi pregunta es cuándo debo usar una rama y cuándo debo usar una etiqueta.

Por ejemplo, supongamos que creo una rama para la versión 1.1 de un proyecto. Cuando termine y publique esta versión, ¿debo dejar la rama para marcar la versión de lanzamiento? ¿O debería agregar una etiqueta? Si agrego una etiqueta, ¿debo eliminar la rama de la versión (suponiendo que se fusione con la maestra o alguna otra rama)?

Respuestas:


162

En resumen: la mejor práctica es ramificarse, fusionarse a menudo y mantenerse siempre sincronizado .

Hay convenciones bastante claras sobre cómo mantener su código en ramas separadas de la rama maestra:

  1. Está a punto de implementar un cambio importante o disruptivo.
  2. Está a punto de hacer algunos cambios que podrían no usarse
  3. Desea experimentar con algo que no está seguro de que funcione.
  4. Cuando le dicen que se ramifique, otros pueden tener algo que deben hacer en master

La regla general es que después de ramificarse, debe mantenerse sincronizado con la rama maestra. Porque eventualmente necesitas fusionarlo nuevamente con el maestro. Para evitar un enorme y complicado desorden de conflictos al fusionarse, debe comprometerse con frecuencia, fusionarse con frecuencia.

Buenas prácticas a seguir

Un exitoso modelo de ramificación Git de Vincent Driessen tiene buenas sugerencias. Si este modelo de ramificación le atrae, considere la extensión de flujo a git . Otros han comentado sobre el flujo .

Prácticas de etiquetado

Como ya sabes, Git te proporciona identificadores de confirmación como 1.0-2-g1ab3183, ¡pero esas no son etiquetas! El etiquetado se realiza con git tag, y las etiquetas que se crean con git tag son la base de los identificadores de confirmación que git describe crea. En otras palabras, en Git no etiquetas ramas. Estás etiquetando commits. Es correcto decir que la etiqueta es solo un puntero anotado a una confirmación.

Veamos un ejemplo práctico que lo demostró,

                        / - [v1.0]
                       v
---. ---. --- .--- S ---.--- A <- maestro
                         \ 
                           \ -.--- B <- prueba

Confirmemos 'S' se confirme señalado por la etiqueta 'v1.0'. Esta confirmación es tanto en la rama 'maestra' como en la rama 'prueba'. Si ejecuta " git describe " en la parte superior de la confirmación 'A' (parte superior de la rama 'maestra') obtendría algo así v1.0-2-g9c116e9. Si ejecuta "git describe" en la parte superior de la confirmación 'A' (también conocida como la rama 'prueba') obtendría algo como v1.0-2-g3f55e41, ese es el caso con la configuración predeterminada de git-describe. Tenga en cuenta que este resultado es ligeramente diferente. v1.0-2-g9c116e9significa que estamos comprometidos con la identificación SHA-1 reducida de 9c116e92 commits después de la etiqueta v1.0. No hay etiqueta v1.0-2!

Si desea que su etiqueta aparezca solo en la rama 'maestra', puede crear una nueva confirmación (por ejemplo, solo actualizar la información de versión predeterminada / alternativa en GIT-VERSION-FILE) después del punto de ramificación de la rama 'prueba'. Si etiqueta las confirmaciones en la rama 'prueba' con, por ejemplo, 'v1.0.3', sería visible solo desde 'prueba'.

Referencias

He encontrado muchos, muchos blogs y publicaciones útiles para aprender. Sin embargo, los que están ilustrados profesionalmente son raros. Por lo tanto, me gustaría recomendar una publicación: un modelo de ramificación Git exitoso de @nvie. He tomado prestada su ilustración :)

ingrese la descripción de la imagen aquí


44
1.0-2-g1ab3183 es ​​un identificador construido por git describe a partir de la información disponible de git, pero llamarlo identificador de git es demasiado. Git se identifica por SHA hash; Las etiquetas y las ramas son construcciones humanas que Git realiza un seguimiento útil. Como tal, crea una etiqueta cuando creas que algún humano algún día deseará encontrar un marcador conveniente para un commit.
mabraham

2
Una maravillosa ilustración de la multidimensionalidad en el universo Git. hermosa. gracias
Tope

Vale la pena señalar que muchos proyectos no necesitan algunos de los carriles que se muestran en este diagrama. Algunos proyectos solo necesitan lo que se llama desarrollar y presentar aquí. Esto suele ser cierto para las aplicaciones web que se pueden implementar a voluntad.
usr

37

Se utiliza una rama si tiene 2 versiones diferentes de repositorio al mismo tiempo. Una etiqueta es una forma de marcar un punto en el tiempo en su repositorio.

Debe agregar una etiqueta para marcar una versión lanzada. Si luego necesita hacer correcciones de errores a esa versión, crearía una rama en la etiqueta.

Solo desea eliminar las ramas que se han fusionado nuevamente en HEAD [o alguna otra rama].


3
oh ... y supongo que te refieres a que la rama se fusionó con otra rama, como master. HEAD se mueve cada vez que hago un pago, ¿verdad?
Code-Guru

HEAD generalmente apunta a una rama (a menos que esté en modo HEAD separado), por lo que HEAD se mueve con la rama a la que apunta
LoicAG
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.