Как использовать vimdiff для разрешения конфликта?

Я просто объединил ветку в моего мастера в git, и я получил Automatic merge failed; fix conflicts and then commit the result. теперь я побежал git mergetool и vimdiff открылся с изображением ниже. Я не знаю, как использовать vimdiff. Что означает каждая панель здесь и как я должен приступить к устранению конфликта слияния?

enter image description here

2 ответов


все четыре буфера предоставляют разные представления одного и того же файла. Верхний левый буфер (локальный) - это то, как файл выглядел в вашей целевой ветви (в которую вы сливаетесь). Верхний правый буфер (удаленный) - это то, как файл выглядел в вашей исходной ветви (откуда вы сливаетесь). Средний буфер (база) является общим предком двух (поэтому вы можете сравнить, как левая и правая версии расходились друг от друга).

Я могу ошибаться в следующем пункте. Я думаю, источник конфликт слияния заключается в том, что оба файла изменили одну и ту же часть файла с BASE; LOCAL изменил кавычки с double на single, а REMOTE сделал то же изменение, но также изменил фоновое значение с цвета на URL. (Я думаю, что слияние недостаточно умно, чтобы заметить, что все изменения в LOCAL также присутствуют в REMOTE; он просто знает, что LOCAL внес изменения с базы в тех же местах, что и REMOTE).

в любом случае, нижний буфер содержит файл, который вы можете редактировать-тот, который находится в вашем рабочем каталоге. Вы можете вносить любые изменения, которые вам нравятся;vim показывает вам, как он отличается от каждого из верхних видов, которые являются областями, которые автоматическое слияние не может обрабатывать. Извлеките изменения из локального, если вы не хотите удаленные изменения. Извлеките изменения из REMOTE, если вы предпочитаете их локальным изменениям. Вытащите из базы, если вы считаете, что и удаленный, и локальный ошибочны. Что-то совершенно иное, если у вас есть идея получше! В конец, изменения, которые вы делаете здесь, - это те, которые действительно будут совершены.


@chepner's answer is great, я хотел бы добавить некоторые подробности о "как я должен продолжить, чтобы исправить конфликт слияния" часть вопроса. Если вы посмотрите, как на самом деле использовать vimdiff в этом случае, он пойдет ниже.


во-первых, чтобы обратиться к опции "прервать все" - если вы не хотите использовать "vimdiff" и хотите прервать слияние: нажмите Esc тип :qa! и нажмите Enter. (см. также как выйти из редактора Vim?). Затем Git спросит вас, было ли слияние завершено, ответьте n.


если вы хотите использовать vimdiff, вот несколько полезных ярлыков. Это предполагает, что вы знаете основы Vim (навигация и вставка/нормальный режим):

  • перейдите к нижнему буферу (результат слияния):Ctrl-W j
  • перейдите к следующему diff с j/k; или, лучше, использовать ] c и [ c для перехода к следующему и предыдущему diff соответственно
  • использовать z o в то время как на сгиб, чтобы открыть его, если вы хотите увидеть больше контекста
  • для каждого различия, согласно ответу @chepner, вы можете либо получить версию кода из локальной, удаленной или базовой версии, либо отредактировать ее и повторить, как вы считаете нужным
    • чтобы получить его из локальной версии, используйте :diffget LO
    • С пультом дистанционного: :diffget RE
    • из базы: :diffget BA
    • или, если вы хотите отредактировать себя, сначала получите версию из local/remote/base, а затем перейдите в режим вставки и отредактируйте остальные
  • после этого сохраните результат слияния и закройте все окна :wqa
  • обычно git обнаруживает, что слияние было выполнено и завершает фиксацию слияния

вы можете искать в Интернете для других ярлыков vimdiff. Я нашел это полезным для пример: https://gist.github.com/hyamamoto/7783966