2010-06-17 20 views
18

¿Hay alguna forma de eliminar todas las confirmaciones antes de una confirmación especificada y usar esa confirmación como inicial?Quitar confirmaciones antes del compromiso específico

+0

Sé que he visto un tutorial en algún lugar para hacer algo como esto ... Mostró cómo se puede mantener un repositorio histórico finalizando en commit X, y luego llevar commit X a HEAD y hacer un nuevo repositorio de ellos, con una anotación en X sobre cómo acceder al repos histórico. No puedo encontrarlo ahora, pero es posible. – Daenyth

Respuesta

16

Digamos que el nuevo más antigua de cometer hash es X y podemos usar y "newroot" "oldroot" temporalmente:

git checkout -b oldroot X 
TREE=`git write-tree` 
COMMIT=`echo "Killed history" | git commit-tree "$TREE"` 
git checkout -b newroot "$COMMIT" 
git rebase --onto newroot oldroot master 
# repeat for other branches than master that should use the new initial commit 
git checkout master 
git branch -D oldroot 
git branch -D newroot 
git gC# WARNING: if everything's done right, this will actually delete your history from the repo! 

que creará un 'newroot' comprometerse con el mismo contenido que el 'oldroot' cometer, pero sin ningún padre Luego, rebases todas las otras ramas en la nueva raíz, que debería estar en el historial de todas ellas.

EDIT: probado y arreglado; un poco más tarde, refinado un poco

+2

Tenga en cuenta que el "historial de muertes" se convierte en el nuevo mensaje de confirmación para la confirmación inicial. Si quieres algo más, como el mensaje original, por ejemplo, simplemente canalíalo allí. –

0

La solución más fácil sería, Considere originalmente su sucursal tiene comprometerse principal y se realizó un compromiso primera, ahora también se realizó un comprometerse segundo en la parte superior de primera. Así que hay algo así como:

main->first->second 

Ahora usted quiere tener segundo en la parte superior de principal en lugar de en la parte superior de la primera . Algo así como:

main->second->first or main->second 

Simplemente puede hacer,

git rebase -i main 

Esto le dará un shell interactivo donde se puede cambiar el orden de confirmaciones o eliminar cualquier commit de su elección.

Cuestiones relacionadas