|
git replay 还不支持 merge commit ,所以还要自己写代码实现相似的功能。
从 head 往上抓所有 commit 的 parent ,尤其是 merge commit 的 2 个 parent (记好谁是 first 谁是 second ),形成一张有向图,并指定一个起点 checkout --orphan ,commit 作为起点。同时导出所有 merge commit 的 diff 文件和 message 备用。
从起点开始不停 cherry-pick ,在分叉点跟踪新的 commit hash 。
碰到 merge 的时候,先把其他 parent 都新建分支 cherry-pick 到底,回到 first parent ,然后:
git merge --no-commit -s ours ${second parent 分支名}
git apply ${这个 merge 的 diff 文件}
git commit -F ${message 文件}
这样能完成 merge ,然后重复继续 cherry-pick ,一直走到 head 。
这样所有非 merge 的 commit 能保留原始的日期,但 merge commit 都是当前时间,也没有 3-way resolve 的信息了。 |