¿Tendría sentido realizar git rebase
mientras se conservan las marcas de tiempo de confirmación?
Creo que una consecuencia sería que la nueva sucursal no necesariamente tendrá fechas de confirmación cronológicamente. ¿Es eso teóricamente posible? (por ejemplo, usando comandos de plomería; solo curiosidad aquí)
Si es teóricamente posible, ¿es posible en la práctica con rebase, no cambiar las marcas de tiempo?
Por ejemplo, suponga que tengo el siguiente árbol:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Ahora, si me rebase oldbranch
en master
la fecha de la confirmó cambios desde febrero 1984 hasta Junio 2010. ¿Es posible cambiar ese comportamiento para que comprometen la marca de tiempo no se cambia? Al final obtendría así:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
¿Eso tendría sentido? ¿Se permite incluso en git tener un historial en el que una confirmación anterior tenga una confirmación más reciente como padre?
fuente
git rebase --committer-date-is-author-date SHA
. Vea mi respuesta editada a continuaciónRespuestas:
Actualización de junio de 2014: David Fraser menciona en los comentarios una solución que también se detalla en " Cambiar marcas de tiempo al cambiar el nombre de git branch ", utilizando la opción
--committer-date-is-author-date
(introducida inicialmente en enero de 2009 en commit 3f01ad6Ver
git am
:(Respuesta original, junio de 2012)
Podría intentar, para un rebase no interactivo
(de esta respuesta SO )
Esto se pasa a
git am
, que menciona:Para
git rebase
, esta opción es "Incompatible con la opción --interactiva".Dado que puede cambiar a voluntad la marca de tiempo de la fecha de confirmación anterior (con
git filter-branch
), supongo que puede organizar su historial de Git con cualquier orden de fecha de confirmación que desee / necesite, ¡incluso establecerlo en el futuro! .Como Olivier menciona en su pregunta, la fecha del autor nunca cambia con una rebaja;
Del libro Pro Git :
Para ser más claro, en este caso, como comenta Olivier:
fuente
git rebase --ignore-date
no funciona. Cambia las fechas de los commits rebaseados.--ignore-date
hace lo contrario de lo que estaba tratando de lograr! Es decir, borra la marca de tiempo del autor y la reemplaza con las marcas de tiempo de commit. Entonces, la respuesta correcta a mi pregunta es: no haga nada, yagit rebase
que en realidad no cambia las marcas de tiempo de los autores de forma predeterminada.--committer-date-is-author-date
opción parece dejar la marca de tiempo del autor y establecer la marca de tiempo del confirmador para que sea la misma que la marca de tiempo del autor original, que es lo que Olivier quería ...Si ya ha arruinado las fechas de confirmación (tal vez con una nueva versión) y desea restablecerlas a sus fechas de autor correspondientes, puede ejecutar:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
fuente
WARNING: Ref 'refs/heads/master' is unchanged
. Estoy usando git versión 1.7.9.5 en Linux (64 bits)git rebase --committer-date-is-author-date <base_branch>
esta manera, git restablecerá la fecha de confirmación solo para las confirmaciones aplicadas a <base_branch> (que probablemente sea el mismo nombre de rama que usaste cuando lo arruinaste).Una pregunta crucial de Von C me ayudó a entender lo que está sucediendo: cuando cambias el nombre, cambia la marca de tiempo del cometer , pero no la marca de tiempo del autor , que de repente todo tiene sentido. Entonces mi pregunta en realidad no era lo suficientemente precisa.
La respuesta es que rebase en realidad no cambia las marcas de tiempo del autor (no es necesario que haga nada para eso), lo cual me conviene perfectamente.
fuente
De forma predeterminada, git rebase establecerá la marca de tiempo del confirmador en el momento en que se crea la nueva confirmación, pero mantendrá intacta la marca de tiempo del autor. La mayoría de las veces, este es el comportamiento deseado, pero en algunos escenarios, tampoco queremos cambiar la marca de tiempo del cometedor. ¿Cómo podemos lograr eso? Bueno, aquí está el truco que suelo hacer.
Primero, asegúrese de que cada uno de los commits que está a punto de rebase tenga un mensaje de commit único y una marca de tiempo del autor (Aquí es donde el truco necesita mejoras, aunque actualmente satisface mis necesidades).
Antes de la modificación, registre la marca de tiempo del confirmador, la marca de tiempo del autor y el mensaje de confirmación de todas las confirmaciones que se volverán a crear en un archivo.
Luego, deje que tenga lugar el rebase real.
Finalmente, reemplazamos la marca de tiempo del confirmador actual con la registrada en el archivo si el mensaje de confirmación es el mismo usando
git filter-branch
.Si algo sale mal, solo paga
git reflog
o todas lasrefs/original/
referencias.Además, puede hacer lo mismo que la marca de tiempo del autor.
Por ejemplo, si la marca de tiempo del autor de algunos commits está fuera de orden, y sin reorganizar estos commits, solo queremos que la marca de tiempo del autor se muestre en orden, entonces los siguientes comandos ayudarán.
fuente