2013-03-10 16 views
9

Ecco cosa voglio fare. Voglio tornare a 2 commit prima, riportare i file che sono cambiati in quel commit come un nuovo commit forse. Ma non voglio perdere il mio ultimo impegno. Il mio ultimo commit ha alcuni errori nel codice, ma vorrei mantenerlo per ora.Come tornare al commit precedente senza perdere l'ultimo commit in Git?

Ho letto alcuni documenti ma nessuno ha chiarito cosa succede quando si ripristina la testa. Perdi tutti i commit fino a quello che stai ripristinando (andando indietro) per esempio?

io sto cercando di capire come funziona tutto questo, ma io sono piuttosto confusi su git revert, reset e checkout comandi.

Mi rendo conto che avrei dovuto nascondere l'ultimo commit invece di commettere, ma questa è un'altra storia per ora.

+1

Puoi essere un po 'più specifico su cosa vuoi fare? Vuoi annullare il commit precedente? O vuoi mantenere la maggior parte dei cambiamenti fatti dai due commit, tranne che in un paio di file? – jszakmeister

+0

jszakmeister, beh, non voglio liberarmi di nessun commit. Voglio mantenere intatta la mia storia passata. Voglio solo riportare 2 commit prima come una nuova fase di lavoro, suppongo. –

+0

Non è ancora chiaro cosa significhi "riportare indietro". – wRAR

risposta

9

revert esegue un nuovo commit che ripristina le modifiche apportate da un commit precedente. reset --hard modifica l'HEAD del ramo corrente sul commit specificato. checkout passa la copia di lavoro al ramo specificato o al commit.

Quando si reimposta un ramo su un commit precedente, i nuovi commit vengono persi se non fanno parte di altri rami o antenati di tag (sono comunque accessibili tramite reflog).

Non è chiaro che cosa è necessario fare, le soluzioni più probabili sono revert (per ripristinare completamente un vecchio commettere o una serie di commit) e rebase -i (per cambiare un vecchio commettere o cancellarlo dalla storia).

+0

'git revert' ha forti implicazioni poiché crea un commit che annulla le modifiche di un commit precedente. Fai attenzione quando lo usi, a meno che tu non sia sicuro di ciò che intendi. – LopSae

+0

@LopSae creato commit non è pubblicato, quindi puoi facilmente rimuoverlo se fa qualcosa che non volevi. reset e rebase sono comandi molto più pericolosi in quanto il recupero dagli errori è molto più difficile. – wRAR

+0

Ciao, @wRAR. Quando eseguo il checkout su un commit precedente, dopo di che, quando uso git log per visualizzare la cronologia dei commit, tutto il record dopo il commit che ho riacceso non è presente. Come risolverlo? Intendo visualizzare la cronologia completa del commit dopo il checkout a un commit precedente. – Mario

10

Se si desidera tornare indietro, dire 2 commette precedente, è sufficiente eseguire git checkout HEAD~2. Questo ti prenderà tutto come era allora. Se eri sul ramo master, git checkout master ti riporterà al presente. Se, tuttavia, si desidera mantenere lo stato corrente ma avviare un nuovo ramo di sviluppo, git checkout -b HEAD~2 avvierà un nuovo ramo lì. Nel caso in cui si desideri riavvolgere il master ma non perdere il lavoro corrente, incompleto/rotto, fare

git branch wip   # New branch ends a current tip 
git reset --hard HEAD~2 # Old branch rewound, get files from then