我有一个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"这样每个新分支只有所需文件的提交历史记录?
答案 0 :(得分:1)
git checkout -b new_branch M
)结帐新分支。git rev-list --reverse "..master" -- file1 file2 file3... | git cherry-pick --stdin
以选择new_branch(commit M)和触及file1,file2或file3的master之间的所有提交。不幸的是,步骤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)