将两个独立的分支历史缝合在一起



我的 Git 存储库中有两个独立的分支:

A---B---C branch "old"
X---Y---Z branch "master"

我想生成以下历史记录:

A---B---C---X---Y---Z

我使用以下变基命令尝试了这个(当前分支是"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是"旧"分支的第一次提交。

作为替代方案,我使用了樱桃选择命令(当前分支是"master"):

git rev-list --reverse old | git cherry-pick --stdin --keep-redundant-commits -X theirs

这工作正常,但所有提交都会得到一个新的"提交者"。有没有办法告诉樱桃选择它不应该设置提交者?如果没有,有没有办法通过变基来实现我想要的?

我用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

想法来源:https://gist.github.com/maciej/5875814

我喜欢

你的樱桃选择方法。 只需运行标准的"设置我的作者信息"命令,然后再进行挑选以匹配要保留的"提交者"数据。

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

完成后,将作者信息设置回自己。

如果您只想在另一个历史记录之上重新设置不相关的历史记录:

git switch master
git rebase --root --onto old

请注意错误消息:

First, rewinding head to replay your work on top of it...
fatal: Could not parse object 'fb56e6e20ea4a605503732df1f5a0a407808dffa^'

fb56e6e...^意味着它试图得到fb56e6e的第一个父母,但是该提交不存在,因为fb56e6e是根提交。

保留提交程序

这个更有趣。

git switch master
git rebase --root --onto old --exec 'git -c committer.name="$(git log -1 --pretty=format:%cn)" -c committer.email="$(git log -1 --pretty=format:%ce)" commit --amend --no-edit'

但是如何保留提交者日期呢?

留给读者作为练习。

相关内容

  • 没有找到相关文章

最新更新