¿Cuáles son algunos ejemplos de prácticas comúnmente utilizadas para nombrar ramas git? [cerrado]

1121

He estado usando un repositorio git local interactuando con el repositorio CVS de mi grupo durante varios meses, ahora. He hecho un número casi neurótico de ramas, la mayoría de las cuales afortunadamente se han fusionado nuevamente en mi tronco. Pero nombrar está empezando a convertirse en un problema. Si tengo una tarea fácilmente nombrada con una etiqueta simple, pero la llevo a cabo en tres etapas, cada una de las cuales incluye su propia rama y una situación de fusión, entonces puedo repetir el nombre de la rama cada vez, pero eso hace que la historia sea un poco confusa. Si me vuelvo más específico en los nombres, con una descripción separada para cada etapa, entonces los nombres de las ramas comienzan a ser largos y difíciles de manejar.

Aprendí mirando a través de viejos hilos aquí que podría comenzar a nombrar ramas con un / en el nombre, es decir, tema / tarea, o algo así. Puedo comenzar a hacer eso y ver si ayuda a mantener las cosas mejor organizadas.

¿Cuáles son algunas de las mejores prácticas para nombrar ramas git?

Editar: Nadie ha sugerido realmente ninguna convención de nomenclatura. Borro ramas cuando termino con ellas. Simplemente tengo varios alrededor debido a que la gerencia ajusta constantemente mis prioridades. :) Como ejemplo de por qué podría necesitar más de una rama en una tarea, supongamos que necesito comprometer el primer hito discreto en la tarea al repositorio CVS del grupo. En ese momento, debido a mi interacción imperfecta con CVS, realizaría ese commit y luego mataría esa rama. (He visto demasiada rareza interactuando con CVS si trato de seguir usando la misma rama en ese punto).

skiphoppy
fuente
Sí, probablemente sea bueno no quedarse o empujar ramas que no son útiles una vez que haya terminado con ellas. A menos que haya una buena razón para mantener una rama de tema (por ejemplo, para consultarla más adelante), no hay problema en eliminarla. Git facilita la ramificación, y un corolario es que puedes terminar con muchas ramas triviales que se pueden limpiar sin mucho esfuerzo.
Eric Walker
14
Ver también github.com/agis-/git-style-guide
Agis
2
Para completar, hay algunas secuencias de caracteres que no puedes usar .
Nick Westgate
18
Es necesario que haya un lugar para este tipo de preguntas dentro de la red StackExchange. Muy molesto cuando alguien hace una buena pregunta como esta y luego se cierra por no seguir las reglas. Si sigue sucediendo, eso probablemente debería indicar la necesidad de apoyar este tipo de preguntas de alguna manera. Solo que probablemente tendrían que implementarse dentro del sitio Overflow porque están muy relacionados con las preguntas de tipo programación. El desbordamiento, para mí, no es para "preguntas objetivamente respondibles" (demasiado específicas), es "preguntas de programación".
Nick Res
@Wim Utilizamos teclas de emisión jira, combinadas con un título corto, por ejemplo:KEY-1234/allow-users-to-do-smart-stuff
RobAu

Respuestas:

938

Aquí hay algunas convenciones de nombres de sucursales que uso y las razones por las cuales

Convenciones de denominación de sucursales

  1. Use tokens de agrupación (palabras) al comienzo de los nombres de sus sucursales.
  2. Defina y use tokens de plomo cortos para diferenciar ramas de una manera que sea significativa para su flujo de trabajo.
  3. Use barras para separar partes de los nombres de sus sucursales.
  4. No utilice números desnudos como partes principales.
  5. Evite nombres descriptivos largos para ramas de larga vida.

Fichas de grupo

Use tokens de "agrupación" delante de los nombres de sus sucursales.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

Los grupos se pueden nombrar como desee para que coincida con su flujo de trabajo. Me gusta usar sustantivos cortos para los míos. Siga leyendo para obtener más claridad.

Fichas cortas bien definidas

Elija tokens cortos para que no agreguen demasiado ruido a cada uno de los nombres de sus sucursales. Yo uso estos:

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

Cada uno de estos tokens se puede utilizar para indicarle a qué parte de su flujo de trabajo pertenece cada rama.

Parece que tiene varias ramas para diferentes ciclos de un cambio. No sé cuáles son sus ciclos, pero supongamos que son 'nuevos', 'probados' y 'verificados'. Puede nombrar sus ramas con versiones abreviadas de estas etiquetas, siempre escritas de la misma manera, para agruparlas y recordarle en qué etapa se encuentra.

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

Puede saber rápidamente qué ramas han alcanzado cada etapa diferente, y puede agruparlas fácilmente usando las opciones de coincidencia de patrones de Git.

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

Usa barras para separar las partes

Puede usar la mayoría de los delimitadores que desee en los nombres de las ramas, pero creo que las barras son las más flexibles. Es posible que prefiera usar guiones o puntos. Pero las barras le permiten cambiar el nombre de una rama al empujar o buscar a / desde un control remoto.

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

Para mí, las barras también funcionan mejor para la expansión de pestañas (finalización de comandos) en mi shell. De la manera que lo configuré, puedo buscar ramas con diferentes subpartes escribiendo los primeros caracteres de la parte y presionando la tecla TAB. Zsh luego me da una lista de ramas que coinciden con la parte del token que he escrito. Esto funciona tanto para los tokens anteriores como para los incrustados.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

(Zshell es muy configurable sobre la finalización de comandos y también podría configurarlo para manejar guiones, guiones bajos o puntos de la misma manera. Pero elijo no hacerlo).

También te permite buscar ramas en muchos comandos git, como este:

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

Advertencia: como Slipp señala en los comentarios, las barras pueden causar problemas. Debido a que las ramas se implementan como rutas, no puede tener una rama llamada "foo" y otra rama llamada "foo / bar". Esto puede ser confuso para los nuevos usuarios.

No use números desnudos

No utilice el uso de números desnudos (o números hexadecimales) como parte de su esquema de nombres de sucursal. Dentro de la expansión de tabulación de un nombre de referencia, git puede decidir que un número es parte de un sha-1 en lugar de un nombre de rama. Por ejemplo, mi rastreador de problemas nombra errores con números decimales. Nombre mis ramas relacionadas CRnnnnn en lugar de solo nnnnn para evitar confusiones.

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

Si intentara expandir solo 15032, git no estaría seguro de si quería buscar SHA-1 o nombres de sucursales, y mis opciones serían algo limitadas.

Evite nombres largos y descriptivos

Los nombres largos de sucursal pueden ser muy útiles cuando está mirando una lista de sucursales. Pero puede interferir cuando se observan registros de una línea decorados, ya que los nombres de las ramas pueden consumir la mayor parte de la línea y abreviar la parte visible del registro.

Por otro lado, los nombres de rama largos pueden ser más útiles en "commit de fusión" si no los reescribe habitualmente a mano. El mensaje predeterminado de confirmación de fusión es Merge branch 'branch-name'. Puede que le resulte más útil que aparezcan mensajes de combinación como en Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'lugar de solo Merge branch 'fix/CR15032'.

Phord
fuente
156
Una desventaja de usar una combinación de formularios como bug/20574/frabnotz-findery bug/20424es que una vez que comienzas sin un token secundario, no puedes agregar uno más tarde y viceversa. EG: Si crea una bug/20424rama, no puede crear una bug/20424/additional-fixingrama más tarde (a menos que elimine la bug/20424rama). Del mismo modo, si bug/20574/frabnotz-finderya es una rama, no puede crear una bug/20574rama. Tiendo a usar un delimitador que no sea sub-token en casos como este (por ejemplo bug/20574_frabnotz-finder), o elegir un nombre predeterminado para el sub-token (por ejemplo bug/20424/main).
Slipp D. Thompson
55
También tiene la ventaja de solicitar algunas herramientas basadas en la GUI de Git para permitir el colapso de divisiones de tokens como una vista de lista de directorios. En el ejemplo anterior, vería un featuregrupo y un buggrupo, expandible para mostrar foo, baretiquetas para el primero y a 20574, 20592grupos y 20424, 21334etiquetas para el segundo.
Slipp D. Thompson
47
Voy a comenzar una campaña para nunca usar barras en los nombres de sucursales de git. La razón de esto es que si, por ejemplo, en un elemento de configuración, desea hacer referencia al nombre de la sucursal cuando empaqueta el código, por ejemplo, desea hacer referencia al nombre de la sucursal al construir una uri o RUTA (por ejemplo), tal vez construir una uri en un script bash; tendrá problemas para construir el uri debido a la barra que agrega una parte de url. Sí, es posible reemplazar la barra oblicua, pero me llevará mucho tiempo resolverlo.
Adam Spence
13
¿Es un problema que las barras diagonales tengan significado para git en algunos casos? Por ejemplo, en respuesta a git branch -a, y obteniendo remotes/origin/master, etc. Cuando veo que git me cuenta acerca de una rama, no utilizo barras diagonales, y cuando veo una, sé que es una referencia "especial".
Dogweather
11
¿Podría usar algunos ejemplos en lugar de foo y bar, por favor?
Digno7
329

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

El modelo de Driessen incluye

  • Una rama maestra, utilizada solo para la liberación. Nombre tipico master.

  • Una rama "desarrollada" de esa rama. Ese es el que se usa para la mayoría de los trabajos de línea principal. Comúnmente nombrado develop.

  • Múltiples ramas de características fuera de la rama de desarrollo. Nombre basado en el nombre de la función. Estos se fusionarán nuevamente en el desarrollo, no en las ramas maestras o de lanzamiento.

  • Libere la rama para mantener las versiones candidatas, con solo correcciones de errores y sin nuevas características. Nombre tipico rc1.1.

Las revisiones son ramas de corta duración para los cambios que provienen del maestro y entrarán en el maestro sin que la rama de desarrollo esté involucrada.

ingrese la descripción de la imagen aquí

Brian Carlton
fuente
129129
Excepto que en realidad no aborda la cuestión, ya que deja un montón de convenciones de nomenclatura para el usuario, especialmente para las ramas de características (pueden ser "cualquier cosa excepto maestro, desarrollo, lanzamiento o revisión- "
Brian
1
@Brian ¿En qué ayudaría una convención de nomenclatura de características dentro del contexto de los problemas que resuelve el modelo? Realmente no veo, actualmente, cómo hacer más distinciones en las características realmente ayuda. Quizás futuro vs próximo lanzamiento, pero eso es negociable y, por lo tanto, no debería ser parte del nombre. Para facilitar la lectura, tal vez simplemente anteponerlos con feature- * sería suficiente. Te levantaste votado varias veces, así que tengo curiosidad por escuchar tu proceso de pensamiento ...
Nick Res
2
Aunque buena información, esta respuesta aborda la cuestión del flujo en lugar de la convención de nomenclatura. Creo que el OP quisiera saber qué palabras reales usar (sustantivos vs verbos), delimitadores, mayúsculas y minúsculas, etc.
Caltor
66
El libro Continuous Delivery (p. 36) argumenta que este modelo es un poco antitético a la integración continua, ... esencialmente, no es realmente "ágil".
Markon
Esto en realidad no responde la pregunta que se hizo. Esto ofrece una idea de cómo integrar un flujo de trabajo de git específico en un programa general de desarrollo y lanzamiento, sin embargo, el operador está buscando consejos sobre las convenciones sobre cómo llamar realmente a las sucursales.
Wheeler
56

Mi preferencia personal es eliminar el nombre de la sucursal después de haber terminado con una rama de tema.

En lugar de tratar de usar el nombre de la rama para explicar el significado de la rama, empiezo la línea de asunto del mensaje de confirmación en la primera confirmación en esa rama con "Rama:" e incluyo más explicaciones en el cuerpo del mensaje si el asunto No me da suficiente espacio.

El nombre de la rama en mi uso es simplemente un identificador para referirse a una rama de tema mientras se trabaja en ella. Una vez que el trabajo sobre la rama del tema ha concluido, me deshago del nombre de la rama, a veces etiquetando el commit para referencia posterior.

Eso también hace que la salida sea git branchmás útil: solo enumera ramas de larga duración y ramas de temas activos, no todas las ramas.

Aristóteles Pagaltzis
fuente
53

He mezclado y emparejado de diferentes esquemas que he visto y basado en las herramientas que estoy usando.
Entonces mi nombre completo de la sucursal sería:

nombre / función / número de seguimiento del problema / descripción breve

que se traduciría a:

mike / blogs / RSSI-12 / logo-fix

Las partes están separadas por barras diagonales porque se interpretan como carpetas en SourceTree para facilitar la organización. Usamos Jira para nuestro seguimiento de problemas, por lo que incluir el número facilita la búsqueda en el sistema. Incluir ese número también hace que se pueda buscar al intentar encontrar ese problema dentro de Github al intentar enviar una solicitud de extracción.

MikeG
fuente
Soy el mismo, excepto el número de error / función en el mensaje de confirmación (para la integración de GitHub -> Pivotal Tracker).
Leo
Me pregunto qué significa RSSI.
Renshuki
@renshuki es solo una clave genérica del proyecto Jira. Independientemente del rastreador de problemas que utilice, inserte el ID del ticket
MikeG
@ Mike Gracias por la precisión!
Renshuki
3
Uso el mismo, excepto que paso el número de emisión junto con la descripción:name/feature/issue-tracker-number-short-description
lephleg
22

¿Por qué se necesitan tres ramas / fusiones para cada tarea? ¿Puedes explicar más sobre eso?

Si usa un sistema de seguimiento de errores, puede usar el número de error como parte del nombre de la sucursal. Esto mantendrá los nombres de las ramas únicos, y puede agregarles un prefijo con una palabra breve y descriptiva o dos para que sean legibles por humanos, como "ResizeWindow-43523". También ayuda a facilitar las cosas cuando va a limpiar ramas, ya que puede buscar el error asociado. Así es como suelo nombrar mis ramas.

Dado que estas ramas eventualmente se fusionan nuevamente en master, debería estar seguro de eliminarlas después de fusionarlas. A menos que se esté fusionando --squash, toda la historia de la sucursal seguirá existiendo si alguna vez la necesita.

farktronix
fuente
12

Tenga en cuenta que, como se ilustra en commit e703d7 o commit b6c2a0d (marzo de 2014), ahora parte de Git 2.0, encontrará otra convención de nomenclatura (que puede aplicar a las sucursales).

"Cuando necesitas usar espacio, usa guión" es una forma extraña de decir que no debes usar un espacio.
Debido a que es más común que las descripciones de la línea de comando utilicen palabras discontinuas, ni siquiera desea utilizar espacios en estos lugares.

El nombre de una sucursal no puede tener espacio (consulte " ¿Qué caracteres son ilegales dentro de un nombre de sucursal? " Y la git check-ref-formatpágina del manual ).

Por lo tanto, para cada nombre de rama que estaría representado por una expresión de varias palabras, usar una ' -' (guión) como separador es una buena idea.

VonC
fuente
7

Siguiendo la sugerencia de farktronix, hemos estado usando números de boletos de Jira para similares en mercurial, y planeo continuar usándolos para las ramas de git. Pero creo que el número de boleto en sí es probablemente lo suficientemente único. Si bien puede ser útil tener una palabra descriptiva en el nombre de la sucursal como lo señaló farktronix, si cambia de sucursal con la frecuencia suficiente, probablemente desee escribir menos. Luego, si necesita saber el nombre de la sucursal, busque en Jira las palabras clave asociadas en el ticket si no lo sabe. Además, debe incluir el número de ticket en cada comentario.

Si su rama representa una versión, parece que la convención común es usar el formato xxx (ejemplo: "1.0.0") para nombres de rama y vx.xx (ejemplo "v1.0.0") para nombres de etiqueta (para evitar conflictos) . Ver también: is-there-an-standard-naming-convention-for-git-tags

Gary S. Weaver
fuente
1
¿Hay algún problema con los conflictos? Si la intención es que una v1.2.4rama eventualmente conduzca a un punto final con una v1.2.4etiqueta (¿estoy en lo cierto al suponer que esta es la situación en la que ambos nombran ramas y etiquetas después de una versión) , entonces, ¿importa? Todavía se puede llegar a refs/tags/v1.2.4la etiqueta y a la rama en refs/heads/v1.2.4, y parece que Git preferirá el nombre de la etiqueta cuando sea ambiguo (con una advertencia).
Slipp D. Thompson
1
Para el ejemplo de versión, como mencioné en mi respuesta, una práctica sugerida es prefijar con "v" para nombres de etiquetas, no ramas. Evite la ambigüedad si puede para evitar la falta de comunicación y porque podría causar problemas en el futuro migrando a lo que sea el próximo VCS más reciente y mejor.
Gary S. Weaver
2
Recientemente trabajé con un repositorio donde cerramos cada rama de versión con una etiqueta del mismo nombre. Funcionó considerablemente bien porque no hay poca o ninguna ambigüedad (la etiqueta apunta a la última confirmación en la rama correspondiente en la mayoría de los casos), y cuando podría haberla, Git "hace lo correcto" (con una advertencia). Lo prefiero porque si alguien comete un error descabellado y se compromete aún más con una rama limitada, Git continuará eligiendo la etiqueta, que es la intención. La ambigüedad puede simplificar las cosas cuando el sistema tiene todo bajo control y la intención es clara.
Slipp D. Thompson