EmacsでGitの競合をマージする方法


84

私の最近のGitマージでは、多数の競合が発生しました。私の現在のアプローチは、「<<<」の次の出現を検索してから、標準のテキスト編集によってマージを実行することです。

質問:EmacsがGitのバージョン、バージョン、およびファイルのベースバージョンに関する情報を使用してマージをサポートできる方法はありますか?


編集:この質問は、ediffの呼び出しに限定されないため、この関連する質問とは異なる範囲を持ちます。


7
Magitを使用する場合は、ステータスバッファーをロードし、e競合していると表示されたファイルを押します。Magitが起動ediffしてマージを行い、その後、変更の確認を求めるプロンプトを表示してから、マージしたファイルをステージングできます。
wvxvw

@Beginner:他の3人が重複していると思い、私は最後の投票でした。理由:引用されている他のスレッドは同じ回答(smergeおよびvc-resolve-conflictediffさらには)を提供し、より長い間存在しています。ただし、最初のスレッドではより良いタイトルを使用できることに同意します。
ダン

@ダン私は同意しません:それは別の質問であり、答えが似ていることはそれを変えません。
初心者

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-nextsmerge-command-prefixn次の紛争に移動することにバインドされています。

smerge-previoussmerge-command-prefixp前の競合に移動するようにバインドされています。

smerge-keep-currentsmerge-command-prefixRETカーソルが置かれているバージョンを保持するためにバインドされています。

smerge-keep-minesmerge-command-prefixm変更を保持するためにバインドされています。

smerge-keep-othersmerge-command-prefixo他の変更を保持するためにバインドされています。

smerge-ediffsmerge-command-prefixE競合をマージするためにediffセッションを開始するようにバインドされています。これはvc-resolve-conflicts(これを指摘してくれた@philsと@Malabarbaに感謝します)と同じです。

smerge-modeを自動的に有効にする

更新: 以下は以前の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ですか?
マラバルバ

明確化のために、smerge-ediffvc-resolve-conflictsは同じものであることに注意してください。
phils

@Malabarba 1)私はsmerge-mode、キーバインドがドキュメントに記載されていることを言及しました。完全を期すために、ここでマニュアルを引用できるかもしれません。フィードバックをお寄せいただきありがとうございます。2) v24.5を使用していますが、masterブランチを時々試してみますが、smergeが自動的に有効になったことを覚えていません(最近の変更ですか?)。3)回のほとんどは私が明示的にオンにする必要があります。その場合には、既に開いているバッファ内の競合、得るためであるsmerge-mode
イクバルアンサリ

@IqbalAnsariはsmerge-mode、常に有効にしていない理由はありますか?おそらく、呼び出されるまではあまり機能しません。
PythonNut

@PythonNutいい質問、私はそれが、しかし試してみる価値はそのすべての時間を有効に維持しようとしたことがないので、残念ながら私は答えを持っていない
イクバルアンサリ

32

編集:この答えは私が予想よりも多くの賛成票を得たので、私はそれを少し拡大しました。

@IqbalAnsariによる回答を補足するために、vc-resolve-conflicts(他の人が述べたように、それはのエイリアスですsmerge-ediff)を使用することもできます。これにより、ediffインターフェースが開始されます。左側には最初のマージ親があり、右側には2番目のマージ親があります。それらは、モードライン上でMINEおよびでOTHERそれぞれラベル付けされています。マージされたバッファを以下に示します(スクリーンショットを参照)。

<code> ediff </ code>インターフェースのスクリーンショット

キーバインド

  • nおよびとの競合をナビゲートpます。
  • aまたはでバージョン受け入れますb
  • 祖先/
  • でediffセッションを終了qます。

マージされたバッファに移動してother-window、バージョンを受け入れるよりも競合の解決が複雑な場合に手動で編集することもできます。完了したら、通常どおりバッファーを保存してEmacsを終了できます。さらにヘルプを表示する?には、ediffセッション中に使用するだけで、非常に便利なコマンドがたくさんあります。私はまだ彼らの半分が何をするのか分かりません!


2
これがIMOの最も良い方法です。にバインドされていC-x v <ますが、実際にはMagitで呼び出す可能性が高くなります(wvxvwのコメントによる)。
phils

1
2000年vc-resolve-conflictはのエイリアスであるためsmerge-ediff、名前が示すとおり、EmergeセッションではなくEdiffセッションを開始します。ちなみに、ライブラリヘッダーはsの影響をediff.el認めemerge.el、「Ediffの現在のバージョンはEmergeに取って代わります。優れたユーザーインターフェイスを提供し、Emergにはない多数の主要な機能を備えています。特に、パッチを適用できます。 2方向および3方向のファイル比較、マージ、およびディレクトリ操作。」
タシウス

6
また、magit-ediff-resolveEmまたはe競合するファイル上で)smerge-ediff内部的に使用することに注意してください。ただし、これはをオーバーライドしediff-quit-hookて、わずかに優れたセッション終了エクスペリエンスを提供します。「バッファ」(いくつかのバッファがあります)を保存できると言う代わりに、(名前を表示しながら)バッファを保存するかどうかを尋ねます。
タジウス

vimdiffのような4つのウィンドウ(私たち、親、彼らの、ワークスペース)を表示する方法はありますか?
user1133275

9

Spacemacsを使用する場合は、「smerge-transient-mode」を有効にすることをお勧めします。これにより、すべての可能なsmergeコマンドを含むヒドラメニューが表示されます。

これを行うには、単にMxを呼び出しspacemacs/smerge-transient-state/bodyますSPC-g-r。これは、デフォルトでに割り当てられています。

スクリーンショットは次のとおりです。

ここに画像の説明を入力してください

ファイルの編集は直観的である必要があります。

  1. を押しnて次のハンクに移動します。
  2. マージアクションを選択します
  3. 完了するまで繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.