为什么Git在冲突后输出git status时会显示"both modified"?

50

在尝试合并 Git 中的文件时出现冲突,Git 会在冲突的文件上说“both modified”。

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

      both modified: file1

no changes added to commit (use "git add" and/or "git commit -a")

不确定为什么会 "both modified"。 有没有人知道?


1
它被修改了“since”或与两个父级进行了比较。 - MrTux
1
所以这只是一个提示,这个文件在两个父提交中都被更改了,这实际上非常明显(否则就不会有冲突了,对吧)? - Pascal Precht
1个回答

36

这与Git 1.6.5(2009年10月)和提交4d4d572有关,该提交引入了更详细的消息:

status:分别显示冲突路径的工作树状态

当索引中的路径未合并时,我们过去常常会在“已更改但未更新”部分中说“未合并”,即使路径在工作树中被删除。

从“已更新”部分中删除未合并条目,并创建一个名为“未合并路径”的新部分。 在此新部分中更详细地描述不同阶段的冲突

正如您可以在此补丁中看到的那样,“同时修改”(在两个父级中)并不是唯一的冲突情况。

case 1: how = "both deleted:"; break;
case 2: how = "added by us:"; break;
case 3: how = "deleted by them:"; break;
case 4: how = "added by them:"; break;
case 5: how = "deleted by us:"; break;
case 6: how = "both added:"; break;
case 7: how = "both modified:"; break;

提交 173e6c8中,使用git status -s命令可以看到更多情况:

对于未合并的条目,

  • X 显示阶段 #2(即“ours”)的状态,
  • Y 显示阶段 #3(即“theirs”)的状态。
X          Y     Meaning
-------------------------------------------------
D           D    unmerged, both deleted
A           U    unmerged, added by us
U           D    unmerged, deleted by them
U           A    unmerged, added by them
D           U    unmerged, deleted by us
A           A    unmerged, both added
U           U    unmerged, both modified

这说明在Git中,具有合并冲突的索引通常具有三个版本(请参见“如何强制Git认为文件未合并?”)。

在Git中,具有合并冲突的文件通常在索引中有三个版本,并且在工作区中有一个带有diff3 -E / rcsmerge冲突标记的版本。

  • 索引中的版本分别是:共同祖先的第一阶段,"我们"版本的第二阶段和"他们"版本的第三阶段。

对于未合并的文件,没有第0阶段的版本。

在这里,“both modified”表示“在‘我们’和‘他们’中都被修改”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接