compromiso temporal en fusión compleja

Tengo dos twigs master que es la twig principal y feature_branch_1 que es muy antigua y muchas se comprometen detrás del maestro. Necesito fusionar feature_branch_1 en master, así que lo hice:

 git pull --rebase origin master 

Como era de esperar, hay un montón de conflictos, poco después hubo una necesidad de desarrollar otra function en un nuevo feature_branch_2 y esto va en contra de HEAD of master y definitivamente necesita ser trabajado antes de feature_branch_1 . Estando más o less en el medio de la fusión compleja, ¿cómo hago una confirmación temporal en feature_branch_1 para poder volver más tarde? Sé que puedo hacer un:

 git add <things-that-are-done> git commit -m 'intermediary commit between merges' ... come back to it later git checkout 'that-temp-commit-hash' ... after finishing git add . git commit -m 'done with feature_branch_1' git rebase --interactive HEAD~1 

haciendo un commit temporal y luego rebasando para aplastarlo después.

¿Es esta la mejor manera de manejar esto?

Git no te permitirá realizar una confirmación con un índice que contenga inputs no fusionadas.

El uso de git add resolverá las inputs no fusionadas, para que luego pueda comprometerse, pero este enfoque puede ser insatisfactorio por varias razones. Sin entrar en demasiados detalles:

  • Las routes no resueltas se indican mediante el uso de ranuras de índice 1-3 en lugar de la ranura 0. Estas contienen la versión de base de combinación del file, y ambos "lados" ( --ours y --theirs , aunque durante una rebase los roles son tipo de intercambio) de la fusión.
  • git add copys del tree de trabajo a la ranura 0, tragamonedas 1-3, para que el file se resuelva ahora (incluso si el file del tree de trabajo todavía está lleno de marcadores de conflicto).
  • Una input de "deshacer" ( REUC ) se registra en el índice en este punto también, de modo que usted puede activar la git checkout -m la ruta para volver a crear el conflicto (borrando la input de la ranura 0 y restaurando las 1-3 inputs) .
  • En realidad, al comprometer el resultado de fusión, se pierde el estado de deshacer permanentemente.

Esto significa que si realiza una fusión parcial y luego desea volver a ella y desea finalizarla, falta información, específicamente el estado no compartido, incluso si se movió a una input de deshacer. Lo más cerca que puede llegar a averiguar, más adelante, qué files necesita fusionar adecuadamente, es search marcadores de conflicto. (Si te parece bien, este método puede ser satisfactorio después de todo).

Además de esto, una database copy múltiples confirmaciones , y usted no ha mencionado si este conflicto de fusión particular se ha producido en la última confirmación. Debe finalizar o cancelar la rebase antes de pasar a otras operaciones. (Técnicamente es posible hacer algunas cosas en medio de una rebase, pero esto es complicado).

En cuanto a esta parte:

 ... come back to it later git checkout 'that-temp-commit-hash' ... after finishing git add . git commit -m 'done with feature_branch_1' git rebase --interactive HEAD~1 

Debido a que este particular estado no sumergido (que rápidamente resolvió "incorrecto" a propósito para hacer otra cosa y volver más tarde) fue el resultado de una rebase en lugar de una fusión, esa secuencia podría funcionar. Sería más simple, y de aplicación más general, replace los últimos dos pasos con git commit --amend , sin embargo. La opción --amend le dice a git commit que haga su nueva confirmación usando los padres del commit actual, en lugar del commit actual. Esto funciona tanto para las confirmaciones normales (padre único, sin fusión) como las fusiones reales (dos o más padres).

Alternativas

Su mejor opción es, probablemente, dejar este tree de trabajo solo y hacer otro donde maneje los otros problemas.

La forma más sencilla de hacerlo, que siempre funciona con todas las versiones de Git, es hacer otro clon.

Puede hacer clones adicionales clonando la rebase en curso. En sistemas sensibles que tienen enlaces duros, si clonas tu repository en otro repository en el mismo sistema de files, usando routes locales ( git clone work/repo work/new-clone-for-fast-fix por ejemplo, desde un nivel superior al donde ha estado trabajando), Git usará enlaces duros a los packages y objects subyacentes, de modo que solo necesita espacio en el tree de trabajo.

Si su Git es relativamente nuevo (recomiendo al less Git 2.6 aunque la function estaba allí en 2.5), puede usar git worktree add para crear un nuevo "tree de trabajo vinculado". Un tree de trabajo vinculado restring su repository de origen (y viceversa), pero también tiene un área privada de índice / etapas. Puedes ponerlo en la twig que quieras y hacer lo que quieras allí, incluso crear otras twigs o hacer otras rebases, todo sin molestar a tu tree de trabajo "principal" y al índice "principal".