【问题标题】:How does git figure out unmerged paths in conflicts?git 如何找出冲​​突中未合并的路径?
【发布时间】:2015-02-28 10:33:37
【问题描述】:

git如何获取未合并路径的列表?

我对 git 的理解是,在合并时会将更改合并到文件中,然后将其添加到 index.html 中。如果发生合并冲突,则不会将文件添加到索引中,而是将文件留在带有冲突标记的工作树中。如果我运行git status,它会向我显示unmerged paths 的冲突文件。

git如何获取这些文件的列表?如果我为冲突文件运行git add,但标记仍然存在,它将不再显示为冲突,所以标记可能不是标识符?

【问题讨论】:

    标签: git git-merge-conflict


    【解决方案1】:

    如果发生合并冲突,则不会将文件添加到索引中,并且会在带有冲突标记的工作树中留下。

    在索引中:见git ls-files

    对于未合并的路径,索引最多记录三个这样的对,而不是记录单个模式/SHA-1 对;一个来自第一阶段的树O,第二阶段的A,第三阶段的B。

    git read-tree详细介绍了2路合并:

    每个“索引”条目都有两个位的“阶段”状态。
    阶段 0 是正常阶段,并且是您在任何类型的正常使用中看到的唯一阶段。

    但是,当您使用三棵树执行 git read-tree 时,“阶段”从 1 开始。

    这意味着你可以做到

    git read-tree -m <tree1> <tree2> <tree3>
    

    您最终会得到一个索引,其中包含“stage1”中的所有 &lt;tree1&gt; 条目、“stage2”中的所有 &lt;tree2&gt; 条目以及“@”中的所有 &lt;tree3&gt; 条目987654333@".
    在将另一个分支合并到当前分支时,我们使用共同祖先树为&lt;tree1&gt;,当前分支头为&lt;tree2&gt;,另一个分支头为@987654336 @

    另见“How do I force git to think a file is unmerged?”。

    【讨论】:

    • 我正在通读git read tree,看来合并是在内部完成的,然后才更新索引和工作树,而不是相反(在工作目录中合并-> 更新索引)。对吗?
    • @Maximus 不,它使用索引来执行合并,这就是为什么它“如果您的索引文件有未合并的条目将拒绝运行,这表明您还没有完成之前开始的合并。”
    • 嗯,它是否也使用工作目录来执行合并?还是在索引中完成合并时从索引更新工作目录?我可能不太明白it uses the index to perform the merge 的意思。
    • @Maximus 我明白你的意思。见git-scm.com/docs/git-merge#_true_merge:它将使用工作树作为存储合并结果的地方,合并HEAD和MERGE_HEAD,并且对于冲突的路径,在索引文件中记录最多三个版本:阶段1存储版本来自共同祖先,来自 HEAD 的第 2 阶段和来自 MERGE_HEAD 的第 3 阶段(您可以使用 git ls-files -u 检查这些阶段)。工作树文件包含“合并”程序的结果。所以是的,工作树和索引会根据合并的结果进行更新。
    • 知道了,谢谢!我将阅读更多关于read-tree 的信息,因为这似乎是对合并时发生的魔法的最佳描述。最好的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2021-09-12
    • 2011-03-13
    相关资源
    最近更新 更多