2012-06-15 24 views
16

Tengo un proyecto de gran tamaño en el que estoy trabajando y que usa git como VCS. En un momento dado estoy trabajando en la implementación de algunas características/correcciones de errores, etc. Para cualquier característica/error dado, sería bueno crear una jerarquía de ramas, por ejemplo.Organizando ramas de git

$ git branch 
    feature1 
     sub-branch1 
     sub-branch2 
     sub-branch3 
    feature2 
     sub-brancha 
     *sub-branchb #<--currently checked out 
     sub-branchc 
    bugfix1 
     sub-branch-foo 

$ git checkout sub-brancha 
$ git branch 
    feature1 
     sub-branch1 
     sub-branch2 
     sub-branch3 
    feature2 
     *sub-brancha #<--currently checked out 
     sub-branchb 
     sub-branchc 
    bugfix1 
     sub-branch-foo 

¿Es posible hacer algo como esto, o tengo que adoptar un esquema de nombres más primitivo?

EDITAR

Para que sea un poco más concreta de lo que estoy buscando, si feature1 es una rama git, a continuación, en el ejemplo anterior, sub-BRANCH1 todo habría sido creado por git checkout -b sub-branch1 del feature1 rama (que se ramifica desde el maestro). por ejemplo:

$ git checkout master 
$ git checkout -b feature1 
$ git checkout -b testing 
$ git branch 
master 
    feature1 
    *testing 
$ git checkout master 
$ git checkout -b feature2 
$ git branch 
master 
    feature1 
     testing 
    *feature2 

Tener git branch simplemente organizar ramas por donde vinieron (con un poco de sangrado adicional) es probablemente lo suficientemente bueno para mis propósitos ... A pesar de que los puntos de bonificación súper si puedo tener:

$ git branch 
    feature1 
     testing 
    feature2 
     testing 
    bugfix1 
     sub-branch-foo 

con un poco de forma de administrar el nombre de un conflicto entre "feature1/prueba" y "característica2/prueba"

+0

¿Por qué tienen diferentes ramas secundarias para nuevos desarrollos de funciones? –

+1

@FatihArslan: ¿Por qué no? Una característica no solo cambia una sola pieza de código: una característica podría tocar una gran cantidad de código, cada pieza que puede ser probada/desarrollada por separado ... O bien, tengo característica-alfa (estable-ish) y característica- beta (inestable). Alpha parece funcionar para mí, pero beta hace algunos cambios para aumentar el rendimiento ... Eso es dos casos justo en la parte superior de mi cabeza. Como lo veo, la razón para hacer esto no es diferente de la razón para tener sucursales en primer lugar. – mgilson

+0

¿Cuál es la pregunta? ¿Te estás preguntando si puedes hacer ramas fuera de las ramas, o si puedes cambiar el formato de salida 'git branch'? –

Respuesta

14

Se puede utilizar un esquema de nomenclatura como feature1/sub-brancha, característica2/sub-branchb y así sucesivamente, la barra en el nombre no es un problema para git. Sin embargo, las ramas se manejarán como ramas normales (pero no sabría cómo se podrían manejar las subramanes de forma diferente). El comando git branch listará las ramas del curso con su nombre completo y no como está en el ejemplo.

Curiosamente, los esquemas de nombres que incluyen barras crearán una jerarquía de directorios en .git/refs/heads /. Tal vez eso es útil para manejar las subramificaciones con algunos comandos de bajo nivel.

+0

* suspiro * - esto es lo que temía. Cada vez que me dispongo a hacer esto termino olvidando y luego todo el esquema se va por la ventana. Esperaba que Git pudiera eliminar mis tendencias desorganizadas para mí ... – mgilson

+3

Podrías escribir una pequeña herramienta para hacer cumplir tu esquema de nombres. Tal vez algunos alias ya pueden ser suficientes. O puede echarle un vistazo a [gitflow] (https://github.com/nvie/gitflow) que va un poco en esta dirección (pero puede no ser lo que necesita). – jgosmann

+0

gitflow definitivamente parece un paso en la dirección correcta. Gracias por ese enlace. – mgilson

2

Las sucursales en Git son, de hecho, referencias simbólicas a una clave en la tienda de objetos de Git. Para citar la documentación ("What is a branch"):

Cuando necesitamos para ser más precisos, vamos a utilizar la palabra "rama" en el sentido de una línea de desarrollo, y "cabeza de la rama" (o simplemente "cabeza") en el sentido de una referencia a la confirmación más reciente en una rama. En el ejemplo anterior, el encabezado de rama denominado "A" es un puntero a una confirmación particular, pero nos referimos a la línea de tres confirmaciones que conducen a ese punto, ya que todos forman parte de la "rama A".

Git maneja solamente una lista de referencias que se almacenan en archivos bajo .git/refs. Esas referencias simplemente no están diseñadas como una estructura de árbol.

Recomiendo utilizar un esquema de nombres de ramas que transmita la jerarquía.

Otra posibilidad es escribir una extensión que maneje la rama por usted.

+0

Pero, al rastrear controles remotos, tiene una estructura arbórea (primitiva) ... (una rama que rastrea un control remoto sabe de dónde vino) - ¿Por qué una rama no puede rastrear de dónde viene localmente? – mgilson

+0

Supongo que los creadores de Git querían mantenerlo lo más simple posible. Incorporar una estructura de árbol para ramas complicaría el diseño. Como las sucursales PUEDEN derivarse de otras sucursales, no es problema organizar sucursales en un esquema de nombres decente. Entonces, sin embargo, la interpretación del árbol depende del usuario. – migu

0

He usado personalmente el enfoque this en versiones anteriores de Git, pero parece que las ramas anidadas ya no son compatibles con la versión 1.8+.

También fue agradable ver la compatibilidad con UI en Git Tower.

enter image description here