我有一个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'的最好、最干净的方法是什么?这样每个新分支只有所需文件的提交历史?
- 在提交M (
git checkout -b new_branch M
)时检出一个新的分支。 - 运行
git rev-list --reverse "..master" -- file1 file2 file3... | git cherry-pick --stdin
,在new_branch (commit M)和master之间挑选所有涉及file1, file2或file3的提交。 - 对第二组文件重复此操作。
不幸的是,步骤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)