【问题标题】:How to rebase an entire commit graph?如何重新定位整个提交图?
【发布时间】:2019-04-10 15:14:40
【问题描述】:

我们有一个项目存储库left

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

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


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

【问题讨论】:

    标签: git tree repository branch rebase


    【解决方案1】:

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

    所以,我认为你应该使用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),但这不是推荐的解决方案。

    【讨论】:

    • 太棒了,感谢合并提交的额外内容!我今天晚些时候试试(然后回来接受)。
    • 谢谢!这会重写提交哈希(就像 rebase 一样)?其他团队成员是否应该再次检查整个存储库?或者我什至应该把它推到一个空白的遥控器上并从中结帐?
    • 我认为从 git v2 开始,一次只推送一个分支,所以你将不得不为每个分支都这样做......
    • 由于 git 的工作方式,每个提交都是一个快照,但会发生一些奇怪的事情。替换的提交引入的更改/差异会有所不同,其中还包含使尾部和提示不同的所有更改(抱歉,难以解释)
    • git store 提交的方式允许您将每个提交拼接在一起,但计算出的差异并显示给开发人员将或多或少有意义。因此,请仔细选择提交,并且您应该选择的父提交必须尽可能相似。你甚至可以选择一个相同的提交,这样缝合不会引入任何变化(差异为空)。
    猜你喜欢
    • 2011-12-06
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2021-12-24
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多