2010-06-17 22 views
18

C'è un modo per rimuovere tutti i commit prima di un commit specificato e utilizzare quello commit come iniziale?Rimuovi commit prima del commit specifico

+0

So che ho visto un tutorial da qualche parte per fare qualcosa di simile ... Ha mostrato come è possibile mantenere un repo storico che termina con commit X, quindi prendere commit X fino a HEAD e creare un nuovo repo da loro, con un'annotazione su X su come accedere al repository storico. Non riesco a trovarlo adesso, ma è possibile. – Daenyth

risposta

16

Diciamo che la nuova antica commettere di hash è X e possiamo usare "oldroot" e "newroot" temporaneamente:

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! 

che creerà un 'newroot' impegnarsi con gli stessi contenuti come la 'oldroot' commettere, ma senza genitori. Quindi, rebase tutti gli altri rami sulla nuova radice, che dovrebbe essere nella cronologia di tutti loro.

MODIFICA: testata e riparata; un po 'più tardi, raffinato un po'

+2

Si noti che "Cronologia uccisa" diventa il nuovo messaggio di commit per il commit iniziale. Se vuoi qualcos'altro, ad esempio il messaggio originale, basta inserirlo dentro. –

0

La soluzione più facile sarebbe, Considerate inizialmente la filiale ha commettere principale e avete fatto un commit prima, ora avete anche un commettete secondo in cima prima. In modo da avere qualcosa di simile:

main->first->second 

Ora si vuole avere secondo in cima principale piuttosto che sulla parte superiore del prima. Qualcosa di simile:

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

Si può semplicemente fare,

git rebase -i main 

Questo vi darà una shell interattiva in cui è possibile modificare l'ordine di commit o rimuovere qualunque commettere di vostra scelta.

Problemi correlati