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



我有一个git分支B,在master分支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. 在提交M (git checkout -b new_branch M)时检出一个新的分支。
  2. 运行git rev-list --reverse "..master" -- file1 file2 file3... | git cherry-pick --stdin,在new_branch (commit M)和master之间挑选所有涉及file1, file2或file3的提交。
  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 -) "$@"
}
git cherry-pick $(merge /dev/null "$@" | tac)

最新更新