2010-11-12 10 views
56

In git, ho fatto commit sul master branch, quando in realtà avrei dovuto lavorare su un ramo di funzionalità. Voglio cambiare questo modo che il master ritorni al punto in cui è iniziato, e ciò che era sul master ora è su una nuova diramazione. Fondamentalmente, il mio commettere storia assomiglia a questo:Come posso modificare a quale commit i punti master vengono inseriti in git?

A -- B -- C -- D -- E 
      |   | 
      |  master 
    origin/master 

E voglio farlo sembrare come questo:

 master 
      | 
A -- B -- C -- D -- E 
      |   | 
      |  new_branch 
    origin/master 

Come posso cambiare dove i punti di master?

risposta

59
  • , conserva le uncommitted: git stash
  • creare un nuovo ramo: master git branch new_branch
  • reset per origin/master: git reset --hard origin/master
  • cassa della nuova filiale di nuovo: git checkout new_branch
  • unstash le modifiche: git stash pop

lo stash/unstash non è necessario se il tuo albero di lavoro è pulito basta assicurarsi che non vi siano cambiamenti nel vostro albero di lavoro, perché quelli verranno rimossi quando si reimposta --hard


un'altra possibilità (più veloce, e senza la necessità di riporre e reset):

  • checkout un nuovo ramo: git checkout -b new_branch master
  • creare una 'nuova' branch master e puntarlo a origin/master di commit: git branch -f master origin/master
+1

Si noti che lo stash è necessario solo se si dispone di modifiche non salvate. –

+0

Lo stash si impegna? Molto probabilmente intendevi cambiamenti locali. – Mot

+1

Se la tua directory di lavoro è pulita, non avrai bisogno delle parti 'stash' e' unstash'. Altrimenti perfetto: +1 –

0

creare un nuovo ramo 0.123.all'attuale HEAD (presupponendo HEAD = master), resettare il master su C e passare nuovamente a new_branch (parlando in termini di SmartGit).

2

Come delineato here, ma ancora più semplice, nessuna reimpostazione coinvolta, basta creare un nuovo ramo in cui il master era, quindi eliminare senza problemi il master, ricontrollare il luogo in cui si desidera spostare il master e creare un nuovo ramo master lì:

git stash 
git checkout -b old_master_was_here 
git branch -d master 
git checkout origin/master 
git checkout -b master 
3

Vai a .git/refs/heads/master che ha l'hash del master e lo modifica in qualsiasi cosa tu voglia. Uso gitg per trovare rapidamente l'hash del master e successivamente per verificare che la mossa abbia avuto successo.

10
$ git checkout master 
$ git reset --hard <commit-id-for-master-to-sit-at> 

ad esempio provare questo

$ mkdir example; cd example 
$ git init 
$ vi testFile.txt 
(now add "test commit 1" to line 1 of file) 
$ git add * 
$ git commit 
(add message "(+) 1st commit" to git commit) 
$ vi testFile.txt 
(now add "test commit 2" to line 1 of file) 
$ git add * 
$ git commit 
(add message "(+) 2nd commit" to git commit) 
$ vi testFile.txt 
(now add "test commit 3" to line 1 of file) 
$ git add * 
$ git commit 
(add message "(+) 3rd commit" to git commit) 
$ git tag final_head 
$ git reset --hard HEAD~1 

Questo esempio mostra lo spostamento del master per un altro impegno. Si noti qui che il tag ci consente di salvare il vecchio master, nel caso :)

Problemi correlati