28

対立に遭遇したとき、git-mergetoolそれを解決するために使用しようとしました。私が入力した:

>git mergetool -t vimdiff

vimdiff3wayではなく4wayで開きました。vimdiff の分割ウィンドウは次のようになります。

:ls
  1 #a   "Gemfile.lock"                 line 1
  2 %a   "Gemfile.lock.LOCAL.4828.lock" line 1
  3  a   "Gemfile.lock.BASE.4828.lock"  line 0
  4  a   "Gemfile.lock.REMOTE.4828.lock" line 0

彼らは何ですか?ターゲット ファイル、マージ ファイル、作業ファイルの 3 方向の diff が必要です。git または vimdiff をどのように構成すればよいですか?

4

5 に答える 5

35

別の方法として、 fugitiveを使用することを考えましたか?

私はあなたに嘘をつくつもりはありません。fugitive.vim は、これまでで最高の Git ラッパーかもしれません。

Drew Neil による優れた vimcast であるFugitive.vim - resolving merge conflicts with vimdiff があります。これは、逃亡者に関するシリーズの一部です。

Vimcasts Web サイトは、vim について詳しく知るのに適した場所です。

mergetool として逃亡者を使用するには、次を使用できます。

git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive

注:またはに変更vimすることもできます。mvimgvim

Fugitive は単なるマージ ツール スクリプトではありません。ドキュメントを読んだり、vimcast を確認したりしてください。

于 2011-09-06T00:46:22.807 に答える
9

vimdiff と 3 つのウィンドウのみで mergetool を発行するための多くの調査の後、3 つのウィンドウまたはデフォルトの 4 つのウィンドウが必要なときに選択できるようにする、次の構成を思い付きました。

git config --global merge.tool vimdiff
git config --global alias.mt mergetool

git config --global mergetool.merge3.cmd 'vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'
git config --global alias.m3 'mergetool -t merge3'

次のように入力するだけで、3 つのウィンドウを起動できます。

git m3

デフォルト (4 ウィンドウ) は、次の場合でも期待どおりに動作します。

git mt

また、おそらくこの行をあなたの~/.vimrcまたはの最後に追加したいと思うでしょう。/etc/vim/vimrc

 " shortcuts to vimdiff
 let mapleader=','
 let g:mapleader=','

 if &diff
    map <leader>1 :diffget LOCAL<CR>
    map <leader>2 :diffget BASE<CR>
    map <leader>3 :diffget REMOTE<CR>
 endif

,1これにより、左,3からグラブする、右からグラブする (両方のモードで) ,2、4 ウィンドウ モードでベース (中央のウィンドウ) からグラブするなどのショートカットが作成されます。

それは大いに役立ちます!

私の~/.gitconfigファイルは次のようになります。

[user]
        name = Dr Beco
        email = my@email
[merge]
        tool = vimdiff
[mergetool "merge3"]
        cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
[alias]
        lo = log --pretty=format:\"%h %ce %cd %s\" --graph
        co = checkout
        ci = commit
        cm = commit -a -m
        st = status
        br = branch
        m3 = mergetool -t merge3
        mt = mergetool
[diff]
        tool = vimdiff

これがあなた(そしてここにたどり着いた人)に役立つことを願っています。

于 2013-11-05T01:42:41.167 に答える
5

このページのコマンドを少し変更:

git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
  • 「マージ済み」が作業コピーになります。
  • 変更しようとしているブランチにあるファイルを「ローカル」にします
  • マージしようとしているブランチからファイルを「リモート」します。

次に、次のコマンドを実行しますgit mergetool

逃亡者も使用しており、強くお勧めします。

于 2011-09-06T14:43:44.600 に答える
5

注: Dr Beco回答
( vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"') で説明されているように 3 つの Windows しか使用できませんが
、4-windows モードは git 2.8 (2016 年 3 月)で強化されています。

Dickson Wong ( )によるcommit 2300328 (2016 年 1 月 29 日)を参照してください。( 2016 年 2 月 17 日コミット 82c17b7Junio C Hamanoによってマージされました)diwo
gitster

" "のvimdiffバックエンドはgit mergetool、左から右に読み、次に上から下に読み、バッファー 1 2 3 4 を "精神的に" ローカル ベースのリモート マージ ウィンドウに割り当てるという大多数の人々の期待に一致する順序でバッファーを配置し、番号を付けるように調整されています。その順番に基づいています。

内部的に、git は以下を使用するようになりました。

"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
            "$LOCAL" "$BASE" "$REMOTE" "$MERGED"

それ以外の:

"$merge_tool_path" -f -d -c 'wincmd J' \
        "$MERGED" "$LOCAL" "$BASE" "$REMOTE"

mergetool: 3 方向の差分で vim/gvim バッファーを並べ替えます

デフォルト (g)vimdiffの 3 方向マージを呼び出すと、マージされたファイルは最初のバッファーとして読み込まれますが、4 番目のウィンドウとして一番下に移動されます。これにより、ウィンドウ位置を操作するコマンド (例: - ) とバッファー インデックスを操作するコマンド (例: / )
が切断されます。vimCTRLW_wdodp

この変更により、ウィンドウと同じインデックスを持つようにバッファーが並べ替えられますが、カーソルのデフォルトはマージされた結果が下部ウィンドウとして保持されます。


Git 2.31 (2021 年第 1 四半期) では、mergetools は 4 つではなく 3 つのパネルのみを考慮するのに役立ちます。

Seth House ( )によるcommit 30bb808 (2021 年 2 月 13 日)を参照してください。( 2021 年 2 月 25 日コミット cadae71Junio C Hamanoによってマージされました)whiteinge
gitster

mergetools/vimdiff: vimdiff1 マージ ツール バリアントを追加

署名者: Seth House
テスト者: David Aguilar

これにより、さらに別の vimdiff/gvimdiff バリアントが追加され、競合が「LOCAL」と「REMOTE」の間の双方向の差分として表示されます。
'MERGED' は開かれておらず、標準から逸脱しているため、使用法テキストが起動時に Vim メッセージとしてエコーされ、ユーザーに続行方法と中止方法を指示します。

Vimdiff は双方向の差分に適しているため、これはより単純で効率的な競合解決のオプションです。
たとえば、構文の強調表示のみを使用して、3 つ以上のファイル間で違いを伝えることは困難です。バッファー間で変更を取得および配置するためのデフォルトの vimdiff コマンドでは、2 つのバッファーのみを使用する場合、ユーザーがソースまたは宛先バッファーを手動で指定する必要はありません。

「LOCAL」と「REMOTE」を直接比較する他のマージ ツールと同様に、このツールは新しいmergetool.hideResolved設定と組み合わせると効果的です。

于 2016-02-18T13:02:42.457 に答える
4

私は逃亡者の推薦を支持します。

splice.vimを試すこともできます。これは、Git または Mercurial のマージツールのドロップイン代替として機能するように設計された Vim プラグインです。これにより、紛争のさまざまなビューを簡単にシャッフルできます。また、非常に迅速で簡単で、マージをより直感的にするのに適しています。これがスクリーンキャストです。

リストしたファイルは次のとおりです。

  1. 競合を含むローカル ファイル。
  2. マージ先のブランチ内のファイル。
  3. マージ元のブランチ内のファイル。
  4. 両方のブランチの祖先ノードにあったファイル。このファイルは、何が起こっているのかを理解するのに非常に役立ちます!

お役に立てれば。

于 2011-09-06T08:34:02.290 に答える