Ho 2 commit che non ho spinto:
$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.
Come posso ripristinare il mio primo (il più vecchio), ma mantenere il secondo?
$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...
Da qui:
http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want
Devo solo fare:
git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
Questo è?
Il modo più sicuro e probabilmente più pulito è rebase in modo interattivo.
git rebase -i HEAD^^
O,
git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^
Da lì puoi schiacciare commit, che mette uno o più commit nel commit precedente. Per eliminare completamente un commit dalla cronologia, elimina la riga dall'elenco.
È possibile ripristinare un commit con git revert
ma aggiungendo altri messaggi di commit alla cronologia, il che potrebbe non essere desiderabile. Usa il parametro -n
per dire a Git di non eseguire il commit immediatamente. È possibile rebase in modo interattivo e schiacciare quelli su un precedente commit per mantenere le cose pulite.
Se i due commit con cui stai lavorando influenzano gli stessi file, potresti vedere un conflitto di unione.
La reimpostazione del repository con git reset --hard
dovrebbe essere eseguita con attenzione, in quanto non può essere annullata.
La cronologia di riscrittura dovrebbe essere eseguita con cura.
Questo se da http://nakkaya.com/2009/09/24/git-delete-last-commit/ e ha funzionato per me
Cancella Cancella ultimo commit
Di tanto in tanto, a notte fonda, quando ho finito il caffè, commetto cose che non dovrei avere. Poi spendo i prossimi 10 - 15 minuti a cercare su google come rimuovere l'ultimo commit che ho fatto. Quindi, dopo la terza volta, volevo fare un disco per poterlo consultare più tardi.
Se hai commesso spazzatura ma non spinto,
git reset --hard HEAD~1
HEAD ~ 1 è una scorciatoia per il commit prima della testa. In alternativa puoi fare riferimento allo SHA-1 dell'hash che vuoi ripristinare. Si noti che quando si usa --hard qualsiasi modifica ai file tracciati nell'albero di lavoro poiché il commit prima della testa è perso.
Se non vuoi cancellare il lavoro che hai fatto, puoi usare l'opzione
--soft
che cancellerà il commit ma lascerà tutti i tuoi file modificati "Changes to be committed", come lo avrebbe dichiarato lo stato git.Ora se hai già spinto e qualcuno ha tirato che di solito è il mio caso, non puoi usare git reset. Puoi comunque fare un git revert,
git revert HEAD
Questo creerà un nuovo commit che inverte tutto ciò che viene introdotto dal commit accidentale.
No. git-reset --hard ti riporterà nella storia. Quello che stai cercando è git revert, che annullerà qualsiasi commit.
Ho appena fatto questo:
git rebase -i HEAD^^
L'ho fregato così ho fatto
git rebase --abort
Poi lo ha fatto di nuovo. Quindi ho dovuto spingere in questo modo:
git Push Origin master -f
E ha distrutto i commit più nuovi rispetto al commit a cui mi ero arreso. Ha funzionato alla grande.
In riferimento al commento di jtimberman sul fatto che git reset --hard
è annullabile, non è del tutto vero. Vedi qui: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1
No, git reset --hard baf8d5e
cancellerà il commit 3368e1c
e HEAD sarà in baf8d5e
in seguito.
Se si desidera mantenere il commit 3368e1c
ed eliminare il commit bad8d5e
, la soluzione più semplice consiste nel fare un "git rebase -i HEAD~2
" (cioè il rebase interattivo degli ultimi due commit). Questo comando avvierà l'editor dei messaggi di commit e vedrai una riga per ciascuno degli ultimi due commit. Lì basta cancellare la riga di comando bad8d5e
e salvare. git quindi riscriverà la tua cronologia e il 2 ° commit sarà sparito.
Ci sono altri comandi utili che puoi usare nell'editor dei messaggi di commit come squash
, edit
, ecc. Il rebase interattivo è MOLTO potente!
Non farlo se qualcuno ha già visto questi commit (Spingi o tira dal tuo repository)!
git reset --hard {ref}
è l'unico modo per annullare un commit se c'è un solo altro commit nel repository (ad es. commit iniziale e altro). Il resto dei modi (revert, rebase) si rifiutano di funzionare, almeno a partire da git 1.7.5.1.
Se segui git reset
con un git gc
allora git in realtà cancellerà completamente i vecchi dati di commit dal repository.
git checkout <treeish> -- /path/to/dir
Questo riporterà la directory dal "treeish" dato per/path/to/dir
Ho fatto in modo che funzionasse modificando manualmente i codici hash degli ultimi commit dai file HEAD all'interno della cartella del repository:
"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"
Prima di allora, non ero mai stato in grado di inviare a Origin le operazioni UNMERGE che ho fatto localmente. Continuava a dire che "non è riuscito a spingere alcuni riferimenti" al repository centrale.