回答:
真ん中です:BASE
。
実際には、BASE
共通の祖先が、競合がでマークされている半マージではない>>>>
と<<<<
。
meld編集ウィンドウの上部にファイル名が表示されます。
BASE
meldコマンドを使用して、または使用せずに、必要に応じてファイルを編集できます。
meldを削除して、お好みのテキストエディタでファイルを編集することもできます。
<<<< HEAD
と=====
マーカー間のコードは、マージ前のローカルファイルのコードです。====
および>>>> <branch name>
リモートファイルの一つです。HEAD
、<<<<<
および=====
兆候を、それはまったくの競合がないことを意味します。この場合、中央のウィンドウは空ではなく、マージ結果が表示されますが、「赤い」部分はありません
<<<<<<
、======
でも>>>>>>
どちらかの中央のペインにあるマーカー(すなわちBASEバージョン)。そして、時々、aGrが報告するように、中央のペインは空になります。たぶん、この違いは設定の違いが原因です。私はメルドツールを起動すると、次のファイルは、リポジトリ内のファイルの名前があると仮定して、存在しますX.java
:X.java
、X.java.orig
、X.java.BACKUP.#
、X.java.BASE.#
、X.java.LOCAL.#
、X.java.REMOTE.#
、どこ#
いくつかの数です。マージ結果を呼び出すと、BASEバージョンは混乱します。マージされた方が良いでしょう。
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
これは、マージしようとしている単純なdiffを含む3つのタブ、1番目と2番目のタブでmeldを開きます。デフォルトで開いている3番目のタブは、3者間マージビューを示します。
現在、機能が非表示になっているのは、まだ十分に洗練されていないためです。現在のように非常に便利ですが、メルドの作成者であるカイウィラドセンは、アイロンをかける必要のあるしわをほとんど指摘していませんでした。たとえば、3ウェイマージモードを開始するGUIはありません。コマンドライン構文は少し難解です。あなたがパイソンを話し、あなたの手に少し時間があるならば-あなたは何をすべきか知っています。
編集:Meldの新しいバージョンでは、synaxがわずかに変更されました。これはコメントにありましたが、回答に含まれています。
meldコマンドは--outputオプションを使用するようになったため、上記のスニペットの最後の行は次のようになります。
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
--output option
。:起動スクリプトに次の行を参照してください"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
です。したがって、これは3つのタブを開き(古き良き方法)、競合しないマージを中央に自動マージします(中央は$ MERGEDであり、競合解決の出力として使用されます)。
--output=<file>
またはです-o <file>
。参照meld --help
関連する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
ファイル)に書き込まれます。
競合の手動補正が上で行われている$MERGED
ので、git
何の平均値がありませんので、それは三つのファイル(からの情報カボチャ、あなたに3つのファイルを提示することを$LOCAL
、$BASE
、$REMOTE
という点で)$MERGED
ファイルを。
しかし、視覚的なツールが用い持って次の3つのファイルを表示するために:彼らはあなたを示し$LOCAL
、$BASE
、$REMOTE
ファイル。$LOCAL
と$REMOTE
ファイルから変更を選択し、それらを$BASE
ファイルに取り込み、完全に再構築して、失敗した$MERGED
ファイルであるマージの試みを上書きします。
$LOCAL
、$REMOTE
、$BASE
および出力は最初に等しい$BASE
が、異なっています$MERGED
、それは上のファイルや衝突マーカなどをマージするgitのの試みを持っていないことに。実際、これらのツールを使用する方法は、マージされていないLOCAL / REMOTE / BASE + OUTPUTの3ペインアプローチに最も似ています。4番目のペインでは、出力からベースを分離することができます。
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
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
最後に必要になるのですか?1.8.4上の私にとって、これは(私の知る限り)の罰金を動作します:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
メルド1.7 Tomekによってソリューションはもう動作しませんベリー。
デフォルトの設定は、私を満たしていませんでした。
代わりに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
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
と、中央のペインは$ BASEであり、競合解決の出力として実際に使用される$ MERGEではありません。
表示されているデフォルトのファイルはどれも保存されていません。メルドを見せていた$LOCAL
、$REMOTE
そして$BASE
デフォルトで。それを機能させるには、の$MERGED
代わりにmeldを表示する必要がありました$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以前をインストールする必要があります。
merge.conflictstyle
設定オプションが設定されていると、自動マージに失敗したファイル内の競合するチャンクをよりよく理解diff3
しますmerge
。