Come posso ripristinare 1 commit?


127

Ho 2 commit che non ho premuto:

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


3
Questa domanda sembra fuori tema perché riguarda uno strumento di programmazione. Appartiene allo Stack Overflow.
Peter Mortensen,

@PeterMortensen Concordato. Questo è utile per SuperUser
Kolob Canyon,

Risposte:


95

Il modo più sicuro e probabilmente più pulito di procedere è il riposizionamento interattivo.

git rebase -i HEAD^^

O,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Da lì puoi annullare i commit, che mettono insieme uno o più commit nel commit precedente. Per eliminare completamente un commit dalla cronologia, eliminare la riga dall'elenco.

È possibile ripristinare un commit con git revertma aggiungerà altri messaggi di commit alla cronologia, il che potrebbe essere indesiderabile. Usa il -nparametro per dire a Git di non impegnare subito il ripristino. Puoi rimodellare in modo interattivo e schiacciarli fino a un precedente commit per mantenere le cose pulite.

Se i due commit con cui stai lavorando hanno effetto sugli stessi file, potresti riscontrare un conflitto di unione.

Il ripristino del repository con git reset --harddeve essere eseguito con cura, poiché non può essere annullato.

La riscrittura della storia dovrebbe essere eseguita con cura.


Come posso cancellare un commit durante 'git rebase'? Ci sono solo 3 comandi: pick, edit, squash. Non è possibile eliminare AFAIK.
n179911,

8
elimina completamente la riga dall'elenco ed elimina tale commit
jtimberman

quando volevo annullare il cambiamento, non volevo lasciarne traccia. Se non vuoi lasciare traccia del tuo ripristino, questo è il modo migliore per farlo.
Phillip Whelan,

"Il modo più sicuro e probabilmente più pulito per procedere è di riformulare in modo interattivo" Forse no se non usi vim. Sono stato fortunato e ho capito come uscire da quel casino. Ancora votato perché dovrei imparare vim :-)
isimmons

Suggerirei di utilizzare rebaseil meno possibile. Se lavori con gli altri, creane uno revert.
boldnik,

52

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

Git Elimina l'ultimo commit

Di tanto in tanto a tarda notte, quando finivo il caffè, commetto cose che non avrei dovuto. Quindi passo i successivi 10-15 minuti cercando su Google come rimuovere l'ultimo commit che ho fatto. Quindi dopo la terza volta ho voluto registrarlo in modo da poterlo fare riferimento in seguito.

Se hai commesso spazzatura ma non hai premuto,

git reset --hard HEAD~1

HEAD ~ 1 è una scorciatoia per il commit prima di head. In alternativa puoi fare riferimento allo SHA-1 dell'hash che vuoi ripristinare. Si noti che quando si utilizza --hard qualsiasi modifica ai file tracciati nella struttura di lavoro poiché il commit prima di head viene perso.

Se non si desidera cancellare il lavoro svolto, è possibile utilizzare l' --softopzione che eliminerà il commit ma lascerà tutti i file modificati "Modifiche da impegnare", come direbbe git status.

Ora se hai già spinto e qualcuno ha tirato, che di solito è il mio caso, non puoi usare git reset. Puoi comunque fare un ripristino git,

git revert HEAD

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


2
Con l'opzione --soft, è perfetto per dove rinominare un file e accidentalmente "git commit -a" anziché usare prima "git add".
Aaron Harun,

8

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


4
Bene, questo funziona ma inquina anche il log di commit. Se questi commit non sono già stati spinti / tirati, è meglio pulirli con un rebase interattivo. La possibilità di cambiare la cronologia è uno dei principali vantaggi di git rispetto ad altri sistemi di controllo delle versioni.
knweiss,

6

Ho appena fatto questo:

git rebase -i HEAD^^

L'ho rovinato così ho fatto

git rebase --abort

Poi l'ha fatto di nuovo. Quindi ho dovuto spingere in questo modo:

git push origin master -f

E ha distrutto i commit più nuovi di quelli a cui avevo eseguito il rollback. Ha funzionato alla grande.


4

No, git reset --hard baf8d5eeliminerà il 3368e1ccommit e HEAD sarà in baf8d5eseguito.

Se si desidera mantenere il 3368e1ccommit ed eliminare il bad8d5ecommit, la soluzione più semplice è 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 eliminare la bad8d5eriga di commit e salvare. git riscriverà quindi la tua cronologia e il secondo commit sarà sparito.

Ci sono altri comandi utili che è possibile utilizzare nell'editor messaggio di commit come squash, editecc rebase interattivo è molto potente!

Non farlo se qualcuno ha già visto questi commit (spingi o tira dal tuo repository)!



1
git reset --hard {ref}

è l'unico modo per annullare un commit se nel repository è presente solo un altro commit (ad es. commit iniziale e 1 altro). Il resto dei modi (ripristina, rebase) si rifiuta di funzionare, almeno a partire dal 1.7.5.1.

Se lo segui git resetcon a git gcallora git eliminerà completamente i vecchi dati di commit dal repository.


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

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


0

Ho ottenuto che funzioni 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 spingere all'origine le operazioni UNMERGE che avevo fatto localmente. Continuava a dire che "non è riuscito a spingere alcuni riferimenti" al repository centrale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.