查看索引(在主分支和分支之间调用a[l] = (int *) malloc(n*sizeof(int));
之后),我看到同一个文件有3个结果,
merge_commits
通过查看每个内容,我的理解是第3阶段是最“近期/先进”的变化,但有人可以解释这些阶段背后的概念和编号吗?并且缺少阶段0,因为此文件中有未更改的更改?
答案 0 :(得分:3)
我不熟悉libgit2,但git索引文件中的非零阶段用于处理合并冲突。
在解决冲突之前,单个路径名最多会有三个条目,如the gitrevisions
documentation中所述:
冒号,可选地后跟阶段编号(0到3)和冒号,后跟路径,在给定路径的索引中命名blob对象。缺少的阶段编号(以及其后面的冒号)命名阶段0条目。在合并期间,阶段1是共同的祖先,阶段2是目标分支的版本(通常是当前分支),阶段3是正在合并的分支的版本。
如果合并冲突是由于删除(即,文件存在于共同祖先中但在一个分支中丢失并在另一个分支中被修改),则只有阶段2或3中的一个;如果是因为创建(文件在共同的祖先中不存在但在两个分支中创建),则不会有第1阶段的条目。 (我不确定我是否覆盖了所有少于3个条目的案例。)
在完成并提交合并之前,必须使用单个0阶段条目替换非零阶段条目。
答案 1 :(得分:1)
当您进行合并时,git需要从基本版本的每个提示进行更改。索引记录基本版本ID和每个提示版本oid,为1(基数)2("我们的#34;),3("他们的#34;)。记录内容id允许您根据需要在各种选项下重新运行差异(例如,获得3-diff冲突报告或忽略空格更改)。阶段0用于已解析的内容,内容没有机上合并。