2010-06-17 5 views
18

Existe-t-il un moyen de supprimer toutes les validations avant une validation spécifiée et d'utiliser cette validation comme initiale?Supprimer les validations avant la validation spécifique

+0

Je sais que j'ai vu un tutoriel quelque part pour faire quelque chose comme ça ... Il a montré comment vous pouviez conserver un repo historique se terminant par commit X, et ensuite prendre X et HEAD et faire un nouveau repo. avec une annotation sur X sur la façon d'accéder au repo historique. Je ne peux pas le trouver maintenant, mais c'est possible. – Daenyth

Répondre

16

Disons que le nouveau hachage le plus ancien commit est X et nous pouvons utiliser « oldroot » et « newroot » temporairement:

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! 

Cela va créer un commit « newroot » avec le même contenu que le « oldroot » commettre, mais sans aucun parent. Ensuite, il rebase toutes les autres branches sur la nouvelle racine, ce qui devrait être dans l'histoire de toutes les autres.

EDIT: testé et fixé; un peu plus tard, affiné un peu

+2

Notez que "Killed history" devient le nouveau message de validation pour la validation initiale. Si vous voulez quelque chose d'autre, comme le message d'origine par exemple, il vous suffit de le mettre dedans. –

0

La solution la plus facile serait, Pensez à l'origine de votre succursale a engager principal et vous avez un commit premier, maintenant, vous aussi avez un commit deuxième au-dessus de premier. Donc, vous avez quelque chose comme:

main->first->second 

Maintenant, vous voulez avoir deuxième au-dessus de principale plutôt que sur le dessus de premier. Quelque chose comme:

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

Vous pouvez simplement faire,

git rebase -i main 

Cela vous donnera un shell interactif où vous pouvez réorganiser l'ordre des commits ou supprimer toute commettras de votre choix.

Questions connexes