【发布时间】:2019-04-10 15:14:40
【问题描述】:
我们有一个项目存储库left。
然后我们从left 的最高快照创建了一个克隆存储库right(并在那里工作了几个星期)。
我们如何合并两个图表?
(让团队在两者之间合并)
注意:缝合点包含完全相同的变更集,不涉及冲突。
【问题讨论】:
标签: git tree repository branch rebase
我们有一个项目存储库left。
然后我们从left 的最高快照创建了一个克隆存储库right(并在那里工作了几个星期)。
我们如何合并两个图表?
(让团队在两者之间合并)
注意:缝合点包含完全相同的变更集,不涉及冲突。
【问题讨论】:
标签: git tree repository branch rebase
注意:缝合点包含完全相同的变更集,不涉及冲突。
所以,我认为你应该使用git replace。
很可能是命令:
git replace --graft <commit> [<parent>…]
如果我理解得很好,您希望将第一个蓝色提交与最后一个橙色提交链接,它们是包含完全相同内容的提交。
该命令稍微复杂一些,因为最后一个橙色提交是一个合并提交,因此您应该在命令行中使用 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),方法是在提交替换后重写所有历史记录。
来自文档:
注意:此命令尊重 .git/info/grafts 文件和 refs/replace/ 命名空间中的 refs。如果您定义了任何移植或替换引用,运行此命令将使它们永久化。
它将修改 blue 和后续提交的历史记录,因此,要推送它,您将不得不为所有已更新的 refs 执行 git push --force-with-lease。
PS:也可以推送替换的对象(解决方案here),但这不是推荐的解决方案。
【讨论】: