簡體   English   中英

如何使用git做三向圖形化差異(不合並)?

[英]How can I do a three way graphical diff (not merge) with git?

我在git中有兩個相似的分支,我想手動將這些更改拉到完全不同的第三個分支中。 是否可以對這些更改進行三向圖形化比較?

當前已設置兩個分支的圖形差異,並且可以很好地與“ meld”配合使用。 以下顯示了預期的圖形化融合窗口:

  • git diff branch1 branch2-myfilename

我嘗試執行以下操作,但獲得了“ diff --cc”的ASCII輸出。

  • git diff master branch1 branch2-myfilename

這是獲得三向差異的有效語法嗎? 什么是正確的.gitconfig設置才能將其打開? 我正在使用Git版本1.8.2.1。

我的期望是在一個融合窗口中打開這三個文件,然后我可以查看branch1 / branch2之間的更改,然后從視覺上確保相同的更改在master中。 我剛剛意識到,可以通過從三個分支中分別檢出每個文件,然后將文件名作為參數直接傳遞給meld來做到這一點。 可以按照以下SO答案進行結帳: https : //stackoverflow.com/a/888623/350265

手動一線指令

通過將bash中的<(cmd)語法與git show思想結合使用,可以在文件的三個版本上調用meld ,而無需使用臨時文件:

meld <(git show master:file) <(git show branch1:file) <(git show branch2:file)

這將彈出文件文件dev/fd/61/dev/fd/62/dev/fd/63引用三個分支中的文件。 名稱不是很友好,但是您會習慣的。 關鍵是它將顯示您想要看到的內容。

編寫腳本

顯而易見的下一步是使用腳本簡化語法:

創建文件~/bin/git-meld3 (或PATH上的其他任何位置):

#!/bin/bash
meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

使它可執行:

chmod +x ~/bin/git-meld3

稱它為:

git meld3 master branch1 branch2 myfilename

該命令適用於任何committish:

git meld3 master 36d1cf756 HEAD^^^ myfilename

更加靈活的腳本

~/bin/git-meld腳本接受兩個或三個承諾:

#!/bin/bash
if [[ $# -eq 3 ]]; then
   meld <(git show $1:$3) <(git show $2:$3)
elif [[ $# -eq 4 ]]; then
   meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)
else
   echo Usage: git meld committish1 committish2 [committish3] file >&2
   exit 1
fi

PS

在我自己的機器上,我必須像這樣調用meld: python2.6 /usr/bin/meld ,可能是因為未正確安裝,所以這是我的實際~/bin/git-meld3腳本:

#!/bin/bash
python2.6 /usr/bin/meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

熔渣老了! 該腳本說它需要Python 2.4,但是不能用2.7或3編譯。所幸,它確實可以用2.6運行,因此我能夠測試我的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM