Ответ 1
Это далеко не идеально, но новый --compaction-heuristic
в Git 2.9 часто делает то, что вы хотите. Подробнее см. этот пост в блоге. Вы можете настроить его по умолчанию, но, учитывая, что это иногда ухудшает ситуацию, я этого не делал:
git config --global diff.compactionHeuristic true
Ваша версия Git должна быть не менее 2.9, чтобы это имело какой-либо эффект.
Один из недостатков текущей реализации заключается в том, что она буквально требует пустой строки над модифицированным разделом. Недостаточно начинать в верхней части файла. Например, предположим, что мы начинаем с:
block:
This file has
three blocks.
block:
There is a blank line
between each.
block:
This is the third
block.
Если мы удалим средний блок, по умолчанию diff сохранит вторую строку block:
и удалит третью строку block:
. Включение уплотнения перемещает diff-hunk вверх до тех пор, пока он не достигнет пустой строки над вторым block:
, который мы хотим.
К сожалению, если мы удалим первый блок, эвристика уплотнения попытается перенести diff diff, чтобы включить первую строку block:
, но сбой, поскольку она попадает в верхнюю часть файла, где над ним нет пустой строки (так как над ним нет линии). Поэтому он оставляет первое слово block:
на месте и удаляет второй.
(Исправление этого требует только того, что алгоритм уплотнения представляет собой "виртуальную нуль нуля", которая является пустой. Обратите внимание, что сама проблема никогда не встречается в конце файла, так как по умолчанию diff способствует удалению более поздних строк. уродливое обходное решение состоит в том, чтобы оставить пустую строку в верхней части каждого файла, просто чтобы уплотнение могло ее увидеть.)