Emacs에서 Git 충돌을 병합하는 방법


84

최근 Git 병합으로 인해 많은 충돌이 발생했습니다. 현재 접근 방식은 다음에 나타나는 '<<<'을 검색 한 다음 표준 텍스트 편집으로 병합을 수행하는 것입니다.

질문 : Emacs가 Git에서 제공하는 내 버전, 버전 및 파일의 기본 버전에 대한 정보를 사용하여 병합을 지원할 수있는 방법이 있습니까?


편집 :이 질문은 ediff를 호출하는 것으로 제한되지 않기 때문에이 관련 질문과 다른 범위를 갖습니다 .


7
Magit을 사용하는 경우 상태 버퍼를로드 한 다음 e충돌로 표시된 파일 을 누를 수 있습니다. Magit은 ediff병합을 시작 하고 나중에 변경 사항을 확인하라는 메시지를 표시 한 다음 병합 된 파일을 준비 할 수 있습니다.
wvxvw

@Beginner : 3 명의 다른 사람들은 그것이 중복이라고 생각했고, 나는 마지막 투표였습니다. 이유 : 인용 된 다른 스레드는 동일한 답변을 제공하고 ( smergevc-resolve-conflicton ediff및 on on ) 더 오래되었습니다. 그래도 첫 번째 스레드가 더 나은 제목을 사용할 수 있다는 데 동의합니다.
Dan

@Dan 나는 동의하지 않는다 : 그것은 다른 질문이며 그 대답은 비슷하다는 것이 그것을 바꾸지 않는다.
초보자

1
@ IqbalAnsari : 다른 스레드는 더 나은 제목이 필요하므로 사람들이 더 쉽게 찾을 수 있다고 생각합니다. 실제로 초보자의 스레드 제목이 좋을 것 같습니다. 그러나 사람들이이 스레드를 다시 열고 싶어하는지 조금만 기다려 보자. 그렇지 않다면 Beginner 's title로 첫 번째 스레드의 이름을 바꾸는 것을 선호합니다.
Dan

1
그리고 그것이 가치있는 것에 대해, 나는 이것이 좋은 대답을 가진 좋은 질문이라고 생각합니다. 그것은 또한 그것이 복제본이라고 생각합니다. 그러나 다른 사람들은 그 의견 (중복에 대해)을 공유하지 않을 수도 있습니다.
Dan

답변:


86

smerge-mode충돌 한 파일을 열어서 시도해 볼 수도 있습니다 M-xsmerge-modeRET. 충돌하는 모든 영역을 강조 표시합니다. 또한 키 바인딩을 추가하여 충돌을 쉽게 해결하고 문서 C-hfsmerge-modeRET를 참조하여 충돌 을 파악 하십시오 .

기본 접두사

smerge-mode C-c^성가신 기본 접두사를 찾아서 다음과 같이 변경했습니다. C-cv

(setq smerge-command-prefix "\C-cv")

중요한 키 바인딩

나에게 가장 중요한 바인딩은 다음과 같습니다.

smerge-nextsmerge-command-prefixn다음 분쟁으로 넘어갈 수밖에 없었습니다.

smerge-previoussmerge-command-prefixp이전의 분쟁으로 넘어갈 수밖에 없었습니다.

smerge-keep-currentsmerge-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에게 이것을 지적 해 주셔서 감사합니다)와 같습니다.

스머지 모드 자동 활성화

업데이트 : 다음은 이전 Emacs 버전에만 해당되며 25.1, 이후 버전에서는 문제가 발생할 수 있습니다. https://github.com/magit/magit/issues/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있습니까?
Malabarba

추가 설명은 해당주의 smerge-ediffvc-resolve-conflicts같은 일이다.
Phil

@ Malabarba 1) 나는 smerge-mode키 바인딩이 문서화되어 있다고 언급했다 . 어쩌면 나는 여기서 완전성을 위해 매뉴얼을 인용 할 수 있습니다. 피드백 주셔서 감사합니다. 2) v24.5를 사용하고 있지만 때로는 마스터 분기를 시도하지만 smerge가 자동으로 설정되는 것을 기억하지 못합니다 (최근 변경입니까?). 3) 대부분의 경우 이미 열려있는 버퍼에서 충돌이 발생하기 때문에 명시 적으로 설정해야합니다.smerge-mode
Iqbal Ansari

@IqbalAnsari는 smerge-mode항상 활성화 하지 않은 이유가 있습니까? 아마도 그것은 호출 될 때까지별로하지 않습니다.
PythonNut

@PythonNut 불행히도 좋은 질문입니다. 안타깝게도 항상 활성화 된 상태를 유지하려고 시도하지 않았으므로 시도해 볼 가치가 있습니다.
Iqbal Ansari

32

편집 :이 답변이 예상보다 더 많은 의견을 얻었으므로 조금 확장했습니다.

@IqbalAnsari의 답변을 보완하기 위해 사용할 수도 있습니다 vc-resolve-conflicts(다른 사람들이 언급했듯이의 별칭입니다 smerge-ediff). ediff인터페이스 가 시작 됩니다. 왼쪽에는 첫 번째 병합 부모가 있고 오른쪽에는 두 번째 병합 부모가 있습니다. 그들은 함께 modeline 줄에 표시되어 있습니다 MINEOTHER각각. 병합 된 버퍼는 아래와 같습니다 (스크린 샷 참조).

<code> ediff </ code> 인터페이스의 스크린 샷

키 바인딩

  • 와 ( n과) 의 충돌을 탐색 하십시오 p.
  • a또는로 버전수락하십시오b .
  • 조상/보십시오!
  • ediff 세션을 종료하십시오q .

other-window버전을 수락하는 것보다 충돌 해결이 더 복잡한 경우 병합 된 버퍼로 이동하여 직접 편집 할 수도 있습니다 . 완료되면 평소대로 버퍼를 저장하고 Emacs를 종료 할 수 있습니다. 더 많은 도움을 받으려면 세션 ?중에 사용 하면 ediff유용한 명령이 많이 있습니다. 나는 아직도 그들의 절반이 무엇인지 모른다!


2
이것이 가장 좋은 방법 IMO입니다. C-x v <실제로는 Magit으로 (wvxvw의 의견에 따라) 호출 할 가능성이 높지만 바운드되어 있습니다.
Phil

1
2000 년부터는에 vc-resolve-conflict대한 별칭 smerge-ediff으로, 이름에서 알 수 있듯이 Emerge 세션이 아닌 Ediff 세션을 시작합니다. 그건 그렇고, 라이브러리 헤더 의 영향 을 ediff.el인정 emerge.el하고 "현재 Ediff의 버전은 Emerge를 대체합니다. 그것은 우수한 사용자 인터페이스를 제공하며 Emerge에는없는 많은 주요 기능을 가지고 있습니다. 특히, 패치를 수행 할 수 있습니다. 양방향 및 3 방향 파일 비교, 병합 및 디렉토리 작업. "
tarsius

6
또한 내부적으로 magit-ediff-resolve( Em또는 e충돌이있는 파일에서) 사용 smerge-ediff됩니다. 그러나 ediff-quit-hook약간 더 나은 세션 마무리 경험을 제공하기 위해를 대체합니다 . "버퍼"(여러 버퍼가 있음)를 저장할 수 있다고 말하지 않고 버퍼 이름을 표시하면서 버퍼를 저장할 것인지 묻습니다.
tarsius

vimdiff와 같은 4 개의 창 (우리, 부모, 창, 작업 공간)을 표시하는 방법이 있습니까?
user1133275

9

Spacemacs를 사용하는 경우 가능한 모든 smerge 명령이 포함 된 히드라 메뉴를 표시하는 "smerge-transient-mode"를 활성화하는 것이 좋습니다.

이렇게하려면 spacemacs/smerge-transient-state/body기본적으로에 지정된 Mx를 호출하면 됩니다 SPC-g-r.

스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

파일 편집은 직관적이어야합니다.

  1. n다음 덩어리로 이동하려면 누릅니다 .
  2. 병합 조치를 선택하십시오 .
  3. 끝날 때까지 반복하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.