Domanda Come annullare i commit più recenti in Git?


Ho accidentalmente commesso file errati su Idiota , ma non ho ancora inviato il commit al server.

Come posso annullare quei commit dal repository locale?


17788
2017-07-28 22:22


origine


risposte:


Annulla un commit e ripeti

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Questo è ciò che vuoi annullare
  2. Questo lascia invariato il tuo albero di lavoro (lo stato dei tuoi file sul disco), ma annulla il commit e lascia le modifiche che hai commesso non prestabilite (appariranno quindi come "Modifiche non organizzate per il commit" in git statuse dovrai aggiungerli di nuovo prima di eseguire il commit). Se tu solo  volere Inserisci  più modifiche al commit precedente o modifica il messaggio di commit 1 , potresti usare git reset --soft HEAD~ invece, che è come git reset HEAD~ (dove HEAD~ equivale a HEAD~1) ma lascia in scena le modifiche esistenti.
  3. Apporta correzioni ai file dell'albero di lavoro.
  4. git add tutto ciò che vuoi includere nel tuo nuovo commit.
  5. Conferma le modifiche, riutilizzando il vecchio messaggio di commit. reset copiato la vecchia testa a .git/ORIG_HEAD; commit con -c ORIG_HEAD aprirà un editor, che inizialmente contiene il messaggio di log del vecchio commit e ti consente di modificarlo. Se non è necessario modificare il messaggio, è possibile utilizzare il -C opzione.

Fai attenzione però che se hai aggiunto nuove modifiche all'indice, usa commit --amend li aggiungerà al tuo impegno precedente.

Se il codice è già stato inserito nel server e si dispone delle autorizzazioni per sovrascrivere la cronologia (rebase), procedere come segue:

git push origin master --force

Puoi anche guardare questa risposta:

Come spostare HEAD in una posizione precedente? (Testa staccata)

La risposta sopra ti mostrerà git reflog che viene utilizzato per scoprire qual è lo SHA-1 al quale si desidera tornare. Una volta trovato il punto verso il quale si desidera annullare l'uso della sequenza di comandi come spiegato sopra.


1  Nota, tuttavia, che non è necessario ripristinare un commit precedente se hai appena commesso un errore nel tuo messaggio di commit . L'opzione più semplice è git reset (per mettere in ombra tutte le modifiche che hai fatto da allora) e poi git commit --amend, che aprirà l'editor dei messaggi di commit predefinito precompilato con l'ultimo messaggio di commit.


19223
2018-06-16 17:27



Annullare un commit è un po 'spaventoso se non sai come funziona. Ma in realtà è incredibilmente facile se capisci.

Di 'questo, dove C è il tuo HEAD e (F) è lo stato dei tuoi file.

   (F)
A-B-C
    ↑
  master

Tu vuoi nuke commit C e mai più vederlo . Tu lo fai:

git reset --hard HEAD~1

Il risultato è:

 (F)
A-B
  ↑
master

Ora B è il TESTA. Perché tu l'hai usato --hard, i tuoi file vengono ripristinati al loro stato al commit B.

Ah, ma supponiamo che commettere C non sia stato un disastro, ma solo un po 'spento. Tu vuoi annullare il commit ma mantenere le modifiche  per un po 'di editing prima di fare un commit migliore. Ripartendo da qui, con C come tuo HEAD:

   (F)
A-B-C
    ↑
  master

Puoi farlo, lasciando fuori il --hard:

git reset HEAD~1

In questo caso il risultato è:

   (F)
A-B-C
  ↑
master

In entrambi i casi, HEAD è solo un puntatore all'ultima commit. Quando fai un git reset HEAD~1, dici a Git di spostare il puntatore HEAD indietro di un commit. Ma (a meno che non lo si usi --hard) lascia i tuoi file come erano. Così ora git status mostra le modifiche che hai controllato in C. Non hai perso nulla!

Per il tocco più leggero, puoi persino annulla il tuo commit ma lascia i tuoi file e il tuo indice :

git reset --soft HEAD~1

Questo non solo lascia i tuoi file da solo, ma lascia anche il tuo indice  solo. Quando lo fai git status, vedrai che gli stessi file sono nell'indice di prima. Infatti, subito dopo questo comando, potresti farlo git commit e rifaresti lo stesso commit che hai appena fatto.

Un'altra cosa: Supponi di distruggere un commit  come nel primo esempio, ma poi scopri che ne hai avuto bisogno, dopo tutto ? Buona fortuna, giusto?

No, c'è ancora  un modo per riaverlo. genere git reflog e vedrai una lista di commit (parziali) in cui ti sei spostato. Trova il commit che hai distrutto, e fai questo:

git checkout -b someNewBranchName shaYouDestroyed

Ora hai resuscitato quel commit. I commit non vengono effettivamente distrutti in Git per circa 90 giorni, quindi di solito puoi tornare indietro e salvare uno di cui non volevi liberarti.


9723
2018-05-29 18:16



Mi ci è voluto un po 'per capire, quindi forse questo aiuterà qualcuno ...

Ci sono due modi per "annullare" il tuo ultimo commit, a seconda che tu abbia già reso pubblico il tuo commit (spinto al tuo repository remoto):

Come annullare un commit locale

Diciamo che ho commesso localmente, ma ora voglio rimuovere quel commit.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Per ripristinare tutto come prima dell'ultimo commit, è necessario reset al commit prima HEAD:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Adesso git log mostrerà che il nostro ultimo commit è stato rimosso.

Come annullare un commit pubblico

Se hai già reso pubblici i tuoi commit, ti consigliamo di creare un nuovo commit che "ripristini" le modifiche apportate al commit precedente (HEAD corrente).

git revert HEAD

Le tue modifiche verranno ora ripristinate e pronte per il commit:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Per maggiori informazioni, controlla Nozioni di base su Git - Annullare le cose


1741
2018-05-29 18:13



Aggiungi / rimuovi file per ottenere le cose nel modo desiderato:

git rm classdir
git add sourcedir

Quindi modifica il commit:

git commit --amend

Il commit errato precedente verrà modificato per riflettere il nuovo stato dell'indice - in altre parole, sarà come se non avessi mai commesso l'errore in primo luogo.

Nota che dovresti farlo solo se non hai ancora spinto. Se hai spinto, dovrai semplicemente eseguire una correzione normalmente.


1622
2017-07-31 09:39



git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

o

git reset --hard HEAD~1

Avviso: il comando precedente rimuoverà permanentemente le modifiche al file .java file (e qualsiasi altro file) che si desidera salvare.

Il hard reset a HEAD-1 imposterà la tua copia di lavoro nello stato del commit prima del commit sbagliato.


874
2018-05-25 16:04



Per cambiare l'ultimo commit

Sostituisci i file nell'indice:

git rm --cached *.class
git add *.java

Quindi, se si tratta di un ramo privato, emendare  il commit:

git commit --amend

Oppure, se si tratta di un ramo condiviso, effettua un nuovo commit:

git commit -m 'Replace .class files with .java files'


( per cambiare un commit precedente , usa il fantastico rebase interattivo )


ProTip: Aggiungi *.class a a gitignore  per fermare questo accada di nuovo.


Per ripristinare un commit

La modifica di un commit è la soluzione ideale se è necessario modificare l'ultimo commit, ma una soluzione più generale è reset.

Puoi ripristinare git con qualsiasi commit con:

git reset @~N

Dove N è il numero di commit prima HEAD, e @~ ripristina il commit precedente.

Quindi, invece di modificare il commit, puoi usare:

git reset @~
git add *.java
git commit -m "Add .java files"

Check-out git help reset, in particolare le sezioni su --soft  --mixed e --hard, per una migliore comprensione di ciò che fa.

reflog

Se si incasina, è sempre possibile utilizzare il reflog per trovare i commit abbandonati:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



677
2018-01-31 07:06



Uso git revert commit-id

Per ottenere l'ID commit, basta usare git log


547
2017-12-13 10:18