2011-08-27 15 views
7

Ho un po 'di git impiombato commette in mio figlio del nostro ramo master. Ho eseguito il rebase su un ramo di funzionalità e ho unito con successo i pochi conflitti che si sono verificati, ma non mi ero reso conto che rebase non mi avrebbe lasciato sul ramo delle funzionalità. Se ora vado a controllare il ramo della funzione, presumibilmente sovrascriverò i miei cambiamenti commessi nel mio albero di lavoro, lasciandoli in una specie di limbo. Potrei "git checkout -m", ma a quanto pare è solo per la fusione di modifiche locali senza commit. Come posso accedere al ramo della funzione e mantenere le modifiche non urgenti ma impegnate che attualmente ho sotto il ramo principale (senza doverle inserire nel ramo principale)? Dovrei aver usato git rebase -onto? Se sì, cosa dovrei fare ora che ho ribadito senza -onto?come spostare le modifiche in commit-but-unpushed in un altro ramo?

+0

Non un dupe. È un problema molto diverso con le modifiche che sono già state commesse, per non parlare di un rebase errato. –

risposta

7

Si può fare in questo modo:

  1. git checkout branch alla cassa al ramo della funzione.
  2. git reset --hard master per spostare il ramo allo stesso commit di master in questo momento. In questo modo, perdi tutti i commit che si trovano nel ramo. A causa del tuo rebase, tutti questi commit dovrebbero avere copie su master, quindi non dovresti perdere nulla.
  3. git checkout master per il checkout master.
  4. git reset --hard origin/master per reimpostare master allo stato che si trova sul repository origin. Questo presuppone che tu non abbia avuto nessuna modifica imprevista a master. In tal caso, sostituire origin/master con l'ID di commit a cui si desidera ripristinare.
+0

"si perdono tutti i commit che si trovano nel ramo ..." Non seguo questa parte. Il mio obiettivo è quello di mantenere i miei impegni imprevisti spostandoli sul ramo delle funzionalità. "questo presuppone che tu non abbia avuto modifiche non schiuse al master". Ancora una volta, i commit impuniti sono l'intera ragione per cui sto facendo la mia domanda. – BrianHoltz

+0

Vedo che wat voglio fare è descritto nella pagina man di git-reset in "Annulla un commit, rendendolo un ramo di argomento". – BrianHoltz

+0

La pagina di git man menzionata da BrianHoltz è qui: http://git-scm.com/docs/git-reset/2.0.0#_examples –

3

Prima di rideterminare la situazione per essere sicuro di aver capito correttamente. Hai effettuato alcuni commit su master e volevi spostarli su feature, quindi hai eseguito git rebase feature? Per prima cosa, vuoi annullarlo. Supponendo che tu abbia ancora il master controllato e che non abbia ancora effettuato alcun rebase, esegui git reset --hard ORIG_HEAD per annullare il rebase.

Ora, per il modo corretto di spostare il tuo commit verso il ramo feature. Marca e checkout di un ramo temporaneo, quindi non si scherza fino master:

git checkout -b temp 

Ora rebase tutte le modifiche apportate dopo l'ultimo commessi nei confronti origin/master su feature:

git rebase --onto feature origin/master 

che muove il ramo temp come se era ramificato da feature. Ora per unire le modifiche sulla feature, fare:

git checkout feature 
git merge temp 
git branch -d temp 

Sarà una fusione fast-forward dal momento che solo Ribasato.

Problemi correlati