2010-08-08 12 views
7

Supponiamo di avere un repository e 5 commit:È possibile revocare i commit?

  • commettere 1
  • commettere 2
  • commettere 3
  • commettere 4
  • commettere 5

E ora mi rendo conto impegna 4 e 5 sono una cattiva idea. Voglio rimuovere completamente tutte le modifiche effettuate in commit 4 e 5. Come si fa?

+0

Vorrei andare con ripristino se hai inviato a un repository pubblico. altrimenti qualcuna delle altre opzioni va bene. – xenoterracide

risposta

4

git revert commit_hash

Si ritorna dato commit. Nota che il ripristino è un altro commit che ignora le modifiche da commit_hash, non rimuovendo il commit dato dal repository.

3

probabilmente sarei creare un nuovo ramo dal commettere 3.

git checkout -b commit3 

e poi rebase maestro da quella commettere

http://git-scm.com/docs/git-rebase

naturalmente, si sta utilizzando argomento rami per mantenere il vostro dev rami separati finché non sai che sono una buona idea, giusto?

6

Se commette 4 e 5 sono in un solo repository e non sono stati spinti o tirati da qualsiasi altro repository si può semplicemente:

git ripristinare SHA1_HASH_OF_COMMIT_3 --hard

È è possibile trovare l'hash SHA1 di un commit utilizzando git log oppure è possibile utilizzare tecniche di denominazione più avanzate, vedere git help rev-parse in particolare la sezione 'SPECIFICARE LE REVISIONI'.

L'utilizzo di questo comando lascerà i commit 4 e 5 irraggiungibili dalla punta del ramo. I commit, tuttavia, non andranno persi poiché tali commit sono tenuti nel reflog del ramo. È possibile utilizzare git reflog per identificare un commit non raggiungibile. Il ripristino può quindi essere eseguito con un altro git reset --hard. Questa pagina here descrive tutto molto bene.

Si consiglia di eseguire regolarmente git gc; alcuni comandi lo fanno anche automaticamente. Questo essenzialmente esegue la "manutenzione" sul repository, come "comprimere le revisioni dei file (per ridurre lo spazio su disco e aumentare le prestazioni) e rimuovere gli oggetti non raggiungibili". Gli oggetti non raggiungibili vengono eliminati dal repository dopo (un valore predefinito di) 30 giorni. Questo può essere modificato utilizzando l'opzione di configurazione gc.reflogExpireUnreachable.

+0

"finché non si esegue' git gc' "è fuorviante: si richiama automaticamente e l'utente in genere non ha mai bisogno di eseguirlo. Il commit inoltre non sarà considerato irraggiungibile fintanto che è nei reflog, che impiegano 90 giorni per scadere. Anche se si cancella il ramo (e con esso i suoi riferimenti) il valore predefinito è solo di sfoltire gli oggetti più vecchi di 30 giorni. Upshot: non sta andando via in qualunque momento presto. – Cascabel

+0

@Jefromi Sono d'accordo, è fuorviante. Ci scusiamo per una risposta abbastanza affrettata. Ho aggiornato la mia risposta con un po 'più di dettaglio. –

Problemi correlati