Есть ли способ сохранить изменения B и D, но пропустить C?
Вы находитесь в состоянии D.: w file.ext_D
Возврат в состояние C.: w file_ext_C
Возврат в состояние B.: w file.ext_B
:!kdiff3 file.ext_B file.ext_C file.ext_D
Это дает трехстороннее слияние различий, но вам все равно придется вручную войти и выбрать каждую красную линию в D для каждого конфликта слияния. Не совсем простое решение.
Если вместо этого вы делаете
:!kdiff3 file.ext_C file.ext_B file.ext_D
Тогда слияние происходит автоматически (за исключением отдельных строк с несколькими изменениями)
Для более сложных сценариев становится сложнее.
Примечание: я не уверен, насколько полезен инструмент контроля версий. Вы в основном делаете что-то вроде создания патча между B и D, а затем вычитаете из него патч из C в D. Мне кажется, что системы контроля версий обычно предназначены для управления слияниями между различными источниками изменений, а не изменениями в одной ветви.
kdiff3 доступен по адресу: http://kdiff3.sourceforge.net/