0

查看索引(merge_commits在 master 和分支之间调用之后),我看到同一个文件的 3 个结果,

{:path=>"file.txt", :oid=>"c6fdbacd7400805042668f4ccf70fc1ebbdac361", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>1, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}
{:path=>"file.txt", :oid=>"0838a4be16d19278e1e549614ffd2b6759549185", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>2, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}
{:path=>"file.txt", :oid=>"4bd2639f786bef1000dad7d59c6779a4e99fb27c", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>3, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}

通过查看每个内容的内容,我的理解是第 3 阶段是最“最近/高级”的变化,但是有人可以解释这些阶段和编号背后的概念吗?并且缺少第 0 阶段,因为此文件中有未提交的更改?

4

2 回答 2

3

我对 libgit2 不熟悉,但 git 索引文件中的非零阶段用于处理合并冲突。

在解决冲突之前,单个路径名最多有三个条目,如文档中所述gitrevisions

一个冒号,可选地后跟一个阶段号(0 到 3)和一个冒号,后跟一个路径,在给定路径的索引中命名一个 blob 对象。缺少的阶段编号(及其后面的冒号)命名阶段 0 条目。在合并期间,阶段 1 是共同祖先,阶段 2 是目标分支的版本(通常是当前分支),阶段 3 是正在合并的分支的版本。

如果合并冲突是因为删除(即文件存在于共同祖先但在一个分支中丢失并在另一个分支中修改),则将只有阶段 2 或阶段 3 中的一个;如果是因为创建(文件在共同祖先中不存在,但在两个分支中创建),则不会有阶段 1 条目。(我不确定我是否在这里涵盖了所有少于 3 个条目的情况。)

在完成并提交合并之前,您必须将非零阶段条目替换为单个阶段 0 条目。

于 2016-03-25T22:41:06.540 回答
1

当你进行合并时,git 需要基础版本的每个提示的更改。该索引记录了base version id和每个tips的version oid,分别为1(base)2(“ours”),3(“theirs”)。记录内容 id 允许您根据需要在各种选项下重新运行差异(例如,获取 3-diff 冲突报告或忽略空白更改)。阶段 0 用于已解决的内容,即没有飞行合并的内容。

于 2016-03-25T22:40:16.897 回答