将两个独立的分支历史缝合在一起
Stitch two independent branch histories together
我的 Git 存储库中有两个独立的分支:
A---B---C branch "old"
X---Y---Z branch "master"
我想生成以下历史记录:
A---B---C---X---Y---Z
我使用以下 rebase 命令尝试了此操作(当前分支是 "master"):
git rebase --strategy=recursive --strategy-option=theirs old master
这失败了:
First, rewinding head to replay your work on top of it...
fatal: Could not parse object 'fb56e6e20ea4a605503732df1f5a0a407808dffa^'
fb56e6
是 "old" 分支的第一次提交。
作为替代方案,我使用了 cherry pick 命令(当前分支是 "master"):
git rev-list --reverse old | git cherry-pick --stdin --keep-redundant-commits -X theirs
这工作正常,但所有提交都会得到一个新的 "committer"。有没有办法告诉 cherry pick 它不应该设置提交者?如果没有,有没有办法通过 rebase 实现我想要的?
我喜欢您精心挑选的方法。只需 运行 标准 "set my author info" 命令,然后再执行 cherry-pick 以匹配要保留的 "commiter" 数据。
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
然后在完成后将作者信息设置回您自己。
我用git filter-branch
解决了它:
FIX_COMMITTER='
if test "$GIT_AUTHOR_NAME" != "$GIT_COMMITTER_EMAIL"; then
GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL
export GIT_COMMITTER_NAME
fi
'
git filter-branch -f --env-filter "$FIX_COMMITTER" -- master
我的 Git 存储库中有两个独立的分支:
A---B---C branch "old"
X---Y---Z branch "master"
我想生成以下历史记录:
A---B---C---X---Y---Z
我使用以下 rebase 命令尝试了此操作(当前分支是 "master"):
git rebase --strategy=recursive --strategy-option=theirs old master
这失败了:
First, rewinding head to replay your work on top of it...
fatal: Could not parse object 'fb56e6e20ea4a605503732df1f5a0a407808dffa^'
fb56e6
是 "old" 分支的第一次提交。
作为替代方案,我使用了 cherry pick 命令(当前分支是 "master"):
git rev-list --reverse old | git cherry-pick --stdin --keep-redundant-commits -X theirs
这工作正常,但所有提交都会得到一个新的 "committer"。有没有办法告诉 cherry pick 它不应该设置提交者?如果没有,有没有办法通过 rebase 实现我想要的?
我喜欢您精心挑选的方法。只需 运行 标准 "set my author info" 命令,然后再执行 cherry-pick 以匹配要保留的 "commiter" 数据。
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
然后在完成后将作者信息设置回您自己。
我用git filter-branch
解决了它:
FIX_COMMITTER='
if test "$GIT_AUTHOR_NAME" != "$GIT_COMMITTER_EMAIL"; then
GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL
export GIT_COMMITTER_NAME
fi
'
git filter-branch -f --env-filter "$FIX_COMMITTER" -- master