git 怎么知道有冲突

how does git know there is a conflict

原来有师父去

   m1->m2

还有一个分支

     m1->m2
       \
        ->b1->b2 

我将 master 合并到分支中

   m1->m2         mb(merge commit)
        \       /
         ->b1->b2

假设我在合并主文件时在分支中修复的一个文件中存在冲突。我修复了它,它现在看起来完全不像文件在 master 中的样子(在提交 m3 时)。如果我将分支(现在在 commit mb)合并回 master,git 不会抱怨存在冲突。文件没有什么不同吗?它怎么知道它不是冲突并且它需要使用来自分支的文件?

我知道这是正确的行为,但我很好奇是什么告诉 git 分支中的那个是 'right' 那个。

须知:什么是合并?它是两个分支 自合并基础 以来的变化的组合(即最近分支“分歧”的地方)。

"what tells git that the one in branch is the 'right' one."

这就是“反向”合并的全部要点。想象一下这种情况:

 mergebase
     |
A -- B -- C <- master
     \
      X <- branch

此时,如果您在两个分支之间进行任何一种合并,B 就是合并基础。假设 C 和 X 都以生成潜在合并冲突的方式更改同一个文件。好的,所以你将 master 合并到 branch 并修复该文件中的冲突(在下图中形成合并提交 M)。这也将合并基础移动到master (C) 的尖端,为即将到来的正向合并做准备:

      mergebase
          |
A -- B -- C <- master
     \    \
      X -- M <- branch

希望当你合并 branchmaster 时,master 没有变化 因为合并基础 C(至少与尊重这个文件)。因此 master 自合并基础以来 没有贡献 ,但是 branch 有贡献(合并提交 M 的文件版本与 C 不同),所以只有branch 有助于合并并采用其文件版本。