2012-12-07 25 views
12

Ho difficoltà a capire come utilizzare rebase/revert per ottenere ciò.Eliminazione di tutti i commit in una succursale dopo un certo commit

Stavo lavorando al mio ramo master e dopo un certo commit il mio software ha smesso di funzionare. Non volevo perdere le modifiche apportate in quel momento e sono stato messo sotto pressione in tempo per raggiungere un traguardo, quindi sono tornato indietro con alcuni commit con git checkout e ho creato un nuovo ramo chiamato working e ho iniziato a trasferire tutte le mie modifiche lì. Più tardi mi sono reso conto che queste modifiche (fatte sul ramo master) non erano necessarie. Ora voglio tornare al mio ramo principale ed eliminare tutti i commit dopo il commit che ho usato per creare il mio ramo working e quindi unire il mio ramo working al ramo master.

Ho creato un'immagine con un editor di foto online per cercare di spiegare cosa sto cercando di fare. Spero che aiuta:

screen shot of bitbucket

Voglio tenere tutto dopo 5cb967f. sbarazzarsi di tutto tra 5cb967f e a0c1de2 (esclusi quelli)

+0

I commit non necessari sul master sono ancora pubblicati o sono solo nel repository privato? –

+0

sono pubblicati. Non mi dispiace riscrivere la storia. L'ultimo impegno nel mio ramo 'working' è ciò di cui ho bisogno da ora in poi. Non eseguirò il checkout in commit prima del 5cb967f – Xecure

+0

Sei l'unico a lavorare su questo o probabilmente altre persone hanno fatto dei commit che vuoi cancellare? – R0MANARMY

risposta

11

Sono disponibili due opzioni:

storia di riscrittura (distruttiva)

È possibile utilizzare git-rebase di riscrivere la storia, ommiting questi commit. Puoi eseguire un rebase interattivo. Dalla tua descrizione, non sono sicuro di quello che hai in master e working, ma suppongo che sia presente tutta la cronologia (voluta e non voluta).

git checkout master 
    git rebase -i a0c1de2 

A questo punto, il vostro $EDITOR si aprirà con un elenco di commit da a0c1de2 alla TESTA di master. È possibile rimuovere le righe corrispondenti a c460070..a3cb10e per eliminarle dalla cronologia.

La cronologia verrà riscritta localmente. Se si tenta di applicare questa modifica, si tratterà di un aggiornamento non rapido.

Revert, preservare la storia (non distruttiva)

se si preferisce mantenere la storia, è possibile ripristinare una sequenza di commit:

git checkout master 
git revert c460070..a3cb10e 

Questo creerà 7 nuovi commit, ogni ripristinare le modifiche in questi commit indesiderati, in ordine.

0

Qualcosa sul grafico della storia è fasullo. Andando dal markup testo in esso, ciò che si vuole è semplicemente

$ git branch -f master working 

perché non c'erano alcun post-base working impegna sul master che si desidera conservare.

Problemi correlati