Come posso ripristinare un repository github su un commit specifico?


431

Il mio github ha 100 commit in questo momento. Devo eseguire il rollback del repository per eseguire il commit di 80 e rimuovere tutti quelli successivi.

Perché? Questo repository dovrebbe essere destinato alla fusione di utenti diversi. Un sacco di fusioni sono entrate in gioco, a causa di un montaggio eccessivo. Ciò è dovuto a un errore di etichettatura dei miei rami remoti, in cui 3 sviluppatori sono stati etichettati l'uno con l'altro. Devo ripristinare fino a quel punto, quindi tirare avanti.

Volevo riformulare, come in questo esempio: come posso rimuovere un commit su GitHub?

Tuttavia, git vuole che io faccia molta gestione dei conflitti. c'è un modo più facile?

Risposte:


883
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Nota: come scritto nei commenti seguenti, l' utilizzo di questo è pericoloso in un ambiente collaborativo: stai riscrivendo la cronologia


43
gente, fallo git push -f origin branch. Mi sono appena divertito, perché mi mancava.
Sumit M:

21
ATTENZIONE! perderai tutti i tuoi impegni localmente e se spingi non ci sarà modo di tornare indietro
Thomas

8
Questo non è vero, puoi ottenere i vecchi commit usando git reflog
Jan Schaefer

27
potresti dover fare git push origin HEAD --forceinvece di git push -f origin branchquello che mi stava dando un error: src refspec branch does not match any.errore
sprocket12

1
Sì, grazie ragazzi. Sono riuscito a fare quello che volevo. Ho prima creato un ramo separato da quello precedente al commit che volevo ripristinare. Clonato localmente. Quindi ho applicato i tuoi consigli su quella copia, in questo modo, non ho compromesso il mio ramo principale ...
Gauthier Boaglio,

21

Per annullare il commit più recente, faccio questo:

Primo:

git log

ottenere l'ID SHA più recente da annullare.

git revert SHA

Ciò creerà un nuovo commit che fa esattamente l'opposto del tuo commit. Quindi puoi spingere questo nuovo commit per portare la tua app nello stato in cui era prima e la tua cronologia git mostrerà queste modifiche di conseguenza.

Questo è utile per una ripetizione immediata di qualcosa che hai appena commesso, che trovo più spesso il caso per me.

Come ha menzionato Mike, puoi anche fare questo:

git revert HEAD

8
git revert HEADripristinerà l'ultimo commit senza dover cercare l'hash.
Mike Baranczak,

Questa è una soluzione se non si desidera eliminare affatto i commit. Tuttavia, in questo caso, tutti i garbage commit saranno ancora lì e consentiranno a un clonatore di reimpostarli o effettuare il checkout su di essi. Se vuoi impedirlo, DEVI forzare la spinta.
cst1992,

19

Un altro modo:

Controlla il ramo che desideri ripristinare, quindi reimposta la tua copia di lavoro locale sul commit che desideri sia l'ultimo sul server remoto (tutto ciò che segue andrà via ciao). Per fare ciò, in SourceTree, ho cliccato con il tasto destro sul e ho selezionato "Ripristina BRANCHNAME su questo commit".

Quindi vai alla directory locale del tuo repository ed esegui questo comando:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Questo cancellerà tutti i commit dopo quello corrente nel tuo repository locale ma solo per quel ramo.


1
Cordiali saluti "REPOSITORY_NAME" sarà qualcosa come https: /me@github.com/me/repo_name.git
tim

3
Sarebbe più utile se abbassi quel comando e lo spiegassi.
cst1992,

3

La maggior parte dei suggerimenti presuppone che sia necessario in qualche modo distruggere gli ultimi 20 commit, motivo per cui significa "riscrivere la storia", ma non è necessario.

Basta creare un nuovo ramo dal commit # 80 e lavorare su quel ramo in futuro. Gli altri 20 commit rimarranno sul vecchio ramo orfano.

Se vuoi assolutamente che il tuo nuovo ramo abbia lo stesso nome, ricorda che il ramo in pratica sono solo etichette. Rinomina il tuo vecchio ramo in qualcos'altro, quindi crea il nuovo ramo in commit # 80 con il nome che desideri.


Immagino che questo guardi anche in modo problematico con le versioni locali di tutti della storia del ramo di interesse.
ragerdl,

2

Quando eseguo gli aggiornamenti del ramo dal master, noto che a volte faccio un clic eccessivo e faccio in modo che anche il ramo si unisca al master. Ho trovato un modo per annullarlo.

Se il tuo ultimo commit è stato unito, è necessario un po 'più di amore:

git ripristina -m 1 TESTA


1

In github, il modo più semplice è eliminare il ramo remoto nell'interfaccia utente di github, nella scheda rami. Devi assicurarti di rimuovere le seguenti impostazioni per rendere il ramo cancellabile:

  1. Non un ramo predefinito
  2. Nessuna richiesta di polling di apertura.
  3. Il ramo non è protetto.

Ora ricrearlo nel repository locale per puntare al punto di commit precedente. e aggiungerlo nuovamente al repository remoto.

git checkout -b master 734c2b9b   # replace with your commit point

Quindi spingere il ramo locale sul telecomando

git push -u origin master

Aggiungi nuovamente il ramo predefinito e la protezione ramo, ecc.

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.