git diff
中的某些选项,例如 --name-status
,会导致在文件名旁边输出状态字母。它们是:
A, C, D, M, R, T, U, X, B
……他们的意思是
Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), type (i.e. regular file, symlink, submodule, …) changed (T), Unmerged (U), Unknown (X), or pairing Broken (B).
问题X
和B
状态应该如何解释,什么情况导致它们出现?您能否提供导致此类状态出现在 git-diff
输出中的一系列步骤,以及可能的修复方法?
最佳答案
B
“破对”状态从不直接出现在 --name-status
中输出,它仅作为选项的参数有用 --diff-filter
当还使用选项 -B
时(--break-rewrites
)。将其用作过滤器可以选择至少有一定比例的内容被删除或更改的文件。
这个“中断”对于 --name-status
不是很有用因为“中断”的 Gist 主要是改变差异文本的生成方式:它从差异输出中消除上下文行(未更改的行),而不是生成围绕任何“随机”公共(public)子序列所需的添加和删除行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
X
“未知”状态不应该真正出现。如果确实出现,则意味着路径名既未取消 merge 、添加、删除、修改,也未更改其类型(有效:未更改),意外地进入了内部差异机制的核心;错误 feeding unmodified <pathname> to diffcore
也会产生。
它似乎是一些旧操作模式遗留下来的。
关于git - Git “pairing broken” 和 “unknown” 状态是什么意思,它们何时出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6058879/