2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Come posso annullare 1 impegno?

Ho 2 impegni che non ho annullato:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Come posso annullare il primo impegno (il più vecchio), ma mantenere il secondo?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...
``` ```
git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Da qui: http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want &003

Devo solo fare:

&001

Ovvero?

Risposte (9)

99
99
99
2009-09-03 21:32:01 +0000

Il modo più sicuro e probabilmente il più pulito di andare è quello di rebase interattivo.

git rebase -i HEAD^^

Or,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^
``` &001 


Da lì è possibile squash commits, che mette uno o più commits insieme nel commit precedente. Per cancellare completamente un commit dalla cronologia, cancella la linea dalla lista. 


Puoi ripristinare un commit con `git revert` ma il suo andare ad aggiungere altri messaggi di commit alla cronologia, il che potrebbe essere indesiderabile. Usa il parametro `-n` per dire a Git di non effettuare subito il revert. Puoi rifare il rebase interattivamente e schiacciare quelli fino ad un commmit precedente per mantenere le cose pulite. 


Se i due commit con cui stai lavorando qui influenzano lo stesso file (o file), potresti vedere un conflitto di merge. 


Il reset del repository con `git reset --hard` dovrebbe essere fatto con cura, perché non può essere annullato. 


La riscrittura della cronologia dovrebbe essere fatta con cura.
54
54
54
2011-08-05 17:52:58 +0000

Questo se da http://nakkaya.com/2009/09/24/git-delete-last-commit/ e ha funzionato per me

Git Delete Last Commit

Una volta ogni tanto a tarda notte quando ho finito il caffè, commetto cose che non avrei dovuto commettere. Poi passo i successivi 10-15 minuti a cercare su Google come rimuovere l'ultimo impegno che ho fatto. Così, dopo la terza volta, ho voluto registrarlo per potervi fare riferimento in seguito.

Se avete commesso robaccia ma non spinta,

git reset --hard HEAD~1

HEAD~1 è una stenografia per l'impegno prima della testa. In alternativa potete fare riferimento all'SHA-1 dell'hashish a cui volete reimpostare. Notare che quando si usa –hard qualsiasi modifica ai file tracciati nell'albero di lavoro dal momento che il commit prima di head sono persi.

Se non volete cancellare il lavoro che avete fatto, potete usare l'opzione --soft che cancellerà il commit ma lascerà tutti i vostri file modificati “Modifiche da impegnare”, come direbbe lo stato di git.

Ora se avete già spinto e qualcuno ha tirato, che di solito è il mio caso, non potete usare git reset. Potete comunque fare un git revert,

git revert HEAD

Questo creerà un nuovo commit che inverte tutto ciò che è stato introdotto dal commit accidentale.

8
8
8
2009-09-03 21:26:55 +0000

No. git-reset –hard vi riporterà indietro nella storia. Quello che stai cercando è il git revert, che annullerà qualsiasi impegno.

6
6
6
2011-12-12 04:39:48 +0000

Ho appena fatto questo:

git rebase -i HEAD^^
``` ```
git rebase --abort

Ho fatto un casino, quindi ho fatto

git push origin master -f
``` &001 


e poi l'ho fatto di nuovo. Poi ho dovuto spingere in questo modo: 


&001 &001 


E ha distrutto gli impegni più nuovi di quelli a cui ero tornato. Ha funzionato alla grande.
4
4
4
2010-01-28 03:48:38 +0000

In riferimento al commento di Jtimberman sul fatto che git reset --hard non può essere annullato, questo non è del tutto vero. Vedi qui: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
4
4
2009-09-03 21:46:37 +0000

No, git reset --hard baf8d5e cancellerà il commit 3368e1c e HEAD sarà a baf8d5e dopo.

Se vuoi mantenere il commit 3368e1c e cancellare il commit bad8d5e la soluzione più semplice è fare un “git rebase -i HEAD~2” (cioè un rebase interattivo degli ultimi due commit). Questo comando lancerà il tuo editor di messaggi di commit e vedrai una riga per ognuno degli ultimi due commit. Qui devi solo cancellare la linea di commit bad8d5e e salvare. git riscriverà la tua cronologia e il secondo commit sarà andato.

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 (push o pull dal tuo repository)!

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Che riporterà la directory dal dato “treeish” per il /path/to/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

è l'unico modo per annullare un commit se c'è solo un altro commit nel repo (es. commit iniziale e 1 ulteriore commit). Gli altri modi (revert, rebase) rifiutano di lavorare, almeno a partire da git 1.7.5.1.

Se si segue l’git reset con un git gc allora git cancellerà completamente i vecchi dati del commit dal repo.

0
0
0
2014-06-13 00:08:14 +0000

Ho fatto in modo che questo funzionasse modificando manualmente i codici hash degli ultimi commits dai file HEAD all'interno della cartella del repository:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Prima di questo, non sono mai stato in grado di spingere per originare le operazioni di UNMERGE che facevo localmente. Continuava a dire che “non è riuscito a spingere alcuni refs” al Central Repository.