2010-09-15 14 views
57

sto cercando di imparare ad usare Git in modo efficace e mi chiedo come dovrei (buona pratica/cattiva pratica?) Risolvere il seguente caso:Spostare impegna da maestro su un ramo utilizzando git

Say I hanno la seguente catena di commit in master:

  • commit iniziale
  • commit 1
  • commit 2
  • commit 3

Poi mi rendo conto che ciò che è stato fatto negli ultimi due commit è completamente sbagliato e devo ricominciare da Commit 1. Domande:

  • Come devo fare?
  • Posso spostare Commit 2 e 3 in un ramo separato da conservare per riferimento futuro (dire che non erano poi così male) e continuare a lavorare da Commit 1 su master?

risposta

70
git branch tmp   # mark the current commit with a tmp branch 
git reset --hard Commit1 # revert to Commit1 

Il SO risposta "What's the difference between 'git reset' and 'git checkout' in git?" è abbastanza istruttiva per questo tipo di operazione

alt text

Un git reset --hard HEAD~2 avrebbe fatto la stessa cosa (senza bisogno di recuperare l'SHA1 per Commit1 prima).

Poiché Commit2 e Commit3 sono ancora riferimento da un riferimento Git (qui un ramo), è ancora possibile ripristinare loro in qualsiasi momento desiderato (git checkout tmp).


In realtà, Darien menzioni nei commenti (per quanto riguarda lo spostamento Commit2 e Commit3 ad un altro ramo):

Accidentalmente impegnata al ramo sbagliato, questo mi permetta di muovo, fatto:

git checkout correctbranch 
git rebase tmp 
git branch -d tmp 

Questo funziona qui poiché il ramo iniziale è stato reimpostato su Commit1, il che significa che lo git rebase tmp riprodurrà ogni commit dopo lo Commit1 (quindi qui Commit2 e Commit3) nel nuovo 'correctbranch'.

+0

Grazie! Solo un'osservazione: in gitk il ramo di tmp non mostra. Non dovrebbe farlo, come Commit1 è comune per entrambe le filiali? – Paul

+5

@Paul: hai provato un "' gitk --all' "? – VonC

Problemi correlati