¿Cómo uso git rebase -i después de la fusión de git sin estropear las cosas?

Tengo la siguiente situación: realicé algunos commits en mi repository local, y luego una gran fusión de otra twig (~ 150 commits) en el master – tuvo muchos conflictos.

Ahora, quiero mover una confirmación que hice antes de la fusión para que esté detrás de ella antes de presionar.

Normalmente, usaría "rebase -i" para eso.

Desafortunadamente, el comportamiento pnetworkingeterminado es romper la compilation one-merge-commit que hice, que realmente agregó 150 commits más para dominar en commits separados (entiendo que sería como si yo usara rebase en lugar de merge para comenzar), lo cual es un mal comportamiento para por varias razones.

Descubrí el indicador '-p' para rebase, que conserva las fusiones, y estaba muy contento con él. Desafortunadamente, esto de hecho aplica la misma fusión otra vez, y olvidé todo sobre mi arduo trabajo en la resolución de conflictos. De nuevo, ¡mal comportamiento!

¿Hay una solución para lo que quiero? ¿Usar rebase -i después de combinar para reorderar o editar confirmaciones específicas sin tener que repetir mis operaciones posteriores a la fusión?

¡Gracias!

Esto es lo que hace el script rerere-train.sh que mencioné en mi comentario: esencialmente rehace la fusión, usa su resolución y simplemente permite volver a verla. Puede hacerlo manualmente solo para su compromiso individual si lo desea:

 git checkout <parent of merge commit> git merge <merged commit> # if this goes cleanly, we're done git rerere # done automatically if rerere.enabled is true git checkout <merge commit> -- . # check out the files from the result of the merge git rerere # done automatically if rerere.enabled is true git reset --hard # wipe away the merge # and you'd want to follow with git checkout <branch> to return to where you were 

Pero también podría simplemente configurar rerere.enabled en true, y hacer esos pasos less las llamadas directas a git rerere , y lo establecerá en el futuro, con rerere ejecutándose automáticamente cada vez que resuelva conflictos. Esto es lo que hago , es increíble.

Si desea ejecutar el script directamente, probablemente desee ejecutarlo con arguments como rerere-train.sh ^<commit before the merge> <current branch> . (La notación " ^commit " significa "no pasar más allá de esto en el historial", por lo que no se molestará en hacer esto para todos los commit de fusión en su repository).

Sin embargo, si se le pide que haga lo suyo, debe terminar con la resolución deseada registrada. Eso significa que puede seguir adelante y hacer su rebase -i, y cuando se encuentre con el conflicto, volverá a REUSE la RE-resolución resuelta. Solo un aviso: aún deja los files marcados como conflictivos en el índice, para que pueda inspeccionarlos y asegurarse de que lo que hizo tenga sentido. Una vez que lo hagas, utiliza git add para registrarlos como si hubieses resuelto los conflictos tú mismo, ¡y continúa como de costumbre!

La página git-rerere contiene una muy buena y larga descripción del uso normal de rerere, que en realidad no implica llamar a rerere, todo se hace automáticamente. Y una nota que no enfatiza: se basa en trozos de conflicto, por lo que puede reutilizar una resolución incluso si el conflicto termina en un lugar completamente diferente, siempre y cuando siga siendo el mismo conflicto textual.

He hecho un script para hacer esto aquí . Vea los problemas abiertos para las limitaciones conocidas.

Primero rerere-train.sh instalar rerere-train.sh en su RUTA. En Fedora, esto se puede hacer con:

  install "$(rpm -ql git|grep '/rerere-train.sh$')" ~/bin 

Utilicé rerere-train.sh de la respuesta del usuario @ Jefromi. Sin embargo, tuve este error:

 $ ../rerere-train.sh HEAD C:\Program Files\Git\mingw64/libexec/git-core/git-sh-setup: line 6: .: git-sh-i18n: file not found 

De este http://kernel.opensuse.org/cgit/kernel-source/commit/?h=linux-next&id=d52b9f00588bb18d7f7a0e043eea15e6c27ec40c vi esto:

Michal Marek

El asistente de git-sh-setup aparentemente nunca ha sido usado por scripts fuera de git. Esto se hizo evidente con git 2.10:

Después de download una versión anterior – 2.3.4 portátil – logré hacer que rerere-train.sh funcionara.