【问题标题】:Git erroneous no-op mergeGit错误的无操作合并
【发布时间】:2015-12-22 14:56:11
【问题描述】:

我在 Git 中看到一个奇怪的合并失败,在“压缩”合并到主控之后。

我创建了一个tiny GitHub repo 来重现该问题。

本质上,流程如下:

这里发生了什么?为什么从 master 合并回分支不包括直接对 master 分支所做的更改?这是错误还是使用错误?

【问题讨论】:

    标签: git github merge squash


    【解决方案1】:

    这不是错误。问题是你的squash commit不是合并,所以git不知道它连接到Branch-1。它认为这是一个普通的提交。当您将master 合并到Branch-1 中时,git 会看到由于这些分支出现了以下变化:

    • master:添加file1file2,然后删除file1。总体差异:添加了file2
    • Branch-1:添加file1,添加file2。总体差异:添加了file1file2

    Git 使用这些整体差异合并分支。您在两个分支中添加了file2,但没有合并冲突,因为两个分支中的file2s 是相同的。所以合并的结果是一个提交,包含file1file2

    出于同样的原因,您的拉取请求会将file1 添加到master

    但是如果你做了一个真正的合并而不是一个 squash,结果会如你所愿。


    其实git help merge里也提到了这个:

    对于使用 3 路合并的策略(包括默认策略,递归),如果在两个分支上都进行了更改,但后来又在其中一个分支上恢复,则该更改将存在在合并结果中;有些人觉得这种行为令人困惑。这是因为在执行合并时只考虑头部和合并基础,而不是单个提交。因此,合并算法将恢复的更改视为根本没有更改,并替换为更改的版本。

    【讨论】:

    • 嗯。我以前注意到,在这种情况下,mastersquashd 来自一个分支的更改,而第二个分支具有来自同一分支的未压缩更改,将“壁球”提交合并回原始分支,然后合并该分支新的“合并”提交回第二个分支似乎可以防止合并错误,否则这些错误会直接从 master 拉出。我认为这是因为在从主分支到原始分支的合并过程中,“壁球”提交以某种方式受到了特殊处理--
    • 但听起来我应该通过简单地从 Branch-1 拉入 Branch-2 而不从 master 拉入 Branch-1 来获得相同的行为(即避免合并冲突)。
    • 我没有完全理解你的问题(它甚至是一个问题吗?),但是,是的,当双方引入相同的更改时,git 不应该强迫你解决冲突(因为它没有不管你选择哪一边——结果都是一样的)。
    • 我猜隐含的问题是“你确定 squash-commits 在合并期间没有得到任何特殊处理吗?”
    • 是的,我确定。但请记住,“相等差异的无冲突合并”仅在差异相等时才有效(实际上,我认为不是整个差异,而是个别潜在冲突的帅哥)。示例:如果您将123 添加到branch1 中的file,然后将提交压缩到master,然后从branch1 创建branch2 并将file 更改为包含456,它将变得棘手。将master 合并到branch1 将在没有冲突的情况下完成(差异相等),然后将新的branch1 合并到branch2 也将在没有冲突的情况下完成(差异将为空)...
    猜你喜欢
    • 2017-12-04
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2017-08-03
    • 2013-02-14
    相关资源
    最近更新 更多