stash - git tag
git-omisión de confirmaciones específicas cuando se fusiona (6)
Cree una tercera rama para los cambios que desee en master10 pero no en master20. Siempre considere master10 como su "maestro", la rama más estable de todas. La rama con la que todas las otras ramas quieren estar sincronizadas en todo momento.
Llevo un año usando Git y creo que es fantástico, pero acabo de comenzar una segunda versión del proyecto y comencé una nueva rama para él. Estoy luchando un poco con la mejor manera de manejar las cosas en el futuro.
Tengo dos ramas llamadas say master10 (para v1) y master20 (para v2). He estado haciendo correcciones de errores en v1 en branch master10, y desarrollando nuevas cosas de master20. Cada vez que hago una corrección de errores la fusiono en v2 revisando master20 y haciendo git merge master10
. Hasta aquí todo bien.
Ahora, sin embargo, hice un cambio en v1 que no quiero en v2, pero quiero continuar fusionando otras correcciones de errores. ¿Cómo le digo a Git que omita esa confirmación en particular (o un rango de confirmaciones), pero que en el futuro sigo queriendo combinar otras correcciones de errores?
Pensé que git rebase
podría ser lo que necesito, pero leí el documento y mi cabeza casi explotó.
Creo que lo que quiero es algo así como un comando "git sync" que le dice a git que dos ramas están ahora sincronizadas y en el futuro solo fusionan las confirmaciones desde este punto de sincronización.
Cualquier ayuda apreciada.
En mi humilde opinión, lo más lógico es fusionar todo, y luego usar git revert (commit_you_dont_want) para eliminarlo .
Ejemplo:
git merge master
git revert 12345678
Si tiene varias confirmaciones de "omisión", o desea editar el mensaje de reversión:
git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"
Entonces su historia puede verse así:
| ... Except 123456 and abcdef
|/ Merge branch ''master'' into ''your_branch''
Si tiene conflictos que involucran SOLAMENTE estos commits "to-ignore", puede usar:
git merge master -X ours
Entonces tu versión persistirá sobre la otra. Incluso sin mensajes de error, aún puede "revertir" esos commits no deseados, ya que pueden tener otros cambios que no entraron en conflicto, y aún así no los quiere.
Si tiene conflictos que involucran NO SOLAMENTE los commits "to-ignore", debe resolverlos manualmente, y probablemente tendrá que resolverlos nuevamente durante la reversión.
Los compromisos incluyen ascendencia. No puede fusionar una confirmación sin fusionar compromisos previos.
Puedes elegirlos, por supuesto. Ese es un flujo fino cuando tienes una rama que está en modo de mantenimiento.
Si desea fusionar la mayoría pero no todas las confirmaciones en la rama "maint" a "master", por ejemplo, puede hacerlo. Requiere algo de trabajo ---- como se mencionó anteriormente, el caso de uso habitual es fusionar todo de una rama --- pero a veces sucede que usted hizo un cambio a una versión de lanzamiento que no debería ser integrada de nuevo (tal vez ese código sido reemplazado en el maestro ya), entonces, ¿cómo lo representas? Aquí va...
Entonces, supongamos que maint ha aplicado 5 cambios, y uno de ellos (maint ~ 3) no debe fusionarse de nuevo en master, aunque todos los demás deberían estarlo. Usted hace esto en tres etapas: en realidad fusionar todo antes de eso, decirle a git que marque maint ~ 3 como fusionado incluso cuando no lo esté, y luego fusionar el resto. La magia es:
bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint
El primer comando combina todo antes de que tu manuscrito problemático se comprometa con el maestro. El mensaje de registro de fusión predeterminado explicará que está fusionando "rama ''maint'' (parte inicial)".
El segundo comando combina el molesto comando ~ 3 commit, pero la opción "-s ours" le dice a git que use una "estrategia de fusión" especial que, de hecho, funciona simplemente manteniendo el árbol en el que se está fusionando e ignorando el compromiso (s) ) te estás fusionando completamente. Pero todavía hace una nueva fusión se compromete con HEAD y maint ~ 3 como los padres, por lo que el gráfico de revisión ahora dice que maint ~ 3 se fusionó. Así que, de hecho, probablemente también quieras usar la opción -m para ''git merge'', para explicar que ese commit ~ 3 de maint está siendo ignorado.
El comando final simplemente combina el resto de maint (maint ~ 2..maint) en master para que todos estén sincronizados de nuevo.
Suena como un caso clásico para ''git cherry-pick'' https://git-scm.com/docs/git-cherry-pick . Hace exactamente lo que parece
Una especie de publicidad de mi project que básicamente envuelve el proceso descrito por @araqnid.
Es una especie de ayudante que presenta el siguiente flujo de GIT:
- hay una notificación diaria / semanal sobre las fusiones pendientes de las ramas de mantenimiento en la rama dev / master
- El mantenedor de rama verifica el estado y decide si todas las confirmaciones son necesarias y las bloquea o le pide a los desarrolladores que se bloqueen. En la rama de mantenimiento final se fusiona en el upsteam.
Una cita de la página del proyecto:
Dependiendo del flujo de trabajo, es posible tener ramas de mantenimiento o específicas del cliente junto con la rama principal. Estas ramas también se llaman ramas LTS.
A menudo, las correcciones urgentes van a las ramas donde se informó el error y luego la confirmación se fusiona nuevamente en la rama principal.
La práctica general es tener todas las ramas perfectamente sincronizadas con el maestro, es decir, desea ver un delta claro entre una rama y un maestro en particular para comprender si el maestro contiene todas las características y las correcciones de errores.
Sin embargo, a veces no desea compromisos específicos porque son específicos del cliente y no deben ser visibles por otros usuarios. O su rama principal divergió tanto que requiere un enfoque completamente diferente para solucionar el problema, o mejor aún, el problema ya no está presente allí.
También en el caso de la selección de cereza desde el maestro a la rama de mantenimiento, la confirmación resultante se bloqueará en el maestro.