git merge
中に衝突があったとき、 Meld と呼ばれるmergetoolを開きます。 LOCAL、BASE、REMOTEの3つのファイルを開きます。 LOCALを読んだのは私のローカルブランチであり、BASEは共通の祖先であり、REMOTEはマージするブランチです。
ここで私の質問に答えてください。ファイルのどのバージョンが最終的に使用されるのでしょうか?リモートですか?その場合、たとえばBASEブランチの内容に関係なく、必要に応じて編集できますか?
真ん中にあるのはBASE
です。
実際、BASE
は共通の祖先ではなく、競合が>>>>
および<<<<
でマークされている半完成マージです。
メルド編集ウィンドウの上部にファイル名が表示されます。
Meldコマンドを使用してもしなくても、BASE
ファイルを必要に応じて編集できます。
meldを削除して、お気に入りのテキストエディタでファイルを編集することもできます。
<<<< HEAD
マーカーと=====
マーカーの間のコードは、マージ前のローカルファイルのコードです。====
と>>>> <branch name>
の間のコードは、リモートファイルのコードです。Meldには非表示の3方向マージ機能があり、4番目のパラメーターを渡すことでアクティブになります。
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つ目のタブにマージしようとしている単純な差分が含まれる)が開き、3つ目のタブ(デフォルトで開く)に3方向のマージビューが表示されます。
今、この機能が隠されている理由は、まだ十分に洗練されていないからです。現在は非常に便利ですが、メルドの作者であるカイ・ウィラドセンは、アイロンをかける必要のあるいくつかのしわを指摘しました。たとえば、3者間マージモードを開始するGUIはありません。コマンドラインの構文は少し難解です。 pythonを話し、しばらく時間があれば-何をすべきか知っています。
編集:Meldの新しいバージョンでは、synaxがわずかに変更されました。これはコメントにありましたが、答えに属します。
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
ファイルは、<<<<<<
、>>>>>>
、=====
(および、おそらく||||||
)マーカー(競合を区切る)を含むファイルです。 Thisは、競合を修正するために編集するファイルですmanually.
手動の競合編集と視覚的な競合編集は異なるファイルで行われ、異なる情報を提示しました。
Mergetoolを使用する場合(meld
を想定)、そこに表示されるファイルは$LOCAL
、$BASE
、$REMOTE
です。 $MERGED
ファイルは表示されないことに注意してください。ただし、これは隠しパラメーターとしてmeld
に渡され、そこに編集結果が書き込まれます。
つまり、meld
では、中央のファイル$BASE
ファイルを編集しており、すべての変更を左または右から選択します手動。これはクリーンなファイルであり、マージプロセスの影響を受けません。唯一の問題は、保存するときに$BASE
ファイルに保存せず、meld
の4番目の非表示パラメーター、つまり$MERGED
ファイルに保存することです(表示されません)。 $BASE
ファイルにはnotが含まれています。これは$MERGED
ファイルではないであるため、競合または部分的に成功したマージが含まれています。
ビジュアル編集では、($BASE
ファイルの代わりに)$MERGED
ファイルを提示すると、git
は基本的にマージを試みるすべての試行を破棄し(必要に応じて、$ MERGEDファイルに表示されます)- 完全にマージを行います最初から。
一番下の行は、手動と視覚のマージの競合では同じファイルを見ていませんが、最終結果は同じファイル(つまり$MERGED
ファイル)に書き込まれます。
競合の手動修正は$MERGED
で行われます。これは、git
意味がないが3つのファイルを提示するため、その$LOCAL
ファイルの3つのファイル($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を使用すると、Tomek Buryによるソリューションは機能しなくなります。
デフォルト設定は私を満足させませんでした:
代わりに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
、$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は、競合(<<<<<<<< =======、>>>>>>>)に追加されたマーカー行を表示しません。これらの行を表示する場合は、meld v 1.3.3以前をインストールする必要があります。
正しい答えについては、Saadの答えをご覧ください。
Ubuntuのmeld 1.8.1では、
--diffに指定された引数の数が間違っています
そして、$ MERGEDの前に--outputを追加して修正しました:
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED