git rebase branch con todas las subramificaciones

¿Es posible volver a establecer una base de una twig con todas sus subtwigs en git?

A menudo uso twigs como tags rápidas / mutables para marcar ciertos commits.

* master * * featureA-finished * * origin/master 

ahora quiero volver a establecer la rebase -i master en origin/master , para cambiar / volver a rebase -i la function de confirmación A featureA-finished^

después de git rebase -i --onto origin/master origin/master master , básicamente quiero que el historial sea:

 * master * * featureA-finished * (changed/reworded) * origin/master 

pero lo que obtengo es:

 * master * * (same changeset as featureA-finished) * (changed/reworded) | * featureA-finished |.* (original commit i wanted to edit) * origin/master 

¿Hay una forma de evitarlo, o estoy atascado con la recreación de las twigs en las nuevas confirmaciones rebasadas?

Según el Modelo de Objetos de git si solo cambias los metadatos de un compromiso (es decir, post de compromiso) pero no los datos subyacentes ("tree (es)") contenidos en él, entonces el hash de tree permanecerá sin cambios.

Además de editar un post de compromiso, también está realizando una rebase, que cambiará los hash de tree de cada confirmación en su historial, porque cualquier cambio que se realice desde el origin/master afectará los files en su historial reescrito: lo que significa que algunos de los files (blobs) a los que apunta su compromiso han cambiado.

Entonces, no hay una forma a testing de balas para hacer lo que quieras.

Dicho esto, editar una confirmación con rebase -i generalmente no altera la timestamp y el autor de la confirmación, por lo que puedes usar esto para identificar de manera única tus confirmaciones antes y después de una operación de rebase.

Debería escribir un script que registre todos los puntos de inicio de la sucursal con este identificador "timestamp: author" antes de hacer una rebase, y luego encuentre los commit reescritos con el mismo ID "timestamp: author" y vuelva a establecer la bifurcación de la bifurcación.

Tristemente, no tengo time para intentar escribir este guion yo mismo ahora, ¡así que solo puedo desearos la mejor de las suertes!

Editar : puede get la dirección de correo electrónico del autor y la timestamp usando:

 $ git log --graph --all --pretty=format:"%h %ae:%ci" * 53ca31a [email protected]:2010-06-16 13:50:12 +0100 * 03dda75 [email protected]:2010-06-16 13:50:11 +0100 | * a8bb03a [email protected]:2010-06-16 13:49:46 +0100 | * b93e59d [email protected]:2010-06-16 13:49:44 +0100 |/ * d4214a2 [email protected]:2010-06-16 13:49:41 +0100 

Y puede get una list de sucursales para cada uno de estos en function de su hash de confirmación:

 $ git branch --contains 03dda75 * testbranch 

Tenga cuidado con las múltiples twigs por commit, ¡el ancestro común d4214a2 pertenece a ambas twigs!

No estoy seguro de cómo exactamente llegaste allí, pero:

 git branch -f (same changeset as featureA-finished) 

debería ser suficiente para restablecer su twig featureA-finished functionA con el historial correcto.

parece que esta característica se está convirtiendo lentamente en git. rebase obtendrá la opción --rebase-refs que hará exactamente lo que me pidió la respuesta original. para la serie de parches propuesta, vea el hilo rebase: command "ref" y opciones –rewrite- {refs, heads, tags} en gmane.

Lo que aconsejo es volver a establecer la base featureA-finished en origin/master primero. Realice el paso de networkingacción siguiente. Después de eso, rebase master en featureA featureA-finished . Esto te dará el resultado final que deseas.

Tenga en count que necesitará usar -i en ambas rebases, y puede que tenga que eliminar todas las confirmaciones de la function original A featureA-finshed en la segunda rebase. Si quisiera, podría escribir un script que eliminaría esto guardando la twig intermedia y usándola como base para una rebase --onto la nueva versión. Incluso podría manejar una secuencia de tales 'subramiones' si lo escribió correctamente. Si necesita ayuda, puedo intentar sacar una.