2013-02-15 1 views
97

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

enter image description here

+2

См. [Эту страницу] (http://vim.wikia.com/wiki/A_better_Vimdiff_Git_mergetool). Если это то, что вы подразумеваете под «правильным», текущее состояние вашего кода находится в верхнем левом углу. – romainl

+0

@romainl Я все еще смущен, прочитав это, какие ярлыки и как я могу выбрать, какой файл использовать в качестве основной ветки? –

+2

@ Danny [http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/](http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/) является хорошим. –

ответ

100

Все четыре буфера обеспечивают различное представление одного и того же файла. Верхний левый буфер (ЛОКАЛЬНЫЙ) - это то, как файл просматривался в вашей целевой ветке (с чем вы сливаетесь). Верхний правый буфер (REMOTE) - это то, как файл выглядел в вашей ветви источника (где вы сливаетесь). Средний буфер (BASE) является общим предком двух (так что вы можете сравнить, как левая и правая версии расходятся друг от друга).

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

В любом случае, нижний буфер содержит файл, который вы можете редактировать — тем, кто сидит в вашем каталоге. Вы можете внести любые изменения; vim показывает вам, как он отличается от каждого из видов сверху, которые являются областями, которые автоматическое слияние не могло не обрабатывать. Извлеките изменения из LOCAL, если вы не хотите, чтобы изменения REMOTE менялись. Извлеките изменения из REMOTE, если вы предпочитаете их для ЛОКАЛЬНЫХ изменений. Потяните с BASE, если считаете, что оба REMOTE и LOCAL ошибочны. Сделайте что-то совершенно другое, если у вас есть лучшая идея! В конце концов, изменения, которые вы здесь делаете, это те, которые действительно будут совершены.

+2

Быстрый вопрос, как я могу сэкономить в vim? –

+3

': x' или': w' (': x' тоже выходит) плюс 'return'. –

+4

Anders: есть другие инструменты слияния, которые вы можете использовать, если не знаете, как использовать 'vim'. – chepner

9

@ Ответ на вопрос от chepner велик, я хотел бы добавить некоторые детали о том, «как мне исправить конфликт слиянием» в части вопроса. Если вы посмотрите, как на самом деле использовать vimdiff в этом случае, он будет ниже.


Во-первых, рассматривается вариант «Прервать все» - если вы не хотите использовать «vimdiff» и хотите прервать процесс слияния: нажмите Esc , затем введите :qa! и нажмите Enter . (см. также How to exit the Vim editor?). Затем Git спросит вас, завершено ли слияние, ответьте n.


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

  • перемещаться к нижнему буферу (слияния результата): Ctrl-WJ
  • перейти к следующему изменению с J/k; или, лучше, использовать ]с и [гр, чтобы перейти к следующему и предыдущему дифф соответственно
  • использование го время на сгиб, чтобы открыть его, если вы хотите увидеть больше контекст
  • для каждого дифференциала, согласно ответу @ chepner, вы можете получить версию кода из локальной, удаленной или базовой версии или отредактировать его и повторить, как вы видите нужный
    • т о получить его из локальной версии, используйте :diffget LO
    • от удаленного: :diffget RE
    • от основания: :diffget BA
    • или, если вы хотите изменить себя, получить версию с локального/удаленного/базы первого, а затем перейти к режим вставки и редактировать остальное
  • однажды сделано, сохраните результат слияния, и закройте все окна :wqa
  • обычно, мерзавец обнаруживает, что слияние было сделано, и завершает слияние фиксации

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

+0

Это должно быть одобрено x1000 раз и принято как лучший ответ. –