Vuoi cambiare il mio master con un commit più vecchio, come posso farlo?


92

Voglio eseguire il rollback a un commit precedente, quindi pubblicare il codice, quindi tornare all'ultimo commit.

cioè così il mio master sta indicando una versione di commit più vecchia solo per poter pulire quella versione, quindi voglio tornare all'ultima commit che ero uno inizialmente.

Come posso fare questo?

Risposte:


100

Se vuoi farlo e ripristinare il master al commit precedente:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

In alternativa:

git reset --hard master~1        # Reset current branch to one commit ago on master

1
Quindi un anno dopo sto guardando questo e penso che questo sia un modo orribile per farlo. Oh beh almeno è un po 'facile da capire.
Tyler Brock

1
si questo è il motivo per cui ho votato positivamente, facile da capire, forse avresti dovuto presentare un link per un modo migliore?
Andrew Atkinson

1
Ho dovuto fare lo stesso usando SourceTree. Il processo è simile. 1) crea un nuovo ramo per lo stato master corrente, così non perderai nulla. 2) cancella master 3) crea un nuovo ramo master, selezionando il commit desiderato
Danilo Gomes

Cosa succede al commit che abbiamo "rimosso" dal master dopo questo?
Arthur Colombini Gusmão

1
Questo dovrebbe essere evitato se si dispone di un repository remoto. Causa alcuni errori se lo fai, perché l'indirizzo del primo master è diverso dal nuovo master che hai creato di recente.
MAChitgarha

60

La tua domanda non è chiara. Penso che quello che stai chiedendo sia questo:

git push -f origin $old_commit_id:master

Cosa farà questo? Si spingerà il $old_commit_idimpegnano a origincome il nuovo capo di origin's masterramo.

Se è quello che volevi, non è necessario che tocchi la tua masterfiliale locale .


Questo ha causato un master (non-fast-forward)fallimento per me. La soluzione @jtdubs ha funzionato.
Bobby Norton

3
Basta passare -fper forzarlo, sebbene il repository remoto possa essere configurato per impedirlo. Ho aggiornato la risposta.
Aristotele Pagaltzis

non funziona per me, la risposta accettata funziona però
MobileMon

Non hai detto esattamente quello che volevi o perché non ha funzionato, quindi non posso dirti perché non ha funzionato e come avrebbe potuto essere fatto (se poteva).
Aristotele Pagaltzis

Sembra che tu perda la storia passata in remoto con questo approccio, per me andava bene. Sto solo chiamando.
Shawn

43

uso git reset --hard <old commit number>

ripristinerà HEAD su questo vecchio commit.

inoltre, è necessario utilizzare anche git push -f originper modificare il repository remoto.


34

Se vuoi evitare la spinta forzata, ecco come ripristinare il tuo repository su un commit più vecchio e preservare tutto il lavoro intermedio:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

Fatto! Sostituisci 307a5cd con qualsiasi commit desideri nel tuo repository.

(So ​​che le prime due righe possono essere combinate, ma penso che questo renda meno chiaro cosa sta succedendo)

Eccolo graficamente:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

Rimuovi efficacemente c3 e c4 e reimposti il ​​progetto su c2. Tuttavia, c3 e c4 sono ancora disponibili nella cronologia del tuo progetto se vuoi rivederli.


1
Ha funzionato senza intoppi! Se sei arrivato fin qui e stai leggendo questo, questo sembra essere il modo più pulito per riportare il master a un impegno più profondo.
ddisqq

Non riesco a trovare le parole per spiegare quanto ti amo per questo, sono grato oltre le parole per essere riuscito a sistemare qualcosa che mi aveva infastidito per 6 ore e mi ha causato così tanto mal di testa. Grazie Signore!!!!!!!
Kostas Tsakalidis

9

Supponendo un grafico di commit in questo modo:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

Vuoi prima effettuare il checkout mastere creare un ramo che punti a dove si mastertrova attualmente:

git checkout master
git branch pointer master

Dovrebbe assomigliare a questo ora:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

Ora che sei già attivo master, diremo al masterramo di andare indietro di un commit:

git reset master~1

Ora, masterdovrebbe essere spostato indietro di uno spazio, ma il pointerramo è ancora sul commit più recente:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

A questo punto, puoi eseguire il push mastersu un telecomando, o dove mai, quindi unirlo rapidamente al pointerramo. Puoi uccidere il pointerramo a quel punto:

git push origin master
git merge --ff-only pointer
git branch -D pointer

Finale :

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

1
Se origine / master è in C, git push origin masterfallirà con la punta del tuo ramo corrente dietro la sua controparte remota . Dovresti anche passare un flag -f.
sassospicco

8

Puoi semplicemente git checkout <commit-id>fare tutto ciò che devi fare, quindi git checkout mastertornare al nuovo codice.

Se hai effettivamente bisogno di modificare il vecchio codice per rilasciarlo, probabilmente dovresti:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

Inoltre, non posso raccomandare abbastanza git flow . Rende tutto questo abbastanza facile.


1

Per passare a una versione precedente:

git checkout <version hash>

fai il tuo lavoro qui e impegnalo con

git commit --amend

Per tornare al master :

git checkout master


1
Non funzionerà. git reset --hardha puntato il suo ramo master al vecchio commit, quindi git checkout masternon farà nulla.
jtdubs

È vero, grazie per la correzione. +1 a te, rimuoverei anche la mia risposta, ma penso che il commit --amendpassaggio sia abbastanza utile
Pablo Fernandez

Cosa --amend?
Shafizadeh
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.