it-swarm.it

Come posso ripristinare 1 commit?

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 è?

125
n179911

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.

94
jtimberman

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.

51
iStryker

No. git-reset --hard ti riporterà nella storia. Quello che stai cercando è git revert, che annullerà qualsiasi commit.

8
Peltier

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.

5
hamstar

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

4
mattd

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)!

4
knweiss
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.

1
squeegee
git checkout <treeish> -- /path/to/dir

Questo riporterà la directory dal "treeish" dato per/path/to/dir

1
lokeshpahal

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.

0
Leandro M