索引的坚固 (libgit2) 阶段

Rugged (libgit2) stage for index

查看索引(在 master 和分支之间调用 merge_commits 之后),我看到同一文件有 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 是最大的 "recent/advanced" 变化,但是有人可以解释这些阶段和编号背后的概念吗?阶段 0 丢失是因为此文件中有未提交的更改?

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

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

在解决冲突之前,单个路径名最多有三个条目,如 the gitrevisions documentation:

中所述

A colon, optionally followed by a stage number (0 to 3) and a colon, followed by a path, names a blob object in the index at the given path. A missing stage number (and the colon that follows it) names a stage 0 entry. During a merge, stage 1 is the common ancestor, stage 2 is the target branch’s version (typically the current branch), and stage 3 is the version from the branch which is being merged.

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

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