Come annullare il commit dell'ultimo commit git senza push senza perdere le modifiche


540

C'è un modo per ripristinare un commit in modo che la mia copia locale mantenga le modifiche apportate in quel commit, ma diventino modifiche non impegnate nella mia copia di lavoro? Il rollback di un commit ti porta al commit precedente: voglio mantenere le modifiche apportate ma le ho assegnate al ramo sbagliato.

Questo non è stato spinto, solo impegnato.



6
git reset --softed git reset --mixedentrambi lo fanno (in modo leggermente diverso), vedi git-reset
torek

Risposte:


932

Esistono molti modi per farlo, ad esempio:

nel caso in cui non sia stato ancora inviato il commit pubblicamente:

git reset HEAD~1 --soft   

Ecco fatto, le modifiche al commit saranno nella directory di lavoro, mentre il commit LAST verrà rimosso dal ramo corrente. Vedi git reset man


Nel caso in cui tu abbia spinto pubblicamente (su un ramo chiamato 'master'):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

ripristina il commit normalmente e premi

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

ora se vuoi avere quelle modifiche mentre le modifiche locali nella tua copia di lavoro ("in modo che la tua copia locale mantenga le modifiche apportate in quel commit") - ripristina semplicemente il commit di ripristino con l' --no-commitopzione:

git revert --no-commit 86b48ba (hash of the revert commit).

Ho realizzato un piccolo esempio: https://github.com/Isantipov/git-revert/commits/master


5
grazie mille, nel mio caso ho avuto due commit che volevo annullare, e l'esecuzione di 'git reset HEAD ~ 1 --soft' due volte di seguito mi ha portato dove dovevo essere.
Geoff Gunter,

2
per aggiungere un po 'di chiarezza se non stai usando la CLI, il primo resetcomando menzionato è dire "dolcemente" resettato a 1 giro prima della testa, che preserva tutte le modifiche locali. questo non mi è stato immediatamente evidente per l'uso in SourceTree. assicurati solo di reimpostare dolcemente il rev precedente, non il rev che stai tentando di ripristinare
Jon B,

1
Ho provato l'approccio "già spinto" e non funziona per me, con git 2.14.1: dice "Already up to date"quando si fa l'unione.
Fabio A.

1
@FabioA. , Ho aggiornato la risposta con una versione funzionante. Grazie per averlo notato!
Isantipov,

1
Questo non funziona Ho saltato il reset e il commit e solo il git è stato ripristinato e espulso ... ora forse le modifiche perse non sono ancora sicuro ... fortunatamente ho fatto un backup nel modo più semplice si spera che si continuerà a funzionare;) altrimenti è possibile copiare le modifiche da quello .
Skybuck Flying

13

Se hai apportato le modifiche, puoi undofarlo e spostare i file sullo stage senza usare un altro ramo.

git show HEAD > patch
git revert HEAD
git apply patch

Creerà un file patch che contiene le ultime modifiche al ramo. Quindi ripristina le modifiche. Infine, applica i file patch all'albero di lavoro.


potresti volere rm patchanche tu
Max Coplan,

6

Per il caso: "Questo non è stato spinto, solo impegnato ". - se usi IntelliJ (o un altro IDE JetBrains) e non hai ancora apportato modifiche , puoi procedere successivamente.

  1. Vai alla finestra di controllo della versione ( Alt + 9 / Command + 9 ) - scheda "Log".
  2. Fare clic con il tasto destro su un commit prima dell'ultimo.
  3. Reimposta il ramo corrente su qui
  4. scegli Soft (!!!)
  5. premere il pulsante Reimposta nella parte inferiore della finestra di dialogo.

Fatto.

Questo "annulla" le modifiche e riporta il tuo stato git al punto precedente il tuo ultimo commit locale. Non perderai le modifiche apportate.


2
Adoro imparare il modo JetBrains, grazie! Ciò equivale a git reset --soft "HEAD^"su Windows, tra l'altro. :)
payne,

3

Con me succede soprattutto quando spingo le modifiche al ramo sbagliato e me ne rendo conto in seguito. E i seguenti lavori nella maggior parte dei casi.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. ripristinare il commit
  2. (crea e) verifica altro ramo
  3. ripristina il ripristino

1
Ho provato questo. L'approccio funziona anche se non si è passati al telecomando. $ git revert <commit-hash> ... quindi controlla qualche altro ramo, quindi digita $ git revert <revert-commit-hash> (senza i push). Grazie per aver condiviso questo semplice approccio !!
Natalie Cottrill,

2

2020 modo semplice:

git reset <commit_hash>

Esegui hash dell'ultimo commit che desideri mantenere.


1

Assicurati di eseguire il backup delle modifiche prima di eseguire questi comandi in una cartella separata

git checkout branch_name

Acquista sulla tua filiale

git merge --abort

Annulla l'unione

stato git

Controlla lo stato del codice dopo aver interrotto l'unione

git reset --hard origin / branch_name

questo comando reimposterà le modifiche e allinea il codice con il codice branch_name (branch).

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.