De acuerdo con git's Object Model si solo cambia los metadatos de una confirmación (es decir, confirma el mensaje) pero no los datos subyacentes ("árbol (s)"), su hash de árbol permanecerá inalterado.
Además de editar un mensaje de compromiso, también está realizando una rebase, que cambiará los hash de árbol de cada confirmación en su historial, porque los cambios realizados desde origin/master
afectarán los archivos en su historial reescrito: lo que significa algunos de los archivos (blobs) a los que apunta su confirmación han cambiado.
Así que no hay una forma a prueba de balas para hacer lo que quiera.
Dicho esto, la edición de una confirmación con rebase -i
no suele alterar la marca de tiempo y el autor del compromiso, por lo que podría usar esto para identificar de manera única sus confirmaciones antes y después de una operación de rebase.
Usted tendría que escribir un script que registra toda la rama de la creación de puntos en contra de estos "marca de tiempo: autor" identificador antes de hacer un rebase, y luego encontrar el reescrita se compromete con la misma "marca de tiempo: autor" Identificación y reajustar la ramificarse en él.
Lamentablemente, no tengo tiempo para intentar escribir este script ahora, así que solo puedo desearle la mejor de las suertes.
Editar: Se puede obtener la dirección autor de correo electrónico y la marca de tiempo 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 robert.m[email protected]:2010-06-16 13:49:41 +0100
Y se puede obtener una lista de las ramas para cada uno de ellos sobre la base de su picadillo de comprometerse:
$ git branch --contains 03dda75
* testbranch
¡Cuidado con múltiples ramas por commit, el ancestro común d4214a2
pertenece a ambas ramas!
En lugar de las ramas, puedes usar 'git notes' para marcar tus confirmaciones, es decir, las que se copian automáticamente durante las rebases, creo. (Es una función nueva, por lo que necesitará la versión más reciente) http://www.kernel.org/pub/software/scm/git/docs/git-notes.html – Cascabel
Vea también [cómo haría una nueva versión de un subhistoria completa: varias ramas, con algunos enlaces entre ellas resultantes de la fusión] (http://stackoverflow.com/a/9706495/94687). La parte desagradable de esa solución es la necesidad de restablecer las referencias de rama de tema a las nuevas confirmaciones reordenadas luego. –