如何变基整个提交图?

How to rebase an entire commit graph?

我们有一个项目存储库 left

然后我们从 left 的最顶层快照创建了一个克隆存储库 right(并在那里工作了几个星期)。

我们如何合并两个图
(让团队在两者之间合并)


注意:缝合点包含完全相同的变更集,不存在冲突。

NOTE: The stiching point contains the very same changeset, there are no conflicts involved.

所以,我认为你应该使用 git replace

最有可能的命令:

git replace --graft <commit> [<parent>…​] 

如果我理解得很好,你想要 link 第一个蓝色提交和最后一个橙色提交,它们是包含完全相同内容的提交。

命令有点复杂,因为最后一个橙色提交是合并提交,所以你应该在命令行中使用 2 个父级的 sha1(倒数第二个橙色和最后一个绿色)。

所以命令应该是:

git replace --graft <Sha1_of_first_blue_commit> <Sha1_of_second_to_last_orange_commit> <Sha1_of_last_green_commit>

完成后,验证历史记录。

如果这不适合您,请删除替换的提交。

如果这适合您,那么您应该使用 git filter-branch 通过在提交替换后重写所有历史记录使其永久化(使用 git filter-branch -- --all)。

来自文档:

NOTE: This command honors .git/info/grafts file and refs in the refs/replace/ namespace. If you have any grafts or replacement refs defined, running this command will make them permanent.

它将修改 blue 和后续提交的历史,因此,要推送它,您将不得不对所有已更新的引用执行 git push --force-with-lease

PS: 也可以推送被替换的对象(一种解决方案),但这不是推荐的解决方案。