Git"配对破坏"和"未知"状态意味着什么,它们何时发生?

Jea*_*let 14 git git-diff

git diff例如--name-status,某些选项会导致在文件名旁边输出状态字母.他们是:

A,C,D,M,R,T,U,X,B

......他们的意思是

添加(A),复制(C),删除(D),修改(M),重命名(R),类型(即常规文件,符号链接,子模块,...)更改(T),未合并(U),未知(X) ),或配对破碎(B).

问题:如何解释XB状态,以及哪些情况会导致它们出现?您能否提供一系列步骤,导致出现在输出中的这种状态git-diff,以及可能的修复方法?

Chr*_*sen 13

所述B的"破一对"状态永远不会出现直接--name-status输出,它只是作为一个参数来选择有用--diff-filter也使用选项时-B(--break-rewrites).将其用作过滤器可选择已删除或更改其内容的至少一定百分比的文件.

这种"破坏"并不是非常有用,--name-status因为"破坏"主要是为了改变差异文本的生成方式:它从diff输出中消除了上下文行(未改变的行),而不是生成添加和删除行需要围绕diff算法碰巧发现的任何"随机"公共子序列.

git init broken-pairs
cd broken-pairs
nums() { seq "$1" "$2" 2>/dev/null || jot $(($2 - $1 + 1)) "$1"; }
nums   0  99 > a
nums 100 199 > b
git add a b
git commit -ma=0-99,b=100-199
nums 200 299 > a
{ nums 100 149; nums 350 399; } > b
git diff --name-status --diff-filter=B             # selects nothing
git diff --name-status --diff-filter=B -B          #         M100    a
git diff --name-status --diff-filter=B -B/50       #         M100    a M050    b
Run Code Online (Sandbox Code Playgroud)

X"未知"的状态不应该实际出现.如果它确实出现,则意味着路径名既不是未合并,添加,删除,修改或其类型已更改(有效地:未更改)意外地使其成为内部diff机制的核心; 错误feeding unmodified <pathname> to diffcore也将生成.

它似乎是从一些旧的操作模式遗留下来的.