Як об’єднати конфлікти Git в Emacs


84

Моє недавнє злиття Git призвело до великої кількості конфліктів. Мій сучасний підхід полягає в пошуку наступного виникнення «<<<», а потім виконувати злиття за допомогою стандартного редагування тексту.

Питання : чи є спосіб Emacs підтримувати об’єднання, використовуючи інформацію, доступну в Git, про мою версію, їх версію та базову версію файлу?


Редагувати: це питання має інший обсяг, ніж це пов'язане питання , оскільки воно не обмежується викликом едіффа.


7
Якщо ви використовували Magit, ви можете завантажити буфер стану та натиснути eна файли, показані як конфліктні. Magit запустить ediffзлиття та запропонує вам підтвердити свої зміни, тоді ви можете встановити об'єднаний файл.
wvxvw

@Beginner: 3 інші люди думали, що це дублікат, і я був останнім голосуванням. Чому: інша цитована нитка дає ті самі відповіді ( smergeі vc-resolve-conflict, як і одна на ediff), і вже довше. Я погоджуюся, що перший потік міг би використовувати кращий заголовок.
Дан

@ Не погоджуюся: це інше питання, і відповідь схожа, це не змінює.
Початківець

1
@IqbalAnsari: Я думаю, що інший потік потребує кращого заголовку, щоб люди могли його легше знайти. Насправді, я думаю, що тема теми для початківців була б чудовою для цього. Однак зачекаємо ще трохи, щоб побачити, чи хочуть люди знову відкрити цю тему. Якщо ні, я б висловився за перейменування першої нитки з заголовком початківця.
День

1
І для чого це варто, я думаю, що це гарне питання з хорошими відповідями. Просто я також думаю, що це дублікат - але інші можуть не поділяти цю думку (щодо дублювання, тобто).
Дан

Відповіді:


86

Ви можете спробувати smerge-modeпросто відкрити конфліктний файл і зробити M-xsmerge-modeRET. Він виділить усі конфліктні регіони. Він також додає вкладиші для легкого вирішення конфліктів, проконсультуючись з його документацією, C-hfsmerge-modeRETщоб їх знати.

Префікс за замовчуванням

Я знаходжу префікс за замовчуванням для smerge-mode C-c^громіздкого, тому я змінив його на C-cv

(setq smerge-command-prefix "\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розпочати сеанс зведення для злиття конфліктів. Це те саме, що vc-resolve-conflicts(спасибі @phils та @Malabarba, що вказали на це).

Увімкнення режиму смережу автоматично

ОНОВЛЕННЯ: Наступне стосується лише попередніх версій Emacs 25.1, наведені нижче можуть спричинити проблеми з пізнішими версіями, див. Https://github.com/magit/magit/isissue/3897

Крім того, вас може зацікавити автоматичне включення, smerge-modeвідвідуючи файл / буфер з маркерами конфлікту, ви можете використовувати щось подібне для досягнення цього

(defun my-enable-smerge-maybe ()
  (when (and buffer-file-name (vc-backend buffer-file-name))
    (save-excursion
      (goto-char (point-min))
      (when (re-search-forward "^<<<<<<< " nil t)
        (smerge-mode +1)))))

(add-hook 'buffer-list-update-hook #'my-enable-smerge-maybe)

Зауважте, що я використовую, buffer-list-update-hookі не find-file-hookтому, що більшість випадків я отримую конфлікти в буфері, який вже відкритий у emacs, і в цьому випадку find-file-hookне допомагає.

Перевірте також інші методи, згадані в цій відповіді


1
(1) Не забувайте smerge-ediff. (2) На якій версії ви працюєте Emacs? У поточній головній гілці emacs smerge включається автоматично. (3) Для чого ви використовуєте buffer-list-update-hookзамість find-file-hook?
Малабарба

Для додаткового уточнення зверніть увагу, що це smerge-ediffі vc-resolve-conflictsте саме.
філс

@Malabarba 1) Я вже згадував, що зв'язки ключів smerge-modeзафіксовані в його документації. Можливо, я можу процитувати тут посібник для повноти. Дякуємо за відгук. 2) Я перебуваю на v24.5, хоча іноді я випробовую головну гілку, я не пам’ятаю, щоб смерг автоматично повертався (це нещодавні зміни?). 3) Це тому, що більшість випадків у мене виникають конфлікти у вже відкритих буферах, і в цьому випадку мені потрібно буде явно ввімкнутиsmerge-mode
Iqbal Ansari

@IqbalAnsari Чи є якась причина, щоб не smerge-modeвмикати весь час? Можливо, це не робить багато, поки не викликається.
PythonNut

@PythonNut Добре запитання, на жаль, у мене немає відповіді, оскільки я ніколи не намагався тримати це ввімкненим, але варто спробувати, хоча
Iqbal Ansari

32

Редагувати: оскільки ця відповідь отримала більше результатів, ніж я очікувала, я її трохи розширив.

Щоб доповнити відповідь від @IqbalAnsari, ви також можете використати vc-resolve-conflicts(як згадують інші, це псевдонім smerge-ediff). Це запустить ediffінтерфейс. Зліва буде перший батьківський злиття, а другий батьківський злиття праворуч. Вони позначені на моделі з відповідно MINEі OTHERвідповідно. Злитий буфер показаний нижче (див. Скріншот).

Скріншот інтерфейсу <code> ediff </code>

Клавіатури

  • Переміщення по конфліктам із nта p.
  • Прийняти версії з aабо b.
  • Подивіться на предка с /!
  • Закрийте сеанс зведення q.

Ви також можете перейти до об'єднаного буфера other-windowі вручну відредагувати, якщо вирішення конфлікту складніше, ніж прийняття версії. Закінчивши, ви можете зберегти буфер і вийти з Emacs як завжди. Для отримання додаткової допомоги, просто використовуйте ?під час ediffсеансу, там є ціла купа дуже корисних команд. Я досі не знаю, що половина з них робить!


2
Це найприємніший метод ІМО. Я це зобов’язав C-x v <, хоча на практиці я частіше посилаюся на це з Magit (відповідно до коментаря wvxvw).
філс

1
Оскільки 2000 рік vc-resolve-conflictє псевдонімом smerge-ediff, який, як випливає з назви, починає сесію Едіффа, а не сесію Emerge. До речі, заголовок бібліотеки ediff.elвизнає emerge.elвплив, а потім продовжує говорити: "Ця версія Ediff заміняє Emerge. Вона забезпечує чудовий інтерфейс користувача та має численні основні функції, які не знайдені в Emerge. Зокрема, він може виконувати виправлення, і Двостороння і тристороння порівняння файлів, об'єднання та операції з каталогами. "
Тарсій

6
Також зауважте, що magit-ediff-resolve( Emабо eу файлі з конфліктами) використовується smerge-ediffвнутрішньо. Це, однак, перекриває, ediff-quit-hookщоб забезпечити трохи кращий досвід обробки сесії. Замість того, щоб сказати вам, що ви можете зберегти "буфер" (є кілька буферів), він запитує, чи хочете ви зберегти буфер (показуючи вам його ім'я).
Тарсій

Чи є спосіб показати 4 вікна (наше, батьківське, їхнє, робоче поле), як vimdiff?
користувач1133275

9

Якщо ви випадково використовуєте Spacemacs, я рекомендую активувати "smerge-tranzient-mode", який відображає меню гідра з усіма можливими командами smrge.

Для цього просто зателефонуйте на Mx spacemacs/smerge-transient-state/body, який визначено за замовчуванням SPC-g-r.

Ось скріншот:

введіть тут опис зображення

Редагування файлу має бути інтуїтивно зрозумілим:

  1. Натисніть, nщоб перейти до наступної частини.
  2. Виберіть дію злиття .
  3. Повторіть до готовності.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.