Git如何确定冲突中未合并的路径?

3
Git如何获取未合并路径的列表?
我对Git的理解是,在合并时,它将更改合并到文件中,然后将其添加到索引中。如果出现合并冲突,则不会将文件添加到索引中,并将其保留在具有冲突标记的工作树中。如果我运行git status,则会显示冲突文件的未合并路径。
Git如何获取这些文件的列表?如果我使用仍带有标记的冲突文件运行git add,它将不再显示为冲突文件,因此标记可能不是标识符?
1个回答

3
如果合并冲突发生,文件就不会被添加到索引中,而是在工作树中带有冲突标记。可以通过 git ls-files 查看它是否在索引中:
对于未合并的路径,索引会记录最多三个模式/SHA-1对;分别来自第一阶段的O树,第二阶段的A树和第三阶段的B树,详情请参见 git read-tree
每个“索引”条目都有两个位的“阶段”状态。0阶段是正常的,是任何正常使用中唯一能看到的阶段。但是,当您使用三棵树进行 git read-tree 时,“阶段”从1开始。这意味着您可以执行:
git read-tree -m <tree1> <tree2> <tree3>

并且你最终会得到一个包含所有 "" 条目在 "stage1" 中的索引,所有 "" 条目在 "stage2" 中的索引以及所有 "" 条目在 "stage3" 中的索引。
当将另一个分支合并到当前分支时,我们可以使用共同祖先树作为 ,当前分支头作为 ,另一个分支头作为 。请参见 "如何强制Git认为文件未合并?"。

我正在阅读 git read tree,看起来合并是在内部完成的,然后才更新索引和工作树,而不是相反(在工作目录中合并 -> 更新索引)。这是正确的吗? - Max Koretskyi
1
@Maximus 我明白你的意思。请参考 http://git-scm.com/docs/git-merge#_true_merge:它将使用工作树作为合并结果存储的位置,合并 HEAD 和 MERGE_HEAD,并且对于冲突的路径,在索引文件中记录最多三个版本:stage 1 存储来自共同祖先的版本,stage 2 来自 HEAD,stage 3 来自 MERGE_HEAD(您可以使用 git ls-files -u 检查这些 stage)。工作树文件包含“合并”程序的结果。因此,是的,工作树和索引会根据合并结果进行更新。 - VonC
明白了,谢谢!我会多了解一下read-tree,因为它似乎是描述合并时发生的魔法的最佳方式。祝好! - Max Koretskyi
是的,文档没有明确说明,这只是我的猜测。 - Max Koretskyi
请在有时间的时候查看这个链接和这个链接,谢谢! - Max Koretskyi
显示剩余4条评论

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