git diff
中的某些选项(例如--name-status
)会导致在文件名旁边输出状态字母。他们是:
A,C,D,M,R,T,U,X,B
......他们的意思是
添加(A),复制(C),删除(D),修改(M),重命名(R), 类型(即常规文件,符号链接,子模块,...)已更改(T), 未合并(U),未知(X)或配对破碎(B)。
问题:如何解释X
和B
状态,以及哪些情况会导致其出现?您是否可以提供一系列步骤,以便在git-diff
的输出中显示此类状态,以及可能的解决方法?
答案 0 :(得分:12)
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
X
“未知”状态永远不应该出现。如果它确实出现,则意味着路径名既不是未合并,添加,删除,修改或其类型已更改(有效地:未更改)意外地使其成为内部diff机制的核心; <!}}也将生成错误{\ n}}。
似乎是从一些旧的操作模式中遗留下来的。