2010-01-31 23 views
23

Tenemos proyecto (aplicación PHP), pero la instalación para cada cliente varía, a veces muy poco, a veces más. Aún así, gran parte del código fuente es común. Gestionamos instalaciones específicas como sucursales paralelas a la rama principal y tenemos que transferir los cambios desde el maestro a otras ramas. La misma situación se resolvió en Git: how maintain (mostly) parallel branches with only a few difference? La solución más votada fue transferir los cambios entre manojos de esta manera:Git: cómo mantener ramas paralelas permanentes

git pull 
git checkout local 
git rebase master 

Como se mencionó en la solución que crea no avance rápido empuja después de reajuste que encuentro complicación muy desagradable. Mi pregunta es - ¿por qué no hacer en su lugar:

git pull 
git checkout local 
git merge master 
+0

o tal vez quería decir esto? http://stackoverflow.com/questions/2850369/why-does-git-use-fast-forward-merging-by-default – cregox

Respuesta

5

Realmente depende de lo que quieras hacer con la sucursal. Sí, si rebasaste local, creará impulsos de avance rápido después de la rebase. Por otro lado, mantendrás un conjunto de cambios distintos en el futuro y lo que habrá en tu sucursal será un conjunto de cambios COMO SI SE HUBIERAN HECHO AL NUEVO JEFE DE MAESTRO.

La fusión del maestro con el local, en cambio, mantendrá la marcha local en el tiempo con el maestro y registrará el historial tal como sucedió. Si necesita poder reconstruir el estado del local en el pasado, querrá hacer esto. La historia nunca cambiará. Pero, tendrás una historia más complicada de la que lidiar.

+0

En mi equipo, nosotros (casi siempre) rebasemos cualquier rama que se vaya a fusionar de nuevo. Como a menudo como sea posible, para facilitar la rebase. Eso simplifica la comprensión del historial de cambios cuando regresas. Cuando tenemos que mantener dos ramas en paralelo y estamos liberando ambas (versiones de mantenimiento y desarrollo, como) - entonces no podemos volver a establecer la base, es demasiado confuso. Empezamos a fusionarnos en su lugar. –

2

Greg's answer a su otra pregunta parece ver diferentes ramas como remanente local para instalaciones particulares, no empujado a otros repositorios (énfasis añadido):

Si es local a un sistema, confírmelo a la rama "local" de ese sistema, de lo contrario, comprométalo con "maestro" y empújelo hasta un repositorio común.

Casi siempre quiere empujar hacia adelante las ramas en un repositorio compartido. El git rebase documentation explica cómo recuperarse de una base de datos anterior (, es decir,, git rebase y luego git push -f), y no es divertido para nadie involucrado.

Por otro enfoque, ver Never merging back:

Hay casos válidos en el que una vez que el tenedor con la intención de no fusionar la espalda, pero en general usted debe tratar muy duro para mantener los cambios en un tenedor como a la mínimo.

El autor continúa para analizar la política de ramificación para varias versiones de clientes dentro del mismo repositorio.

17

La idea es que utilice una rama común, y dos (o tantas como usted necesita) ramas específicas del cliente. Todos los cambios comunes entran en el maestro , y cada rama de cliente obtiene cambios que pertenecen solo a ese cliente. Periódicamente (cuando se considera que el maestro está en un punto estable ), fusionará los cambios del maestro en la rama del cliente (git checkout custA; git merge master). Esto trae el nuevo código "común" en la sucursal del cliente. Nunca combinará la otra forma , que contaminaría el maestro con el código específico del cliente.

Cuando realiza una entrega al cliente A, puede sacar la rama "custA" y enviar eso. Y, por supuesto, también para otros clientes.

Ahora supongamos que adquiere un nuevo cliente, "C", y un poco más tarde encuentra una característica que los clientes A y C desean, pero B no. Usted crea (también conocido como "fork") una rama fuera de master (git checkout -b AC_feature master), code/test it, haciendo commits sobre la marcha, y luego se fusiona en A y C (git checkout A; git merge AC_feature and similarly for customer C). No codificarlo en A y luego confiar en la fusión de A en C, porque que conseguir todo de A en C

Si, en algún momento más tarde, a encontrar un error menor en esa característica, a tomar la cambie en la misma rama (git checkout AC_feature; edit/test/commit), y luego fusione en custA y custC como se indica anteriormente.

Fuente: Estos artículos refrescante clara y útil desde el desarrollador de Gitolite - Sitaram Chamarty, por escrito, en parte, con la aportación directa de Junio ​​Hamano (socio de Linus Torvalds en el mantenimiento de Git).

El mantenimiento de las ramas paralelas del cliente:

http://gitolite.com/archived/special-branches.html

artículo Seguimiento de "arreglar" Ramas comunes y de los usuarios:

http://gitolite.com/archived/special-branch-fixups.html