中に衝突が発生すると、 Meldgit merge
というマージツールを開きます。LOCAL、BASE、REMOTEの3つのファイルを開きます。LOCALは私のローカルブランチであると読んだので、BASEは共通の祖先であり、REMOTEはマージされるブランチです。
今私の質問に:ファイルのどのバージョンが最終的に使用されますか?REMOTEですか?もしそうなら、例えばBASEブランチに何があるかに関係なく、私はそれを好きなように編集できますか?
真ん中のものです:BASE
。
実際、は共通の祖先ではありませんが、競合がとBASE
でマークされている半完成のマージです。>>>>
<<<<
ファイル名は、メルド編集ウィンドウの上部に表示されます。
BASE
meldコマンドを使用して、または使用せずに、必要に応じてファイルを編集できます。
また、meldを削除して、お気に入りのテキストエディタでファイルを編集することもできます。
<<<< HEAD
と=====
マーカーの間のコードは、マージ前のローカルファイルの1つです。====
との間のコード>>>> <branch name>
は、リモートファイルの1つです。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
関係する4つのファイルがあります:
$LOCAL
マージするブランチ上のファイル。表示されたときにマージプロセスの影響を受けません
$REMOTE
マージする場所からのブランチ上のファイル。表示されたときにマージプロセスの影響を受けません
$BASE
$LOCALと$REMOTEの共通の祖先。2つのブランチが検討対象のファイルの迂回を開始したポイント。表示されたときにマージプロセスの影響を受けません
$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
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
Meld 1.7では、TomekBuryによるソリューションは機能しなくなりました。
デフォルト設定は私を満足させませんでした:
Meld> = 1.7の代わりに、他の2つの解決策のいずれかを提案します。
最初の解決策:
meld $LOCAL $BASE $REMOTE --auto-merge
2番目の解決策:
meld $LOCAL $MERGED $REMOTE
.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
表示されているデフォルトのファイルがどれも保存されていないことがわかりました。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
何らかの理由で、最新バージョンのmeldは、競合のために追加されたマーカー行を表示しません(<<<<<<<、=======、>>>>>>>)。これらの行を見たい場合は、meldv1.3.3以前をインストールする必要があります。
正解については、Saadの回答をご覧ください。
Ubuntuのmeld1.8.1で私は
--diffに指定された引数の数が間違っています
$ MERGEDが修正する前に--outputを追加すると、次のようになります。
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED