2015-10-16 166 views
1

我有一個Git分支B,關閉分支主,男的,提交歷史,其中是這樣的:如何一個Git分支分成等2個分支

M 
\ 
    B1-B2-B3-B4-B5-B6 

M是主分支, B是我想分成2支我想這個落得:

B'1-B'3-B'5 
/
M 
\ 
    B"1-B"2-B"4-B"6 

的問題是,我想的提交相關的一組文件(出現在提交B1,B3,B5和)在分支B'中,並且我想要與分支B中的另一組文件(出現在提交B1,B2,B4和B6中)相關的提交「。 n見,除了提交B1之外,這些文件整齊地分成不同的提交。

什麼是支路B分成分支B」和B」是最好的,乾淨的方式使得每個新的分支機構只已提交了所需的文件記錄?

+1

如果你只有幾提交您也可以手動'他們櫻桃pick'到一個新的分支,並刪除它們手動使用交互式的rebase一個老分支 –

回答

1
  1. 結帳一個新的分支在提交M(git checkout -b new_branch M)。
  2. 運行git rev-list --reverse "..master" -- file1 file2 file3... | git cherry-pick --stdin櫻桃挑選觸摸的file1,file2的,或file3的new_branch(提交M)和主站之間的所有的提交。
  3. 重複用於第二組文件。

不幸的是,步驟2中的命令並不遵循重命名。下面的腳本執行,但可能無法正確訂購一些提交和過於複雜:

#!/bin/bash 

BRANCH="$1" 
SINCE=$(git rev-parse HEAD) 
shift 

# Recursively combine commit logs. 
merge() { 
    if [[ $# -eq 1 ]]; then 
     cat "$1" 
     return 
    fi 

    local out="$1" 
    local in="$2" 
    shift 2 

    merge <(git log --pretty=format:"%H" "${SINCE}..${BRANCH}" --follow "$in" | combine "$out" or -) "[email protected]" 
} 

git cherry-pick $(merge /dev/null "[email protected]" | tac) 
相關問題