2012-06-01 75 views
35

我有一棵樹是這樣的:更改分支基地

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

,我必須移動PRO分支掌握

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

我試着從PRO分支git rebase master,但沒有發生。

澄清:我在主人工作,然後我不得不做一個產品演示(git checkout -b demo和一些提交)。然後,我錯誤地從demo中創建了另一個分支(git checkout -b PRO和一些提交),現在我需要將PRO分支移到master並保持演示不變。最後,演示版和專業版都將從主播中掛起。

+0

[Change Change-off point]的可能重複(http://stackoverflow.com/questions/8803069/change-branch-off-point) –

回答

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

基本上,你把所有從後demo在提交長達PRO,和他們重訂到master提交。

+0

如果情況恰恰相反,那麼這也是如此嗎? ==我從第二個分支主人結帳-b,但我想從第一個分支開始。所以,我沒有'git的變基--onto第一支路的第二分支的第二branch',但我不明白的語法 – Fla

+0

@Fla在這種情況下,這將是'git的變基--onto第一支主第二分支' – nVitius

5

結帳到PRO分支,複製最老的(commit4)和時尚(commit5)提交這個分支的哈希和粘貼到其他地方。

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

然後,刪除PRO分支(保留備份只是爲了安全)。從master創建並結帳到新的PRO分支。

$ 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' 

採取(櫻桃採摘)上一頁PRO分公司提交到新的分支PRO的範圍。現在

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

,如果一切正常,然後執行力(-f)推remote PRO分支和刪除本地PRO.bac分支。

$ 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

我使用復位和儲物箱是避免刪除,有一個稍微不同的方法重新創建新的分支,以及無需切換分支:

$ 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 

通過正在重置對提交的分支根據你的基本只是倒退分支機構歷史一次提交。

0

我會嘗試像我一樣儘可能通用。首先確保您位於CURRENT分支。

git checkout current-branch 

然後使用下面的命令。 new-base-branch是你想成爲你新基地的分支。 current-base-branch是分支是你現在的基地。

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

如果你沒有衝突,那麼很好。你完成了。如果你這樣做(在大多數情況下),那麼請繼續閱讀。

可能會出現衝突,您將不得不手動解決它們。Git的現在嘗試你current-branchcurrent-base-branchnew-base-branch之間的「3路合併」。粗略地說,這是git將如何在內部工作: -

1.)Git將首先在new-base-branch之上重新設置current-base-branch。可能會有衝突;您必須手動解決這個問題。在完成之後,您通常會執行git add .git rebase --continue。它將爲此創建一個新的臨時提交temp-commit-hash

2.)在此之後,Git現在將在temp-commit-hash之上重新設置您的current-branch。可能會有更多的衝突,並且您將不得不手動解決它們。一旦這樣做,你git add .git rebase --continue再繼續,之後您已成功在頂部的new-base-branch重建基礎的current-branch

注意: - 如果您開始搞砸了,那麼您可以在rebase過程中隨時進行git rebase --abort並返回起點。