2012-06-01 16 views
35

Sono un albero come questo:cambiamento di base ramo

(commit 1) - master 
       \-- (commit 2) - (commit 3) - demo 
               \-- (commit 4) - (commit 5) - PRO 

e devo spostare il ramo PRO di padroneggiare

(commit 1) - master 
       |-- (commit 2) - (commit 3) - demo 
       \-- (commit 4) - (commit 5) - PRO 

Ho provato un git rebase master da PRO ramo, ma niente accade.

Per chiarire: Stavo lavorando in master e quindi ho dovuto realizzare una demo del prodotto (git checkout -b demo e alcuni commit). Quindi, per errore, creo un altro ramo dalla demo (git checkout -b PRO e alcuni commit) e ora ho bisogno di spostare il ramo PRO per diventare master e lasciare la demo intatta. Alla fine, sia la demo che PRO si bloccheranno dal master.

+0

possibile duplicato di [Modifica punto di diramazione] (http://stackoverflow.com/questions/8803069/change-branch-off-point) –

risposta

60
git checkout PRO # Just to be clear which branch to be on. 
git rebase --onto master demo PRO 

In sostanza, si prende tutti i commit da dopo demo fino a PRO, e rebase li sul master commit.

+0

È anche la strada da percorrere se la situazione è l'opposto? == I checkout -b dal master il secondo ramo, ma volevo farlo dal primo. Quindi ho eseguito 'git rebase --onto first-branch second-branch second-branch' ma in questo caso non ho la sintassi – Fla

+0

@Fla, sarebbe' git rebase --onto first-branch master second-branch ' – nVitius

5

Checkout per PRO ramo, copiare la più antica (commit4) e l'ultima (commit5) commettere hash di questo ramo e incollare da qualche altra parte.

$ git checkout PRO 
$ git log   # see the commit history 
# copy the oldest & latest commit-hash 

Quindi, eliminare il ramo PRO (tenere una copia di backup solo per la sicurezza). Creare e checkout in un nuovo ramo PRO da master.

$ git branch PRO.bac  # create a new branch PRO.bac = PRO as backup 

$ git checkout master 
$ git branch -D PRO   # delete the local PRO branch 
$ git checkout -b PRO  # create and checkout to a new 'PRO' branch from 'master' 

Take (cherry-pick) la gamma di commit di Precedente PRO ramo in nuovi PRO ramo.

$ git cherry-pick commit4^..commit5 # cherry-pick range of commits 
# note the '^' after commit4 

Ora, se tutto è ok, poi fare forza (f) spinta per remote PRO filiale ed eliminare locale PRO.bac ramo.

$ git log     # check the commit history 

$ git push -f origin HEAD # replace the remote PRO by local PRO branch history 
# git branch -D PRO.bac # delete local PRO.bac branch 
0

Ho avuto un approccio leggermente differente utilizzando reset e stashes che evita l'eliminazione e ricrea rami ed eliminando la necessità di passare rami:

$ git checkout PRO 
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index 
$ git stash save -m "Commit message" 
$ git reset commit 3 
$ git stash save -m "Commit message" 
$ git reset master --hard 
$ git stash pop 
$ git stash pop 
$ git push --force # force if its already been push remotely 

Per resettare il ramo su commit commetti il ​​tuo semplice riavvolgimento, basti pensare che la storia dei rami è un impegno alla volta.

0

Cercherò di essere il più generico possibile. Prima assicurati di essere nel tuo ramo ATTUALE.

git checkout current-branch 

Quindi utilizzare il seguente comando. new-base-branch è il ramo che vuoi essere la tua nuova base. current-base-branch è il ramo è la vostra base corrente.

git rebase --onto new-base-branch current-base-branch 

Se non si dispone di conflitti, quindi ottimo. Hai fatto. Se lo fai (nella maggior parte dei casi), leggi per favore ..

Potrebbero sorgere conflitti e dovrai risolverli manualmente.Git ora cerca una "unione unidirezionale" tra il tuo current-branch, current-base-branch e new-base-branch. Questo è il modo in cui git funzionerà internamente: -

1.) Git innanzitutto ridichiara lo current-base-branch in cima allo new-base-branch. Potrebbero esserci conflitti; che dovrai risolvere manualmente. Dopo averlo fatto, di solito fai git add . e git rebase --continue. Creerà un nuovo commit temporaneo temp-commit-hash per questo.

2.) Dopo questo, Git ora rebase il tuo current-branch in cima a temp-commit-hash. Potrebbero esserci ulteriori conflitti e di nuovo dovrai risolverli manualmente. Una volta terminato, si continua di nuovo con git add . e git rebase --continue, dopo di che è stato riposizionato con successo il current-branch in cima allo new-base-branch.

NOTA: - Se si inizia a rovinare, è possibile eseguire git rebase --abort in qualsiasi momento durante il processo di rebase e tornare al punto di partenza.

Problemi correlati