Я только что слил ветку в мой мастер в git и получил. Automatic merge failed; fix conflicts and then commit the result.
Теперь я побежал git mergetool
и открыл vimdiff с изображением ниже. Я не знаю, как использовать vimdiff. Что означает каждая панель здесь, и как мне действовать, чтобы устранить конфликт слияния?
159
Ответы:
Все четыре буфера обеспечивают различное представление одного и того же файла. Верхний левый буфер (LOCAL) - это то, как файл выглядел в вашей целевой ветви (во что вы сливаетесь). Верхний правый буфер (REMOTE) - это то, как файл выглядел в вашей исходной ветке (откуда вы объединяетесь). Средний буфер (BASE) является общим предком двух (так что вы можете сравнить, как левая и правая версии отличались друг от друга).
Я могу ошибаться в следующем. Я думаю, что источником конфликта слияния является то, что оба файла изменили одну и ту же часть файла после BASE; LOCAL изменил кавычки с двойных на одинарные, и REMOTE сделал то же самое изменение, но также изменил значение фона с цвета на URL. (Я думаю, что слияние недостаточно умен, чтобы заметить, что все изменения в LOCAL также присутствуют в REMOTE; он просто знает, что LOCAL внес изменения после BASE в тех же местах, что и REMOTE).
В любом случае нижний буфер содержит файл, который вы действительно можете редактировать - тот, который находится в вашем рабочем каталоге. Вы можете вносить любые изменения, которые вам нравятся;
vim
показывает, как он отличается от каждого из видов сверху, которые являются областями, которые автоматическое объединение не может обработать. Вытащите изменения из МЕСТНОГО, если вы не хотите УДАЛЕННЫХ изменений. Извлеките изменения из REMOTE, если вы предпочитаете их локальным изменениям. Потяните с BASE, если считаете, что REMOTE и LOCAL ошибочны. Сделайте что-то совершенно другое, если у вас есть идея получше! В конце концов, изменения, которые вы вносите здесь, действительно будут зафиксированы.источник
:x
или:w
(:x
тоже выходит) плюс «возврат».vim
.Ответ @ chepner отличный, я хотел бы добавить некоторые детали вопроса «как мне решить проблему слияния». Если вы посмотрите, как на самом деле использовать vimdiff в этом случае, он пойдет ниже.
Во-первых, обратитесь к опции «прервать все» - если вы не хотите использовать «vimdiff» и хотите прервать слияние: нажмите Esc, затем введите
:qa!
и нажмите Enter. (см. также Как выйти из редактора Vim? ). Git спросит вас, было ли слияние завершено, ответьте с помощьюn
.Если вы хотите использовать vimdiff, вот несколько полезных ярлыков. Предполагается, что вы знаете основы Vim (навигация и вставка / обычный режим):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
вместо этого выйдите с помощью : Как отменить внешний git diff?По-видимому, невозможно добавить как локальные, так и удаленные блоки конфликтов без вставки копий или пользовательских ярлыков: /vi/10534/is-there-a-way-to-take-both- Когда-использование-vim-as-merge-tool - это позор, так как add-add - такой распространенный тип конфликта.
Чтобы vimdiff не просил вас нажимать клавишу ввода при каждом запуске, добавьте в
.vimrc
:как упомянуто в: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Вы можете искать в Интернете другие ярлыки vimdiff. Я нашел это полезным: https://gist.github.com/hyamamoto/7783966
источник
:diffget
.Окончательный mergetool, чтобы заменить vimdiff
Это что-то вроде насмешки, но это то, к чему я в конечном итоге присоединился как к vimmer после попытки vimdiff.
Чтобы разрешить конфликт слияния, мне почти всегда нужно видеть:
затем попытаться соединить их обоих.
В то время как vimdiff показывает BASE, LOCAL и REMOTE на экране:
Я не знаю, как сделать так, чтобы это четко показывало те две разницы, которые мне нужны, кроме того, что я смотрел направо, налево, направо, налево, несколько раз.
Более того, LOCAL и REMOTE уже видны в маркерах конфликтов git merge, поэтому я не так уж выиграл от инструмента, который их показывает снова.
Поэтому я вместо этого создал свой собственный крошечный «difftool», который фактически показывает различия, которые я пропустил:
~ / Bin / cirosantilli-mergetool
GitHub вверх по течению .
И установите его с помощью:
Теперь, когда вы делаете:
он показывает две разницы, которые я хочу на терминале, например что-то вместе:
Итак, вы можете увидеть здесь две разности, сброшенные в терминал:
RealView_BASE_15560.py
противRealView_LOCAL_15560.py
RealView_BASE_15560.py
противRealView_REMOTE_15560.py
Если различия велики, я просто поищу с моими суперспособностями tmux .
Да, вы теряете некоторые ярлыки, которые предоставляет vimdiff, но в общем случае для разрешения конфликтов требуется аккуратная вставка копий из обеих версий, что я могу сделать в обычном сеансе vim с маркерами конфликтов git.
Наблюдение и проверка файлов в то время как
vimdiff
работыПрежде чем я сел и автоматизировал мою идеальную установку с
cirosantilli-mergetool
, я делал то, что мне нужно, для получения двух различий.Пока
git mergetool
работаетvimdiff
, если есть конфликт с файлом, скажем, скажемmain.py
, git генерирует файлы для каждой из версий, названных как:в том же каталоге,
main.py
где1367
находится PID git mergetool и, следовательно, «случайное» целое число, как указано в: разделе В конфликте git merge, какие файлы BACKUP, BASE, LOCAL и REMOTE генерируются?Итак, чтобы увидеть
git status
нужные мне различия , я сначала нахожу сгенерированные файлы , а затем открываю новые терминалы и делаю vimdiff между парами файлов, которые мне нужны:Вместе с
git mergetool
, эта информация помогает МНОГО выяснить, что происходит быстро!Кроме того, даже когда работает mergetool, вы можете просто открыть файл:
непосредственно и отредактируйте его там, если вы чувствуете, что это будет легче с большим окном редактора.
Перейти непосредственно к конфликтам слияния
Хотя
]c
при переходе к следующей точке различия внутри vimdiff, не всегда возникает конфликт слияния.Чтобы помочь с этим, я имею в своем
~/.vimrc
:который находит конфликты напрямую.
мерзавец
Возможно, лучшим вариантом будет просто отказаться от использования vimdiff и положиться на обычный vim + git imerge, о котором говорилось в разделе : Как я могу узнать, какие коммиты Git вызывают конфликты? поскольку кривая обучения vimdiff раздражает, и она не выполняет те функции, которые нам нужны больше всего.
источник