簡體   English   中英

一次性重新分支帶有子分支的分支

[英]Rebasing a branch with sub-branches all at once

我經常在一個分支上設置子分支,我想將其重新綁定到主線上。 考慮一下:

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

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

  1. topicA_Branch3 ,執行命令git rebase Mainline

    一個。 此時,我將不得不刪除topicA_Branch12並在現在重新topicA_Branch3上的正確提交上手動重新創建分支。

  2. 另一種方法是執行三個單獨的命令:

    一個。 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可能只是HEADMainline或現任掌門的哈希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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM