Domanda Come ripristinare un repository Git su un commit precedente


Come faccio a tornare dal mio stato attuale a uno scatto fatto su un certo commit?

Se lo faccio git log, quindi ottengo il seguente risultato:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Come ripristinare il commit dal 3 novembre, ovvero commit 0d1d7fc?


6007
2017-11-06 16:58


origine


risposte:


Questo dipende molto da cosa intendi per "ripristino".

Passa temporaneamente a un commit diverso

Se vuoi tornare temporaneamente ad esso, giocare, poi tornare dove sei, tutto quello che devi fare è dare un'occhiata al commit desiderato:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

O se vuoi fare dei commit mentre sei lì, vai avanti e crea un nuovo ramo mentre ci sei:

git checkout -b old-state 0d1d7fc32

Per tornare al punto in cui ti trovavi, controlla il ramo su cui eri di nuovo. (Se hai apportato delle modifiche, come sempre quando cambi succursali, dovrai gestirle a seconda dei casi.Potresti reimpostarle per buttarle via, potresti mettere da parte, prelevare, ripulire pop per portarle con te, potresti commettere li a un ramo lì se vuoi un ramo lì.)

Elimina duramente commit non pubblicati

Se, d'altra parte, vuoi davvero sbarazzarti di tutto ciò che hai fatto da allora, ci sono due possibilità. Uno, se non hai pubblicato nessuno di questi commit, resetta semplicemente:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Se ti incasini, hai già buttato via le tue modifiche locali, ma puoi almeno tornare al punto in cui ti trovavi prima reimpostando di nuovo.

Annulla i commit pubblicati con nuovi commit

D'altra parte, se hai pubblicato il lavoro, probabilmente non vuoi reimpostare il ramo, dal momento che è effettivamente riscrivere la cronologia. In tal caso, potresti davvero annullare i commit. Con Git, il ripristino ha un significato molto specifico: crea un commit con la patch inversa per cancellarlo. In questo modo non riscrivi alcuna cronologia.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Il git-revert pagina di manuale  in realtà copre molto di questo nella sua descrizione. Un altro collegamento utile è questa sezione git-scm.com che discute di git-revert .

Se decidi di non voler tornare, dopotutto, puoi ripristinare il ripristino (come descritto qui) o ripristinare prima del ripristino (vedi la sezione precedente).

Potresti trovare questa risposta utile anche in questo caso:
Come spostare HEAD in una posizione precedente? (Testa staccata)


7824
2017-11-06 17:04



Ripristino della copia di lavoro in commit più recente

Per ripristinare un commit precedente, ignorando eventuali modifiche:

git reset --hard HEAD

dove HEAD è l'ultimo commit nel tuo attuale ramo

Ripristino della copia di lavoro in un commit precedente

Per ripristinare un commit più vecchio del commit più recente:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

I crediti vanno a una domanda simile di Stack Overflow, Ripristina un commit da un hash SHA in Git? .


1260
2017-08-21 06:19



Molte risposte complicate e pericolose qui, ma in realtà è facile:

git revert --no-commit 0766c053..HEAD
git commit

Questo ripristinerà tutto dall'HEAD all'hash di commit, il che significa che ricrea lo stato di commit nell'albero di lavoro come se  ogni impegno da quando era tornato indietro. È quindi possibile impegnare l'albero corrente e creerà un nuovo commit essenzialmente equivalente al commit "ripristinato".

(Il --no-commit flag consente a git di annullare tutti i commit in una volta, altrimenti ti verrà richiesto un messaggio per ogni commit nell'intervallo, sporcando la tua cronologia con nuovi commit non necessari.)

Questo è un modo semplice e sicuro per ripristinare uno stato precedente . Nessuna storia viene distrutta, quindi può essere utilizzata per i commit che sono già stati resi pubblici.


1221
2018-02-12 04:18



L'opzione migliore per me e probabilmente altri è l'opzione di ripristino Git:

git reset --hard <commidId> && git clean -f

Questa è stata l'opzione migliore per me! È semplice, veloce ed efficace!


Nota :   Come menzionato nei commenti, non farlo se condividi il tuo ramo con altre persone che hanno copie dei vecchi commit

Anche dai commenti, se volessi usare un metodo meno "ballzy"

git clean -i 


153
2017-10-22 11:53



Se vuoi "uncommit", cancella l'ultimo messaggio di commit e rimetti i file modificati nella staging, dovresti usare il comando:

git reset --soft HEAD~1
  • --soft indica che i file non salvati devono essere mantenuti come file di lavoro opposti a --hard che li scarterebbe.
  • HEAD~1 è l'ultimo commit. Se si desidera eseguire il rollback di 3 commit, è possibile utilizzare HEAD~3. Se si desidera eseguire il rollback a un numero di revisione specifico, è possibile farlo utilizzando l'hash SHA.

Questo è un comando estremamente utile in situazioni in cui hai commesso la cosa sbagliata e vuoi annullare quell'ultimo commit.

Fonte: http://nakkaya.com/2009/09/24/git-delete-last-commit/


101
2018-03-04 17:25



Prima di rispondere aggiungiamo un po 'di background, spiegando di cosa si tratta HEAD è.

First of all what is HEAD?

HEAD è semplicemente un riferimento al commit corrente (più recente) sul ramo corrente. Ci può essere solo un singolo HEAD in qualsiasi momento (escluso git worktree).

Il contenuto di HEAD è memorizzato all'interno .git/HEADe contiene i 40 byte SHA-1 del commit corrente.


detached HEAD

Se non sei sull'ultimo commit, intendendo questo HEAD sta puntando a un precedente commit nella cronologia chiamato detached HEAD.

Enter image description here

Sulla riga di comando sarà simile a questo: SHA-1 invece del nome del ramo dal HEAD non punta alla punta del ramo attuale:

Enter image description here


Alcune opzioni su come recuperare da un HEAD distaccato:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Questo controllerà il nuovo ramo che punta al commit desiderato. Questo comando eseguirà il checkout su un dato commit.

A questo punto puoi creare un ramo e iniziare a lavorare da questo punto in poi:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Puoi sempre usare il reflog anche. git reflog mostrerà tutte le modifiche che hanno aggiornato il HEAD e controllando la voce di reflog desiderata verrà impostato il HEAD torna a questo commit.

Ogni volta che l'HEAD viene modificato, ci sarà una nuova voce nel reflog

git reflog
git checkout HEAD@{...}

Questo ti riporterà al commit desiderato

Enter image description here


git reset HEAD --hard <commit_id>

"Sposta" la testa indietro al commit desiderato.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Questo schema illustra quale comando fa cosa. Come puoi vedere lì reset && checkout modificare il HEAD.

Enter image description here


101
2018-02-05 21:56



Ho provato un sacco di modi per ripristinare le modifiche locali in Git, e sembra che funzioni meglio se si desidera ripristinare lo stato di commit più recente.

git add . && git checkout master -f

Breve descrizione:

  • NON creerà alcun commit come git revert lo fa.
  • NON staccherà il tuo TESTO come git checkout <commithashcode> lo fa.
  • Sostituirà tutte le modifiche locali e CANCELLERÀ tutti i file aggiunti dall'ultimo commit nel ramo.
  • Funziona solo con i nomi dei rami, quindi puoi ripristinare solo l'ultimo commit nel ramo in questo modo.

Ho trovato un modo molto più conveniente e semplice per ottenere i risultati sopra:

git add . && git reset --hard HEAD

dove HEAD punta all'ultima commit al tuo attuale ramo.

È lo stesso codice codice suggerito da boulder_ruby, ma ho aggiunto git add . prima git reset --hard HEAD per cancellare tutti i nuovi file creati dall'ultimo commit poiché questo è ciò che la maggior parte delle persone si aspetta che io creda quando si ripristina l'ultimo commit.


96
2017-07-29 11:01