tag - git commit--amend
¿Cómo borrar el antiguo historial de git? (2)
Tengo un repositorio git con muchos, muchos (2000+) confirmaciones, por ejemplo:
l-- m -- n
/
a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k
/
x -- y -- z
y quiero truncar el historial de registro anterior: eliminar todas las confirmaciones del historial de registro a partir de (por ejemplo) cometer "f" pero como el principio del repositorio.
¿Cómo hacerlo?
Para no perder alguna historia; mejor primero toma una copia de tu repositorio :). Aquí vamos: ( <f>
es el sha del commit f que desea que sea el nuevo root commit)
git checkout --orphan temp <f> # checkout to the status of the git repo at commit f; creating a branch named "temp"
git commit -m "new root commit" # create a new commit that is to be the new root commit
git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch
git branch -D temp # we don''t need the temp branch anymore
Si tiene un control remoto en el que desea tener el mismo historial truncado; Puedes usar git push -f
. Advertir que este es un comando peligroso; ¡No uses esto a la ligera! Si desea asegurarse de que su última versión del código sigue siendo la misma; Puede ejecutar git diff origin/master
. Eso no debería mostrar cambios (ya que solo el historial cambió, no el contenido de sus archivos).
git push -f
Los siguientes 2 comandos son opcionales: mantienen su repo de git en buena forma.
git prune --progress # delete all the objects w/o references
git gc --aggressive # aggressively collect garbage; may take a lot of time on large repos
--shallow-since
proporciona una posible solución para su problema usando la opción --shallow-since
. Si solo hay un pequeño número de confirmaciones desde f
y no hay problemas para contarlas, puede usar la opción --depth
.
La segunda opción ( --depth
) clona solo la rama especificada. Si necesita sucursales adicionales, puede agregar el repositorio original como control remoto y usar git fetch
para recuperarlos.
Cuando esté satisfecho con el resultado, elimine el repositorio anterior y cambie el nombre del nuevo para reemplazarlo. Si el repositorio anterior es remoto, vuelva a crearlo después de la eliminación y presione el nuevo repositorio.
Este enfoque tiene la ventaja de tamaño y velocidad. El nuevo repositorio solo contiene las confirmaciones que desea y no es necesario ejecutar git prune
o git gc
para eliminar los objetos antiguos (porque no están allí).