最終的に使用されるgitファイルのバージョン:LOCAL、BASE、REMOTE?


174

git mergeにコリジョンが発生した場合、Meldというマージツールを開きます。LOCAL、BASE、REMOTEの3つのファイルを開きます。私はLOCALが私のローカルブランチであることを読んだので、BASEは共通の祖先であり、REMOTEはマージされるブランチです。

さて、私の質問です。ファイルのどのバージョンが最終的に使用されますか?それはリモートですか?その場合、たとえばBASEブランチの内容に関係なく、好きなように編集できますか?

回答:


142

真ん中です:BASE

実際には、BASE共通の祖先が、競合がでマークされている半マージではない>>>><<<<

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

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

meld base

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

  • <<<< HEAD=====マーカー間のコードは、マージ前のローカルファイルのコードです。
  • コードの間====および>>>> <branch name>リモートファイルの一つです。

3
一部の人々は、デフォルトではなくmerge.conflictstyle設定オプションが設定されていると、自動マージに失敗したファイル内の競合するチャンクをよりよく理解diff3しますmerge
kostix

3
HEADは実際には表示されません。<<<および===が歌います。真ん中のウィンドウを空にした場合。しかし、それは他の人へのメモにすぎません。答えはthxです。
tsusanka

あなたが表示されない場合HEAD<<<<<および=====兆候を、それはまったくの競合がないことを意味します。この場合、中央のウィンドウは空ではなく、マージ結果が表示されますが、「赤い」部分はありません
Fabien Quatravaux

10
私はメルドとのマージをやっているとき、私は表示されません<<<<<<======でも>>>>>>どちらかの中央のペインにあるマーカー(すなわちBASEバージョン)。そして、時々、aGrが報告するように、中央のペインは空になります。たぶん、この違いは設定の違いが原因です。私はメルドツールを起動すると、次のファイルは、リポジトリ内のファイルの名前があると仮定して、存在しますX.javaX.javaX.java.origX.java.BACKUP.#X.java.BASE.#X.java.LOCAL.#X.java.REMOTE.#、どこ#いくつかの数です。マージ結果を呼び出すと、BASEバージョンは混乱します。マージされた方が良いでしょう。
Teemu Leisti 2012

3
BASEは実際には共通の祖先であり、MERGEDは部分的なマージ情報が含まれているファイルの名前です。私の質問と回答をご覧ください。GolddifftoolとmergetoolとしてMeldを設定して使用することで、それがどのように機能するかを正確に説明しています。HTH。
mattst

107

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

7
@ Jesse、@ lumbric、新しいバージョンのmeldは$ MERGED --output結果にフラグを使用しているようです。gitの私のバージョンに付属しているmeld
Johann

1
@lumbric Meld 1.7.x +の場合はそうだと思います--output option。:起動スクリプトに次の行を参照してください"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
ヨハン

12
最新のmeld(バージョン> 1.8.4)では、-auto-mergeオプションを使用する必要があります。cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE --output $
MERGED

7
Meld 1.8.4を使用している@pingpongbossと同じ問題がありました:Meldが3番目のタブを開くのではなく、別のペインで物事を開いていました。最終的に正常に機能したコマンドは次のとおりcmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGEDです。したがって、これは3つのタブを開き(古き良き方法)、競合しないマージを中央に自動マージします(中央は$ MERGEDであり、競合解決の出力として使用されます)。
ファーマー

2
出力の構文は、--output=<file>またはです-o <file>。参照meld --help
levsa

57

関連する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ファイル)に書き込まれます。

競合の手動補正が上で行われている$MERGEDので、git 何の平均値がありませんので、それは三つのファイル(からの情報カボチャ、あなたに3つのファイルを提示することを$LOCAL$BASE$REMOTEという点で)$MERGEDファイルを。

しかし、視覚的なツールが用い持って次の3つのファイルを表示するために:彼らはあなたを示し$LOCAL$BASE$REMOTEファイル。$LOCAL$REMOTEファイルから変更を選択し、それらを$BASEファイルに取り込み、完全に再構築して、失敗した$MERGEDファイルであるマージの試みを上書きします。


私はちょうど4つのファイルすべてを表示するツール(たとえば、比較を超えて)があることを望んでいました
yoniLavi

@yoniYalovitsky:はい、またはp4merge
user1284631 2013

私は以前ClearCaseパッケージのマージツールを使用してい
ました

@yoniLavi-これらのツールは4つのペインを表示しますが、この回答で説明されているように必ずしも4つのファイルすべてが表示されるわけではありません。特に、あなたはあなたを表示するために、これらの4ペインツールを設定することができ$LOCAL$REMOTE$BASEおよび出力は最初に等しい$BASEが、異なっています$MERGED、それは上のファイルや衝突マーカなどをマージするgitのの試みを持っていないことに。実際、これらのツールを使用する方法は、マージされていないLOCAL / REMOTE / BASE + OUTPUTの3ペインアプローチに最も似ています。4番目のペインでは、出力からベースを分離することができます。
BeeOnRope

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

これを確認できます。SaadのソリューションはUbuntuで動作します。元の質問に関する限り、これが現在の正解です。
コスミン2014年

3
メルドの私のバージョンでは- 3.11、このコマンドは素晴らしい作品:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

なぜ--diff $BASE $LOCAL --diff $BASE $REMOTE最後に必要になるのですか?1.8.4上の私にとって、これは(私の知る限り)の罰金を動作します:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@farmir:必要ありません。meldにはさらに2つのタブが開くので、BASEと個別に比較したLOCALとREMOTEを確認できます。
Sam Kauffman

1
これらの引数をどのような順序で試しても、3方向タブは常に3番目のタブですが、デフォルトでは最初のタブが常に選択されています。3方向タブをデフォルトで選択する方法はありますか?
Sam Kauffman、2015

13

メルド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

これはMeld 1.8.4では機能しません。を実行するcmd = meld $LOCAL $BASE $REMOTE --auto-mergeと、中央のペインは$ BASEであり、競合解決の出力として実際に使用される$ MERGEではありません。
ファーマー

1
@farmir 2番目のタブとして$ BASEを選択しました。
Alex78191 2017年

11

表示されているデフォルトのファイルはどれも保存されていません。メルドを見せていた$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

すみません、この構成は互換性がありますか?
MadMad666

2

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


私は@lumbricの答え有用であることが判明stackoverflow.com/a/22911793/641892
wnasich

2

正解はサードの答えを見てください。

Ubuntuのmeld 1.8.1を使用して、

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

$ MERGEDの前に--outputを追加すると、修正されます。

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.