Мое недавнее слияние Git привело к большому количеству конфликтов. Мой текущий подход заключается в поиске следующего вхождения «<<<», а затем выполнить слияние с помощью стандартного редактирования текста.
Вопрос : есть ли способ, которым Emacs может поддерживать слияние, используя информацию, доступную в Git, о моей версии, их версии и базовой версии файла?
Изменить: этот вопрос имеет другую область, чем этот связанный вопрос , так как он не ограничивается вызовом ediff.
e
на файлы, показанные как конфликтующие. Magit запуститediff
процесс слияния и предложит вам подтвердить изменения, после чего вы сможете создать объединенный файл.smerge
иvc-resolve-conflict
, как и один наediff
) и была дольше. Я согласен с тем, что первая тема может использовать лучший заголовок.Ответы:
Вы можете попробовать
smerge-mode
просто открыть конфликтующий файл и сделать M-xsmerge-mode
RET. Здесь будут освещены все конфликтующие регионы. Он также добавляет сочетания клавиш, чтобы легко разрешать конфликты, ознакомьтесь с документацией, C-hfsmerge-mode
RETчтобы узнать их.Префикс по умолчанию
Я нахожу префикс по умолчанию для
smerge-mode
C-c^громоздких, поэтому я изменил его на C-cvВажные сочетания клавиш
Для меня самые важные привязки:
smerge-next
обязан smerge-command-prefixnперейти к следующему конфликту.smerge-previous
обязан smerge-command-prefixpперейти к предыдущему конфликту.smerge-keep-current
обязан smerge-command-prefixRETсохранить версию, в которой находится курсор.smerge-keep-mine
обязан smerge-command-prefixmсохранить ваши изменения.smerge-keep-other
обязан smerge-command-prefixoсохранить другие изменения.smerge-ediff
обязан smerge-command-prefixEначать сеанс ediff, чтобы объединить конфликты. Это так же, какvc-resolve-conflicts
(спасибо @phils и @Malabarba за то, что указал на это).Включение режима smerge автоматически
ОБНОВЛЕНИЕ: Следующее относится только к предыдущим версиям Emacs
25.1
, следующее может вызвать проблемы в более поздних версиях, см. Https://github.com/magit/magit/issues/3897Кроме того, вам может быть интересно автоматическое включение
smerge-mode
при посещении файла / буфера с маркерами конфликта, вы можете использовать что-то вроде следующего для достижения этой целиОбратите внимание, что я использую,
buffer-list-update-hook
и нет,find-file-hook
так как в большинстве случаев я получаю конфликты в буфере, который уже открыт в Emacs, и в этом случаеfind-file-hook
это не поможет.Также проверьте другие методы, упомянутые в этом ответе
источник
smerge-ediff
. (2) На какой версии Emacs вы работаете? В текущей основной ветке emacs smerge включается автоматически. (3) Почему вы используетеbuffer-list-update-hook
вместоfind-file-hook
?smerge-ediff
иvc-resolve-conflicts
это одно и то же.smerge-mode
сочетания клавиш документированы в документации. Возможно я могу процитировать руководство здесь для полноты. Спасибо за ответ. 2) Я нахожусь на v24.5, хотя иногда я пробую основную ветку, я не помню, чтобы smerge поворачивался автоматически (это недавнее изменение?). 3) Это потому, что в большинстве случаев я получаю конфликты в уже открытых буферах, и в этом случае мне нужно явно включитьsmerge-mode
smerge-mode
все время? Возможно, это не так много, пока не будет вызвано.Изменить: так как этот ответ получил больше голосов, чем я ожидал, я немного расширил его.
Чтобы дополнить ответ @IqbalAnsari, вы также можете использовать
vc-resolve-conflicts
(как уже упоминалось, это псевдонимsmerge-ediff
). Это запуститediff
интерфейс. Слева будет первый родитель слияния, а второй родитель слияния справа. Они помечены на моделине сMINE
иOTHER
соответственно. Объединенный буфер показан ниже (см. Скриншот).Сочетания клавиш
Вы также можете перейти к объединенному буферу
other-window
и отредактировать вручную в случае, если разрешение конфликта более сложно, чем принятие версии. Когда вы закончите, вы можете сохранить буфер и выйти из Emacs как обычно. Для получения дополнительной помощи, просто используйте ?во времяediff
сеанса, там есть целый ряд очень полезных команд. Я до сих пор не знаю, что половина из них делает!источник
C-x v <
, хотя на практике я с большей вероятностью буду вызывать его с помощью Magit (согласно комментарию wvxvw).vc-resolve-conflict
является псевдонимом дляsmerge-ediff
, который, как следует из названия, начинает сеанс Ediff, а не сеанс Emerge. Кстати, заголовок библиотекиediff.el
подтверждаетemerge.el
влияние s, а затем продолжает: «Текущая версия Ediff заменяет Emerge. Он предоставляет превосходный пользовательский интерфейс и имеет множество основных функций, которых нет в Emerge. В частности, он может выполнять исправления и Двухстороннее и трехстороннее сравнение файлов, слияние и операции с каталогами. "magit-ediff-resolve
(Em
илиe
для файла с конфликтами) используетсяsmerge-ediff
внутренне. Это, однако, переопределяет,ediff-quit-hook
чтобы обеспечить немного лучший опыт завершения сеанса. Вместо того, чтобы сказать вам, что вы можете сохранить «буфер» (есть несколько буферов), он спрашивает вас, хотите ли вы сохранить буфер (показывая вам его имя).Если вы используете Spacemacs, я бы порекомендовал активировать «smerge-transient-mode», который вызывает меню гидры со всеми возможными командами smerge.
Для этого просто вызовите Mx
spacemacs/smerge-transient-state/body
, который по умолчанию назначен дляSPC-g-r
.Вот скриншот:
Редактирование вашего файла должно быть интуитивно понятным:
n
чтобы перейти к следующему фрагменту.источник