2012-06-21 40 views
149

當在git merge期間發生碰撞時,我打開一個名爲Meld的合併工具。它打開三個文件LOCAL,BASE和REMOTE。正如我讀過的LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合併的分支。最終將使用哪個版本的git文件:LOCAL,BASE還是REMOTE?

現在我的問題:該文件的哪個版本將被最終使用?它是遠程的嗎?如果是這樣,我可以根據需要對其進行編輯,無論BASE分支中的內容如何?

回答

123

這是中間的一個:BASE

實際上,BASE不是共同的祖先,而是衝突標記爲>>>><<<<的半成品合併。

您可以在meld編輯窗口的頂部看到文件名。

See the screenshot here

meld base

,只要你想使用或不使用MELD命令,您可以編輯BASE文件。
你也可以擺脫融合,只需用你最喜歡的文本編輯器編輯文件。

  • <<<< HEAD=====標記之間的代碼是合併前本地文件中的一個。
  • ====>>>> <branch name>之間的代碼是遠程文件之一。
+3

有些人可以更好地理解文件中衝突的塊如果他們將'merge.conflictstyle'配置選項設置爲'diff3'而不是默認的'merge',則自動合併失敗。 – kostix

+3

我其實並沒有看到HEAD,<<<和===唱歌。在你提供的情況下,中間的窗口將是空的。但這只是其他人的注意事項,thx爲您的答案。 – tsusanka

+0

如果您沒有看到「HEAD」,「<<<<<」和「=====」標誌,則表示完全沒有衝突。在這種情況下,中間窗口不會爲空,它會顯示合併結果,但不會有「紅色」部分 –

103

MELD具有通過傳遞第四個參數激活隱藏3路合併功能

meld $LOCAL $BASE $REMOTE $MERGED 

的左,右窗格以只讀方式打開,所以你不能意外地將錯誤的方式合併。中間窗格顯示合併的結果。對於衝突,它顯示基本版本,以便您可以看到所有重要的位:中間的原始文本以及兩側的衝突修改。最後,當你按下「Save」按鈕時,寫入$ MERGED文件 - 與git完全相同。

我使用的〜/的.gitconfig文件包含以下設置:

[merge] 
tool = mymeld 
conflictstyle = diff3 
[mergetool "mymeld"] 
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED 

這將打開3個選項卡,第一次和包含簡單的diff我試圖合併第二選項卡,然後在第三個標籤合併,默認打開,顯示3路合併視圖。

現在,該功能被隱藏的原因是它還沒有打磨得足夠。它現在非常有用,但融合作家Kai Willadsen指出很少需要熨平的皺紋。例如,沒有GUI來啓動3路合併模式,命令行語法有點神祕,等等。如果你說蟒蛇,並有一些時間在你手上 - 你知道該怎麼做。

編輯: 在較新版本的Meld中,synax略有變化。這是在評論中,但它屬於答案。

的MELD命令現在使用--output選項,因此從上面的代碼段最後一行應該是:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED 
+0

@Jesse這似乎與Meld 1.6.0一起工作,但Meld 1.7.0並沒有。 – lumbric

+7

@Jesse,@lumbric,看來新版本的meld使用'--output'標誌來獲得$ MERGED結果。我在查看與我的git版本一起提供的meld啓動腳本時發現了這一點:https://github.com/git/git/blob/master/mergetools/meld – Johann

+0

@Johann Hm是的,你是對的,但那不是解決這個問題。您鏈接的啓動腳本不提供Tomek Bury解決方案中所述的高級功能。 – lumbric

11

我發現沒有顯示的默認文件中被保存。 默認顯示爲$LOCAL,$REMOTE$BASE。爲了使它工作,我需要製作融合秀$MERGED而不是$BASE。在我~/.gitconfig把這個固定對我來說:

[merge] 
     tool = mymeld 
[mergetool "mymeld"] 
     cmd = meld "$LOCAL" "$MERGED" "$REMOTE" 

我使用的拱頂,:

$ git --version 
git version 1.8.2 
$ meld --version 
meld 1.7.1 
+0

不好意思,這個配置inux是否兼容? – MadMad666

46

有4個文件涉及:

  1. $LOCAL文件在你正在合併的分支上; 通過合併進程不變時顯示你

  2. $REMOTE從正在合併的分支的文件; 通過合併進程不變時顯示你

  3. $BASE的$ LOCAL和$共同祖先REMOTE,即。兩個分支開始轉移所考慮的文件的點; 通過合併進程不變時顯示你

  4. $MERGED的部分合並的文件,有衝突; 這是合併過程感動的唯一文件,實際上,從未顯示出你meld


$MERGED文件包含<<<<<<>>>>>>=====(和,也許是一個,||||||)標記(即劃定衝突)。 是您編輯手動糾正衝突的文件。

手動衝突編輯和視覺衝突編輯是在不同的文件上完成的,並提供不同的信息。

當使用合併工具(假定meld),即看到在其中的文件是:$LOCAL$BASE$REMOTE。請注意,您看不到$MERGED文件,雖然這是作爲隱藏參數傳遞給meld以在其中寫入編輯結果。

換句話說,在meld,您正在編輯的文件在中間,$BASE文件,你選擇所有從左邊或右邊手動的變化。這是一個乾淨的文件,並沒有被合併過程所觸及。唯一的小問題是,當你保存時,你不會保存到$BASE文件中,而是在meld的第四個隱藏參數中,即$MERGED文件(你甚至沒有看到)。 $BASE文件確實不是包含任何衝突或部分成功合併,因爲它不是$MERGED文件

在可視化編輯,呈現在你的$BASE文件(而不是$MERGED文件)git基本上放棄其所有試圖做合併(這些嘗試是可見的,如果你願意,在$合併文件)和讓你完全從頭合併

底線是在手動和可視化合並衝突中,您沒有看到相同的文件,但最終結果寫在相同的文件(即$MERGED文件)中。

衝突的手動校正在$MERGED因爲git沒有平均爲您呈現三個文件進行的,因此它從瓜類在$MERGED文件中的三個文件($LOCAL$BASE$REMOTE)的信息。

但可視化工具有辦法向您展示三個文件:他們告訴你的$LOCAL$BASE$REMOTE文件。您正在從$LOCAL$REMOTE文件中選擇更改,然後將這些文件帶入$BASE文件,完全重新構建甚至覆蓋合併失敗的嘗試,即$MERGED文件。

+0

我只是想有工具(例如無法比擬)顯示所有4個文件 – yoniLavi

+0

@yoniYalovitsky:是的,或者p4merge – user1284631

+0

我以前使用ClearCase包的合併工具 – mishmashru

2

出於某種原因MELD的最新版本不顯示標記線增加了衝突(< < < < < < <,=======,>>>>>>>)。如果你想看到這些行,你應該安裝meld v 1.3.3或以前版本。

+0

我發現有用@lumbric的答案https://stackoverflow.com/a/22911793/641892 – wnasich

2

請看薩阿德的答案是否正確。

隨着MELD 1.8.1在Ubuntu上我得到了

錯號碼提供給--diff

參數和添加--output前$合併固定對我來說:

[mergetool "mymeld"] 
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED 
15

科斯明的解決方案工作,但$ BASE文件被更新 - 不$已合併。這將更新$已合併文件:

MELD: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 
+0

我可以證實這一點。薩達德的解決方案適用於我在Ubuntu上。就原來的問題而言,這是當前正確的答案。 – cosmin

+3

在我的meld-3.11版本中,這個命令很好用:'cmd = meld --auto-merge --output $ MERGED $ LOCAL $ BASE $ REMOTE' – MartinM

+0

你爲什麼需要'--diff $ BASE $ LOCAL - diff $ BASE $ REMOTE'在最後?對我來說,在1.8.4上,這工作得很好(據我所見):'cmd = meld --auto-merge --output $ MERGED $ LOCAL $ BASE $ REMOTE' – farmir

13

隨着MELD 1。7 Tomek Bury的解決方案不再適用。

默認設置沒有滿足我:

Default settings

而不是爲MELD> = 1.7我建議其他兩種解決方案之一。

首先溶液

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

first solution

第二溶液

meld $LOCAL $MERGED $REMOTE 

second solution

[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文件設置meld17或meld16只適用於本機:的.gitconfig如上所述

複製粘貼&這在.gitconfig文件,以獲得解決方案如果您在多臺機器上使用.gitconfig:

# This is a host specific config file! 
# Note that git 1.7.10+ is needed 
# http://stackoverflow.com/a/9733277/859591 
[merge] 
    tool = meld17 
+5

您的「第一」和「第二」解決方案具有相同的命令。 – pcworld

+0

這對Meld 1.8.4不起作用。如果運行'cmd = meld $ LOCAL $ BASE $ REMOTE --auto-merge',中間窗格將是$ BASE,而不是實際用作衝突解決輸出的$ MERGE。 – farmir

+0

@farmir您選擇了$ BASE作爲第二個選項卡。 – Alex78191

相關問題