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

2 ответов:
все четыре буферы обеспечивают различное представление одного и того же файла. Верхний левый буфер (локальный) - это то, как файл выглядел в целевой ветви (в которую вы сливаетесь). Верхний правый буфер (удаленный) - это то, как файл выглядел в вашей исходной ветви (где вы сливаетесь). Средний буфер (база) является общим предком этих двух (поэтому вы можете сравнить, как левая и правая версии разошлись друг от друга).
Я могу ошибаться в следующем пункте. Я думаю, что источник конфликт слияния заключается в том, что оба файла изменили одну и ту же часть файла с BASE; LOCAL изменил кавычки с double на single, а REMOTE сделал то же самое изменение, но также изменил значение фона с цвета на URL. (Я думаю, что слияние недостаточно умно, чтобы заметить, что все изменения в LOCAL также присутствуют в REMOTE; он просто знает, что LOCAL внес изменения с базы в тех же местах, что и REMOTE).
в любом случае, нижний буфер содержит файл, который вы действительно можете редактировать-тот, который находится в вашем рабочем каталоге. Вы можете внести любые изменения, которые вам нравятся;
vimпоказывает вам, как он отличается от каждого из видов сверху, которые являются областями, которые автоматическое слияние не может не обрабатывать. Извлеките изменения из локального, если вы не хотите удаленные изменения. Извлеките изменения из удаленного, если вы предпочитаете их локальным изменениям. Потяните от базы, если вы думаете, что и удаленные и локальные не правы. Что-то совершенно иное, если у вас есть идея получше! В конце, изменения здесь являются те, которые действительно будут совершены.
ответ@chepner велик, я хотел бы добавить некоторые детали о том, "как я должен продолжить, чтобы исправить конфликт слияния" часть вопроса. Если вы посмотрите, как на самом деле использовать vimdiff в этом случае, он идет ниже.
во - первых, чтобы обратиться к опции "прервать все" - если вы не хотите использовать "vimdiff" и хотите прервать слияние: нажмите Esc тип
:qa!и нажмите введите. (см. также как выйти из редактора Vim?). Затем Git спросит вас, было ли слияние завершено, ответьте сn.
если вы хотите использовать vimdiff, вот некоторые полезные ярлыки. Это предполагает, что вы знаете основы Vim (навигация и вставка / нормальный режим):
- перейдите к нижнему буферу (результат слияния):Ctrl-Wj
- перейдите к следующему diff с j/k; или, лучше, использовать ]c и [c для перехода к следующему и предыдущему diff соответственно
- использовать zo в то время как на сгиб, чтобы открыть его, если вы хотите увидеть больше контекста
- для каждого diff, согласно ответу @chepner, вы можете либо получить версию кода из локальной, удаленной или базовой версии, либо отредактировать ее и повторить, как вы считаете нужным
- чтобы получить его из локальной версии, используйте
:diffget LO- с пульта дистанционного управления:
:diffget RE- из базы:
:diffget BA- или, если вы хотите отредактировать себя, сначала получите версию из local/remote/base, а затем перейдите в режим вставки и отредактируйте остальные
- после этого сохраните результат слияния и закройте все окна
:wqa- обычно git обнаруживает, что слияние было сделано, и завершает фиксацию слияния
вы можете искать в интернете другие ярлыки vimdiff. Я нашел это полезным для пример: https://gist.github.com/hyamamoto/7783966
Comments