2010-11-04 15 views
5

Non so Git tutto così bene e per uno dei nostri repository, ho fatto un errore.Git branching da una revisione precedente e rollback del ramo corrente

Ho commesso e trasferito le modifiche a un ramo denominato "core". Ma poi ho capito che i miei cambiamenti non dovrebbero esserci - avrei dovuto creare una nuova filiale diverse revisioni, ad esempio, "core-experimental".

Per spiegare, ho:

A---B---C---D---E  "core" 

Ma ora voglio cambiare a

A---B    "core" 
    \ 
    C---D---E  "core-experimental" 

Nessun altro nella mia squadra ha ancora tirato i miei cambiamenti, in modo che qualsiasi ripristini faccio shouldn non causare dolore a nessuno

È possibile per Git?

risposta

9

Le altre due risposte funzionano bene, ma si può effettivamente evitare di dover fare qualche cosa in vostro albero di lavoro:

# create core-experimental using core as starting point 
git branch core-experimental core 
# move core 
git branch -f core <SHA1 of B> 

questo modo si può fare anche se si hanno modifiche locali nell'albero di lavoro, e senza aggiornare una serie di timestamp durante il checkout/reset che causerà la necessità di ricostruire (assumendo che si tratti di un progetto compilato).

+0

Bello, questo è il tipo di piccolo extra che lucida il mio git-fu – Benjol

+0

Sto usando Ruby/Python/cose non compilate, quindi gioco in modo loosey-goosey con i timestamp dei file; questo suggerimento è migliore –

+0

@Adam: Sì, non sono mai sicuro. A volte un 'reset --hard' è gratuito, a volte in un progetto compilato di grandi dimensioni, il reset/checkout richiede 20 secondi e impone una compilazione di 10 minuti. Un'altra distinzione: il 'reset' inserirà i reflog" : aggiornamento HEAD ", mentre il' branch -f' inserirà "branch: Reset to ". – Cascabel

6
git checkout core 
git branch core-experimental 
git reset --hard <SHA of B> 
git push -f <remote> core 

O più descrittivo ...

  1. Checkout nucleo
  2. Crea il ramo sperimentale alla testa di nucleo
  3. HEAD del nucleo
  4. reset di nuovo a dove si desidera che
  5. Forza una spinta di il nucleo di aggiornamento
+0

Questo ha funzionato bene, anche con il core spinto all'origine (che avevo, a differenza dell'interrogante). –

1

Nel nucleo:

git branch core-experimental 
git reset --hard <revision-B> 

E poi:

git push -f 
Problemi correlati