如何将git分支分成另外两个分支

时间:2015-10-16 22:31:52

标签: git branch

我有一个git分支B,离开分支主,M,其提交历史如下:

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

问题是我想要在分支B'中提交与一组文件(出现在提交B1,B3和B5中)相关的提交,我想要提交与另一组文件相关的提交(出现在提交中)分支B"中的B1,B2,B4和B6)。如您所见,除了提交B1之外,文件被整齐地分成不同的提交。

将分支B分成B分支的最佳,最干净的方法是什么?和B"这样每个新分支只有所需文件的提交历史记录?

1 个答案:

答案 0 :(得分:1)

  1. 在提交M(git checkout -b new_branch M)结帐新分支。
  2. 运行git rev-list --reverse "..master" -- file1 file2 file3... | git cherry-pick --stdin以选择new_branch(commit M)和触及file1,file2或file3的master之间的所有提交。
  3. 重复第二组文件。
  4. 不幸的是,步骤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 -) "$@"
    }
    
    git cherry-pick $(merge /dev/null "$@" | tac)