#vim #tree #undo #3-way-merge
#vim #дерево #отменить #3-way-слияние
Вопрос:
Допустим, я нахожусь в состоянии A в моем документе. Затем я вношу изменения B, C и D (по порядку).
Есть ли способ сохранить изменения B и D, но пропустить C?
Или, допустим, я нахожусь в состоянии A в моем документе. Я вношу изменение B, отменяю его, а затем вношу изменения C и D (таким образом, Vim имеет дерево отмены с двумя ветвями). Затем я передумал и решил, что хочу использовать B и D, но не C.
Как я могу это сделать в Vim? У меня установлен gundo.vim
плагин, но я не использовал его так часто.
Комментарии:
1. Режим интересного вопроса. Обычно я использую g- и g , а также множество функций yank / put. Мне было бы очень любопытно, что люди придумывают
2. Я не уверен, что это возможно в Vim. Изменение C может быть основано на B. Что вам в основном нужно, так это способ сохранения определенных состояний документа с изменениями и возможностью последующего объединения различных состояний. Похоже на то, что могут делать системы с исходными версиями ядра при выполнении операций «слияния». Я думаю, вам нужно будет попрактиковаться в использовании именованных буферов и / или сохранении альтернативных версий файла, если вам нужно быстро переключаться между версиями.
3. Я могу представить только один способ сделать это автоматически: импортировать все дерево отмены в некоторые VCS, а затем использовать его для пропуска изменений (например,
git rebase -i
предоставляет способ удалить некоторый коммит, даже если у него есть дочерние элементы). Но я никогда не видел таких плагинов, поэтому вам придется написать это самостоятельно.4. Да, это звучит как редактор, который сохраняет каждый шаг в хорошем VCS, таком как Mercurial или Git. Честно говоря, я не думаю,
vim
что какой-либо другой редактор сможет это сделать. За исключениемemacs
, конечно, тех случаев, когда вы можете сделать это с помощью плагина git и небольшого написания сценариев 🙂5. Я не думаю, что вы можете это сделать, но Gundo может оказать некоторую помощь в захвате нужных строк: sjl.bitbucket.org/gundo.vim
Ответ №1:
Что ж, я попробую разобраться в этом и скажу: Нет, я не думаю, что есть способ сделать именно то, что вы хотите с vim.
gundo.vim
добавляет приятный интерфейс к отмене vim, но не изменяет его основные возможности. Итак, я взглянул на официальные документы vim, чтобы посмотреть, есть ли какие-либо намеки на то, способен ли он на это:
Ничего о слиянии двух ветвей вместе. Я думаю, что ewh и ZyX правы: чтобы получить общее решение для объединения B с D, vim потребуется либо для
- Bram, чтобы добавить его как отдельную функцию в будущей версии
- кто-нибудь, кто мог бы реализовать это в плагине путем интеграции с чем-то, что уже может выполнять слияния (например, git / hg)
Вы, конечно, можете попытаться сделать это вручную, открыв файлы с версиями B, C и D, а также несколько различий.
Примечание: Если я неправильно понял, и вам не интересно общее решение, и вы ищете помощь с конкретным примером этого, дайте мне знать, и я посмотрю, что я могу сделать 🙂
Ответ №2:
Есть ли способ сохранить изменения 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
Комментарии:
1. ПОЧЕМУ kdiff3? Это это vim, поэтому у него есть diff. Если вы хотите просто объединить, используйте meld или любую другую cli-программу, которая легко интегрируется. Re:
... how a revision tool is much help [...] not [...] a single branch
: Много работаете с микрокоммитами? Вся концепция git apply -interactive, возможно, даже ее функция индексирования, ориентирована именно на эту потребность