2015-02-27 33 views
7

Ho un ramo A e un ramo B (e alcuni altri rami).Git: ripristina/ripristina un intero ramo in uno stato di un altro ramo?

Diciamo A 's commettere storia assomiglia:

  • commettere 5
  • commettere 4
  • commettere 3
  • ...

E B cronologia dei commit di:

  • qualche altro commit
  • commit 4
  • fusione di altre cose dal ramo C (nel ramo B)
  • commit 3
  • ...

Fondamentalmente quello che voglio è "cancellare" tutte le modifiche apportate dal commit qualche altro commit e unione di altre merci dal ramo C al ramo B.

voglio l'albero di lavoro del ramo B essere albero di lavoro esattamente lo stesso ramo come A s'.

Come ottengo questo?

risposta

9

Un modo per ottenere ciò è tramite git reset. Mentre sul ramo B eseguire

git reset --hard A 

Successivamente ramo B punti alla testa di commit A. L'opzione --hard reimposta l'indice e l'albero di lavoro in modo che tutti i file rintracciati vengano reimpostati alla versione nel ramo A. Il vecchio head-commit di A viene copiato su .git/ORIG_HEAD per consentire di annullare la modifica.

alternativa - anche se non sul ramo B - è possibile eliminare ramo B e ricreato in questo modo:

git branch -d B  # delete branch B 
git branch B A  # re-create branch B and let it point to the commit of branch A 

Altro che il primo suggerimento, questo lascerà l'albero indice e lavorare intatta.

+0

grazie. reset --hard A è esattamente quello che stavo cercando. Comunque: come posso spingere questo (reimpostato) verso l'origine? l'origine nega il push, a causa dei commit divergenti. – daniel451

+1

È possibile aggiungere l'opzione '--force' al comando' push' per sovrascrivere il ramo remoto. Ma dovresti essere ben consapevole delle conseguenze come per es. descritto [qui] (http://stackoverflow.com/questions/21259585/other-consequences-of-git-push-force) o [qui] (http://stackoverflow.com/questions/23432788/git-push- le quinte forza-dietro-). –

3

Se si desidera che il ramo B assomigli esattamente al ramo A. Si può solo fare un reset --hard

git checkout branch-B 

git reset --hard branch-A 

Fare attenzione si perde impegna in questo caso.Il tuo branch-B apparirà esattamente come branch-A, qualunque commit sia stato fatto al ramo-B, che non era presente nel ramo-A, sarà perso. Inoltre se branch-B è condiviso con altre persone, non è consigliabile eseguire questa operazione.

In questo caso si potrebbe provare ripristinando i commit non si vuole nel ramo-B

git revert <sha-of-"some other commit"> 
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> 

Il secondo impegno si presenta come una fusione impegnarsi in modo potrebbe essere necessario passare il genitore pure.

git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1