180

中に衝突が発生すると、 Meldgit mergeというマージツールを開きます。LOCAL、BASE、REMOTEの3つのファイルを開きます。LOCALは私のローカルブランチであると読んだので、BASEは共通の祖先であり、REMOTEはマージされるブランチです。

今私の質問に:ファイルのどのバージョンが最終的に使用されますか?REMOTEですか?もしそうなら、例えばBASEブランチに何があるかに関係なく、私はそれを好きなように編集できますか?

4

8 に答える 8

144

真ん中のものです:BASE

実際、は共通の祖先ではありませんが、競合がとBASEでマークされている半完成のマージです。>>>><<<<

ファイル名は、メルド編集ウィンドウの上部に表示されます。

こちらのスクリーンショットをご覧ください

メルドベース

BASEmeldコマンドを使用して、または使用せずに、必要に応じてファイルを編集できます。
また、meldを削除して、お気に入りのテキストエディタでファイルを編集することもできます。

  • <<<< HEAD=====マーカーの間のコードは、マージ前のローカルファイルの1つです。
  • ====との間のコード>>>> <branch name>は、リモートファイルの1つです。
于 2012-06-21T12:40:09.353 に答える
109

Meldには、4番目のパラメーターを渡すことによってアクティブ化される非表示の3方向マージ機能があります。

meld $LOCAL $BASE $REMOTE $MERGED

右ペインと左ペインは読み取り専用モードで開かれるため、誤って間違った方法でマージすることはできません。中央のペインには、マージの結果が表示されます。競合については、基本バージョンが表示されるため、すべての重要なビットを確認できます。中央に元のテキストがあり、両側に競合する変更があります。最後に、[保存]ボタンを押すと、$MERGEDファイルが書き込まれます-gitが期待するとおりです。

私が使用する〜/ .gitconfigファイルには、次の設定が含まれています。

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

これにより、マージしようとしている単純な差分を含む3つのタブ(1番目と2番目のタブ)でmeldが開き、デフォルトで開いている3番目のタブに3方向のマージビューが表示されます。

さて、機能が隠されている理由は、まだ十分に洗練されていないためです。今のようにとても便利ですが、メルドの作者であるカイ・ウィラドセンは、アイロンがけが必要ないくつかのしわを指摘しました。たとえば、3方向マージモードを開始するためのGUIがない、コマンドライン構文が少し難解であるなどです。あなたがPythonを話し、あなたの手にしばらく時間があれば-あなたは何をすべきかを知っています。

編集:Meldの新しいバージョンでは、シナックスがわずかに変更されています。これはコメントにありましたが、答えに含まれています。

meldコマンドは--outputオプションを使用するようになったため、上記のスニペットの最後の行は次のようになります。

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
于 2012-09-19T09:36:30.483 に答える
63

関係する4つのファイルがあります:

  1. $LOCALマージするブランチ上のファイル。表示されたときにマージプロセスの影響を受けません

  2. $REMOTEマージする場所からのブランチ上のファイル。表示されたときにマージプロセスの影響を受けません

  3. $BASE$LOCALと$REMOTEの共通の祖先。2つのブランチが検討対象のファイルの迂回を開始したポイント。表示されたときにマージプロセスの影響を受けません

  4. $MERGED競合のある、部分的にマージされたファイル。これは、マージプロセスによって影響を受ける唯一のファイルであり、実際には、meld


この$MERGEDファイルは<<<<<<、(および、場合によっては>>>>>>)マーカー(競合を区切る)を含むファイルです。これは、競合を修正するために手動で編集するファイルです。=====||||||

手動の競合編集と視覚的な競合編集は、異なるファイルで実行され、異なる情報が表示されます。

mergetool(仮定meld)を使用する場合、そこに表示されるファイルは$LOCAL、、、$BASEです$REMOTE。ファイルは表示されないことに注意してください。ただし、これは、編集の結果をそこに書き込むため$MERGEDの非表示のパラメーターとして渡されます。meld

つまり、ではmeld、中央のファイル、ファイルを編集しており、$BASEすべての変更を左または右から手動で選択します。これはクリーンなファイルであり、マージプロセスの影響を受けません。唯一の不具合は、保存するときにファイルに保存しないことです$BASEが、の4番目の非表示パラメーターでmeldある$MERGEDファイルです(表示されません)。$BASEファイルはファイルでないため、競合や部分的に成功したマージは含まれていませ$MERGED

ビジュアル編集では、$BASE(ファイルではなく$MERGED)ファイルを提示すると、git基本的にマージを実行しようとするすべての試行が破棄され(必要に応じて、これらの試行は$ MERGEDファイルに表示されます)、完全にマージを実行できます。ゼロから

肝心なのは、手動と視覚的なマージの競合では、同じファイルを見ていませんが、最終的な結果は同じファイル(つまり$MERGEDファイル)に書き込まれるということです。

競合の手動修正は、 3つのファイルを提示する意味がない$MERGEDために実行されます。そのため、そのファイル内の3つのファイル(、、)からの情報が押しつぶされます。git $LOCAL$BASE$REMOTE$MERGED

ただし、ビジュアルツールには、 3つのファイルを表示する手段があります。 $LOCAL、、、ファイルを表示します。とファイルから変更を選択し、それらをファイルに取り込み、完全に再構築し、失敗したファイルのマージの試みを上書きします。$BASE$REMOTE$LOCAL$REMOTE$BASE$MERGED

于 2013-08-02T07:33:32.267 に答える
16

Cosminのソリューションは機能しますが、$BASEファイルは更新されます。 $MERGEDではありません。これにより、 $MERGEDファイルが更新されます。

メルド:v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
于 2014-03-06T07:28:15.570 に答える
13

Meld 1.7では、TomekBuryによるソリューションは機能しなくなりました。

デフォルト設定は私を満足させませんでした:

デフォルトの設定

Meld> = 1.7の代わりに、他の2つの解決策のいずれかを提案します。

最初の解決策

 meld $LOCAL $BASE $REMOTE --auto-merge

最初の解決策

2番目の解決策

 meld $LOCAL $MERGED $REMOTE

2番目の解決策

.gitconfig

これをコピーして.gitconfigファイルに貼り付けると、上記の解決策が得られます。

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

.gitconfig.local複数のマシンで.gitconfigを使用する場合は、これをコピーしてファイルに貼り付け、このマシンに対してのみmeld17またはmeld16を設定します。

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17
于 2014-04-07T11:59:16.363 に答える
11

表示されているデフォルトのファイルがどれも保存されていないことがわかりました。meldが表示されていましたが$LOCAL、デフォルトでは。それを機能させるには、の代わりにmeldshowを作成する必要がありました。これを私の修正に入れると、次のようになります。$REMOTE$BASE$MERGED$BASE~/.gitconfig

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

私はArchを使用しています。

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
于 2013-03-22T17:11:34.267 に答える
2

何らかの理由で、最新バージョンのmeldは、競合のために追加されたマーカー行を表示しません(<<<<<<<、=======、>>>>>>>)。これらの行を見たい場合は、meldv1.3.3以前をインストールする必要があります。

于 2013-09-04T19:02:26.000 に答える
2

正解については、Saadの回答をご覧ください。

Ubuntuのmeld1.8.1で私は

--diffに指定された引数の数が間違っています

$ MERGEDが修正する前に--outputを追加すると、次のようになります。

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
于 2014-03-05T15:08:32.830 に答える