[英]Rebasing a branch with sub-branches all at once
我經常在一個分支上設置子分支,我想將其重新綁定到主線上。 考慮一下:
* (Mainline)
*
*
| * (topicA_Branch3)
| *
| *
| * (topicA_Branch2)
| *
| *
| * (topicA_Branch1)
| *
| *
|/
*
*
我想將所有這三個topicA
分支移動到主線上。 目前,我知道有兩種方法可以做到這一點:
在topicA_Branch3
,執行命令git rebase Mainline
。
一個。 此時,我將不得不刪除topicA_Branch1
和2
並在現在重新topicA_Branch3
上的正確提交上手動重新創建分支。
另一種方法是執行三個單獨的命令:
一個。 在topicA_Branch1
,執行git rebase Mainline
。
灣 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)
*
*
*
*
我擔心這很麻煩,我不知道有任何現有的全部命令。 但它是可編寫腳本的。 從第一個插圖到第二個插圖的命令是
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。
你可以使用git filter-branch
和一個合適的--parent-filter
。 像這樣的東西:
git filter-branch --parent-filter 'sed -e "s/X/Y/"' --tag-name-filter cat -- branchA branchB branchC
這里X
應該是第一的哈希承諾是不是主線,但在其他部門,並Y
可能只是HEAD
或Mainline
或現任掌門的哈希Mainline
...
那個怎么樣:
a. While on `topicA_Branch1`, do `git rebase Mainline`.
b. `git rebase --onto topicABranch1 topicABranch1@{1} topicABranch2`
c. `git rebase --onto topicABranch2 topicABranch2@{1} topicABranch3`
d. ...
這可能很容易實現自動化。 語法topicABranch1 @ {1}表示“rebase之前的topicABranch1的最后已知狀態”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.