Подтвердить что ты не робот

Что означают Git "спаривание" и "неизвестные" состояния, и когда они возникают?

Некоторые параметры в git diff, например --name-status, вызывают вывод строки состояния рядом с именем файла. Это:

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

... и они означают

Добавлено (A), Скопировано (C), Удалено (D), Модифицировано (M), Переименовано (R), тип (т.е. регулярный файл, символическая ссылка, подмодуль,...) изменен (T), Unmerged (U), Unknown (X) или спаривание Broken (B).

Вопрос: как следует интерпретировать статусы X и B и какие обстоятельства приводят к их появлению? Можете ли вы предоставить ряд шагов, ведущих к таким состояниям, появляющимся на выходе git-diff, и, возможно, способы их исправления?

4b9b3361

Ответ 1

Статус B "сломанная пара" никогда не появляется непосредственно в выводе --name-status, он полезен только как аргумент опции --diff-filter, когда также используется опция -B (--break-rewrites). Используя его в качестве фильтра, вы выбираете файлы, в которых был удален или изменен хотя бы определенный процент их содержимого.

Это "нарушение" не очень полезно при использовании --name-status, поскольку точка "взлома" заключается в основном в изменении способа создания текста diff: он исключает линии контекста (неизменные строки) из выходного файла 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 "unknown" никогда не должен появляться. Если он появляется, это означает имя пути, которое не является ни unmerged, не добавлено, не удалено, не изменено или не изменило свой тип (эффективно: без изменений) неожиданно превратило его в ядро ​​внутренней системы дифференциала; также будет создана ошибка feeding unmodified <pathname> to diffcore.

Кажется, что он оставлен из какого-то старого режима работы.