Actualmente estoy trabajando para una empresa que usa VSTS para administrar el código git. La forma "recomendada" de Microsoft de fusionar una sucursal es hacer una "fusión de squash", lo que significa que todas las confirmaciones para esa rama se aplastan en una nueva confirmación que incorpora todos los cambios.
El problema es, ¿qué sucede si hago algunos cambios en una rama para un elemento de la cartera de pedidos, y de inmediato quiero comenzar a hacer cambios en otra rama para otro elemento de la cartera de pedidos, y esos cambios dependen del conjunto de cambios de la primera rama?
Puedo crear una rama para ese elemento acumulado y basarlo en la primera rama. Hasta aquí todo bien. Sin embargo, cuando llega el momento de crear una solicitud de extracción para mi segunda rama, la primera rama ya se ha fusionado en master y debido a que se ha hecho como una fusión de squash, git señala un montón de conflictos. Esto se debe a que git no ve los commits originales en los que se basó la segunda rama, solo ve la fusión de una gran calabaza y, por lo tanto, para fusionar la segunda rama en master, intenta reproducir todos los commits de la primera rama en la parte superior de la calabaza se fusiona, causando muchos conflictos.
Entonces, mi pregunta es, ¿hay alguna forma de evitar esto (aparte de no basar nunca una rama de función en otra, lo que limita mi flujo de trabajo) o la fusión de squash solo rompe el algoritmo de fusión de git?
feature1
con el maestro y luego desea fusionarsefeature2
más tarde. En ese caso, ¿el primer enfoque no daría lugar a conflictos ya que git intenta volver a aplicar losfeature1
commits sobre el commit aplastado, mientras que el segundo permitiría que git determine que esos commits no necesitan fusionarse?git clone
ingresando el repositorio y copiando mis archivos modificados!) Porque me bifurqué de una rama y luego el responsable aplastó la primera rama. En mi trabajo también hacen fusiones de squash. Esto significa que no puedo trabajar en una funciónb
que depende de la funcióna
hasta quea
se combine.La fusión de squash rompe el algoritmo de fusión de cualquier rama que contenga confirmaciones que fueron eliminadas por la calabaza. Dicho de otra manera, los rebases son virales. Si cambia la base de una rama, debe cambiar las ramas que dependen de esa rama. Si usa rerere , los conflictos de fusión que resolvió manualmente en su repositorio local no necesitarán resolverse manualmente nuevamente, pero eso no ayuda con los conflictos resueltos por otras personas.
Es por eso que nuestra regla no escrita aquí es que está bien aplastar siempre y cuando nadie más dependa de su rama de características, que es el caso tal vez el 90% del tiempo. De lo contrario, una fusión directa ayuda a todos a evitar problemas.
fuente
feature-xyz
rama. Se puede crear unafeature-xyz-squashed
rama a partir de la misma se comprometan comofeature-xyz
rama,git cherry-pick
las confirmaciones defeature-xyz
quefeature-xyz-squashed
, a aplastar allí, y de combinaciónfeature-xyz-squashed
amaster
. No deberías fusionartefeature-xyz
entonces. A veces, lo anterior tiene sentido (por ejemplo, no desea incluir confirmaciones con una contraseña introducida), pero es una solución alternativa, difícilmente una mejor práctica.