tipos tag remove practices etiquetas crear best git branching-and-merging merge-conflict-resolution

remove - git tag best practices



Git fusionando hotfix a mĂșltiples sucursales (4)

En el caso, usted está trabajando en la rama "4.0" y tiene que hacer una corrección en "3.1", puede volver a generar "4.0" después de confirmar "3.1":

git checkout 4.0 # you are on the feature brnach 4.0 git stash # save current work so you can check out other branch git checkout 3.1 git commit -a -m "bug fix" # do editing and commit git checkout "4.0" git stash apply # get back your changes git rebase "3.1" # change 4.1 so it branches of the current head of "3.1"

He estado tratando de envolver mi cabeza alrededor de los modelos de ramificación de git. He estado buscando en http://nvie.com/posts/a-successful-git-branching-model/ algunas ideas y proveniente de Subversion. Una cosa que realmente esperaba era hacer un cambio en un solo lugar fusionándolo con todas las ramas que lo necesitaran. En Subversion, terminamos haciendo una gran cantidad de código alrededor.

Sin embargo todavía no entiendo esto completamente. Este es un tipo de flujo de trabajo estándar que tengo y siempre generará conflictos.

# create new version branch git checkout master git checkout -b v3 vim pom.xml # change branch version to "3.1-SNAPSHOT" git commit -a git checkout master vim pom.xml # change master version to "4.0-SNAPSHOT" git commit -a

Así que el maestro está en 4.0-SNAPSHOT y la rama está en 3.1-SNAPSHOT.

No quiero crear un hotfix en la rama y moverlo al tronco.

git checkout v3 git checkout -b hotfix vim file.txt # make a bugfix change git commit -a git checkout v3 git merge hotfix # this works fine git checkout master git merge hotfix # this has a conflict since both branches have changed the version

Entiendo por qué está sucediendo y tiene sentido. ¿Hay una mejor manera de hacer esto?

Leí sobre cherry-pick, que probé y funciona:

git checkout v3 git cherry-pick a518b0b75eaf28868 git checkout master git cherry-pick a518b0b75eaf28868

Sin embargo, esa no parece ser la forma "correcta" de manejar esto. ¿Alguna sugerencia?


Realmente, su respuesta depende de si desea que sus árboles se basen en el mismo historial ... Por ejemplo, 4.0 se basa en la última versión 3.X + todos los cambios en 4.0 ...

Personalmente, no lo recomiendo una vez que decida comenzar una nueva (s) rama (s) para una nueva versión (s). En un momento dado, el software está tomando una dirección diferente, por lo que sus sucursales también deberían hacerlo.

Esto deja a git cherry-pick como tu solución ideal. Haga el cambio en cualquier rama que tenga más sentido, y luego elija las versiones anteriores. Esto es lo mismo que si hubiera revisado la rama anterior y hubiera aplicado manualmente el mismo cambio, y haya realizado una nueva confirmación. Lo mantiene limpio y al punto.

Git Merge o Rebase intentarán integrar el historial de las sucursales, cada uno a su manera, lo cual sospecho que no querrá cuando arregle errores en el backporting, etc.


Si desea obtener información técnica, puede crear el hotfix a partir de un ancestro común:

git merge-base v3 master git checkout -b hotfix <whatever you got from merge-base> # make your fix git checkout v3 && git merge --no-ff hotfix git checkout master && git merge --no-ff hotfix v3--------v3 (hotfixed) / / ancestor----hotfix / / master----master (hotfixed)

La --no-ff está ahí para resaltar que Git creará una confirmación de fusión, manteniendo la etiqueta de la rama de la revisión en la punta de la revisión, en lugar de tirar de la etiqueta a v3 o master . (Puede omitir la bandera y obtener el mismo comportamiento, ya que la rama de la hotfix tiene un compromiso que no está en master o v3 . Más información en los documentos ).

Personalmente, creo que eso es una exageración. Me gustaría ir con gahooa: hacer la revisión en la rama que tenga sentido, luego fusionar o elegir según cómo desee que las ramas se relacionen entre sí.


También he estado luchando con esta pregunta, y creo que si está dispuesto a cambiar un poco su estrategia de versiones (es decir, a partir de las versiones -SNAPSHOT que recomienda Maven), esto podría resolverse utilizando una versión fija ( como SNAPSHOT o 0.0.0-SNAPSHOT) en master (o cualquiera que sea su rama de desarrollo). (El sufijo SNAPSHOT es importante, si está utilizando Maven, ya que Maven trata los artefactos con versión SNAPSHOT de manera diferente a los demás).

De hecho, creo que querría instituir una política de solo cambiar el número de versión en su rama de producción (desde la que se crean versiones) o en sucursales que son solo para fines de versión (por ejemplo, cambiar los números de versión) y que nunca pretende fusionar de nuevo a la rama de desarrollo.

Todavía no he usado esta estrategia, pero estaba pensando en eso, y creo que empezaré a intentarlo.