當在git merge
期間發生碰撞時,我打開一個名爲Meld的合併工具。它打開三個文件LOCAL,BASE和REMOTE。正如我讀過的LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合併的分支。最終將使用哪個版本的git文件:LOCAL,BASE還是REMOTE?
現在我的問題:該文件的哪個版本將被最終使用?它是遠程的嗎?如果是這樣,我可以根據需要對其進行編輯,無論BASE分支中的內容如何?
當在git merge
期間發生碰撞時,我打開一個名爲Meld的合併工具。它打開三個文件LOCAL,BASE和REMOTE。正如我讀過的LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合併的分支。最終將使用哪個版本的git文件:LOCAL,BASE還是REMOTE?
現在我的問題:該文件的哪個版本將被最終使用?它是遠程的嗎?如果是這樣,我可以根據需要對其進行編輯,無論BASE分支中的內容如何?
這是中間的一個:BASE
。
實際上,BASE
不是共同的祖先,而是衝突標記爲>>>>
和<<<<
的半成品合併。
您可以在meld編輯窗口的頂部看到文件名。
,只要你想使用或不使用MELD命令,您可以編輯BASE
文件。
你也可以擺脫融合,只需用你最喜歡的文本編輯器編輯文件。
<<<< HEAD
和=====
標記之間的代碼是合併前本地文件中的一個。====
和>>>> <branch name>
之間的代碼是遠程文件之一。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
我發現沒有顯示的默認文件中被保存。 默認顯示爲$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
不好意思,這個配置inux是否兼容? – MadMad666
有4個文件涉及:
$LOCAL
文件在你正在合併的分支上; 通過合併進程不變時顯示你
$REMOTE
從正在合併的分支的文件; 通過合併進程不變時顯示你
$BASE
的$ LOCAL和$共同祖先REMOTE,即。兩個分支開始轉移所考慮的文件的點; 通過合併進程不變時顯示你
$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
文件。
我只是想有工具(例如無法比擬)顯示所有4個文件 – yoniLavi
@yoniYalovitsky:是的,或者p4merge – user1284631
我以前使用ClearCase包的合併工具 – mishmashru
出於某種原因MELD的最新版本不顯示標記線增加了衝突(< < < < < < <,=======,>>>>>>>)。如果你想看到這些行,你應該安裝meld v 1.3.3或以前版本。
我發現有用@lumbric的答案https://stackoverflow.com/a/22911793/641892 – wnasich
請看薩阿德的答案是否正確。
隨着MELD 1.8.1在Ubuntu上我得到了
錯號碼提供給--diff
參數和添加--output前$合併固定對我來說:
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
科斯明的解決方案工作,但$ 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
我可以證實這一點。薩達德的解決方案適用於我在Ubuntu上。就原來的問題而言,這是當前正確的答案。 – cosmin
在我的meld-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
隨着MELD 1。7 Tomek Bury的解決方案不再適用。
的默認設置沒有滿足我:
而不是爲MELD> = 1.7我建議其他兩種解決方案之一。
首先溶液:
meld $LOCAL $BASE $REMOTE --auto-merge
第二溶液:
meld $LOCAL $MERGED $REMOTE
[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
有些人可以更好地理解文件中衝突的塊如果他們將'merge.conflictstyle'配置選項設置爲'diff3'而不是默認的'merge',則自動合併失敗。 – kostix
我其實並沒有看到HEAD,<<<和===唱歌。在你提供的情況下,中間的窗口將是空的。但這只是其他人的注意事項,thx爲您的答案。 – tsusanka
如果您沒有看到「HEAD」,「<<<<<」和「=====」標誌,則表示完全沒有衝突。在這種情況下,中間窗口不會爲空,它會顯示合併結果,但不會有「紅色」部分 –