2014-03-31 67 views
4

我經常在分支上設置子分支,我想將其重新分配到主線上。試想一下:立即重新設置子分支的分支

* (Mainline) 
* 
* 
| * (topicA_Branch3) 
| * 
| * 
| * (topicA_Branch2) 
| * 
| * 
| * (topicA_Branch1) 
| * 
| * 
|/ 
* 
* 

我想所有這三個topicA分支移動到主線。目前,我知道兩種方法可以做到這一點:

  1. 雖然在topicA_Branch3,執行命令,git rebase Mainline

    a。在這一點上,我將不得不刪除topicA_Branch12,並手動重新創建分支上正確提交現在重新。

  2. 另一種方法是做三個獨立的命令:

    一個。而在topicA_Branch1,做git rebase Mainline

    b。 git rebase --onto topicABranch1 <topicA_Branch1-old-SHA> topicABranch2

    c。 git rebase --onto topicABranch2 <topicA_Branch2-old-SHA> topicABranch3

    d。這是一種累贅......

有,我想,這將變基的一個分支,並把它的子分支與它的命令?

要清楚,我想這個落得:

* (topicA_Branch3) 
* 
* 
* (topicA_Branch2) 
* 
* 
* (topicA_Branch1) 
* 
* 
* (Mainline) 
* 
* 
* 
* 
+0

作爲一個有趣的方面說明,'git filter-branch'包含了自動執行此操作所需的所有機器。但'filter-branch'沒有任何內建的'rebase'功能。再加上它是一個非常大的(雪橇)錘子,相對於這個相對簡單的問題。 :-) – torek

回答

0

恐怕這很麻煩,我不知道任何現有的做這一切命令。但它是可以編寫腳本的。該命令從第一個到第二個例證是

for i in topicA_Branch1 topicA_Branch2 topicA_Branch3 
do 
    git branch $i._OrIg_ $i 
done 
# First branch directly 
git rebase --onto Mainline topicA_Branch1 
# Remaining branches 
git rebase --onto topicA_Branch1 topicA_Branch1._OrIg_ topicA_Branch2 
git rebase --onto topicA_Branch2 topicA_Branch2._OrIg_ topicA_Branch3 

在驗證的事情是正確的,你可以刪除*._OrIg_分支機構。有了這個,你只需要保持腳本與分支的名稱和順序保持一致。

更新:您可以創建所有分支的列表,順序,與

git rev-list --reverse --simplify-by-decoration Mainline..topicA_BranchN \ 
| git name-rev --stdin --name-only 

在這裏,你只依賴於知道最後topicA_BranchN分支的名稱,例如在你的例子中topicA_Branch3。

0

您可以使用git filter-branch和適當的--parent-filter。事情是這樣的:

git filter-branch --parent-filter 'sed -e "s/X/Y/"' --tag-name-filter cat -- branchA branchB branchC 

這裏X應該是第一的哈希承諾是不是主線,但在其他部門,並Y可能只是HEADMainlineMainline當前頭的哈希...