web-dev-qa-db-ja.com

最終的に使用されるgitファイルのバージョンは、LOCAL、BASE、またはREMOTEですか?

git merge中に衝突があったとき、 Meld と呼ばれるmergetoolを開きます。 LOCAL、BASE、REMOTEの3つのファイルを開きます。 LOCALを読んだのは私のローカルブランチであり、BASEは共通の祖先であり、REMOTEはマージするブランチです。

ここで私の質問に答えてください。ファイルのどのバージョンが最終的に使用されるのでしょうか?リモートですか?その場合、たとえばBASEブランチの内容に関係なく、必要に応じて編集できますか?

161
tsusanka

真ん中にあるのはBASEです。

実際、BASEは共通の祖先ではなく、競合が>>>>および<<<<でマークされている半完成マージです。

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

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

meld base

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

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

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
106
Tomek Bury

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

  1. $LOCALマージするブランチ上のファイル。 表示されたときにマージプロセスによって変更されない

  2. $REMOTEマージ元のブランチ上のファイル。 表示されたときにマージプロセスによって変更されない

  3. $BASE $ LOCALと$ REMOTEの共通の祖先。 2つのブランチが対象ファイルの迂回を開始したポイント。 表示されたときにマージプロセスによって変更されない

  4. $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ファイルである失敗したマージ試行を上書きします。

52
user1284631

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
15
Saad Malik

Meld 1.7を使用すると、Tomek Buryによるソリューションは機能しなくなります。

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

Default settings

代わりにMeld> = 1.7の場合、他の2つのソリューションのいずれかをお勧めします。

最初の解決策

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

first solution

2番目のソリューション

 meld $LOCAL $MERGED $REMOTE

second solution

。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
13
lumbric

表示されているデフォルトのファイルはどれも保存されていないことがわかりました。 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
11
Thomas Leonard

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

2
wnasich

正しい答えについては、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
2
cosmin