HOWTO · Git

為 Git 設定 SourceGear DiffMerge 工具

在本文中,我們將討論配置 Git 以使用 SourceGear 的 DiffMerge 作為預設 difftool 的過程。

本頁內容

設定 Git,讓它使用 SourceGear 的 DiffMerge,以圖形介面比較 git difftool 的內容,並處理 git mergetool 的合併結果。DiffMerge 支援三方比較,因此合併檢視畫面可呈現兩側版本、共同基底及結果檔案。請先安裝 DiffMerge,再設定系統上實際存在的執行檔路徑。

為什麼要搭配 DiffMerge 使用 Git

Git 不必透過圖形應用程式,就能比較修訂版本並準備合併輸入。DiffMerge 會一併呈現這些檔案,方便檢視變更與衝突。差異比較與合併命令使用的輸入不同:差異比較會比較兩個版本;合併則可能包含共同祖先,以及存放解決結果的目的檔案。

在 Windows 上設定 DiffMerge

在 Git Bash 中,使用以下可複製的設定指定工具名稱與命令。範例採用常見的安裝路徑;若 sgdm.exe 位於其他位置,請修改路徑。外層單引號會保留儲存命令中的內層雙引號與 Git 佔位符,路徑含有空格時也適用。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

這些命令會更新全域 .gitconfig;若要設定目前儲存庫的值,請省略 --global。你也可以直接編輯 .gitconfig,兩個命令值分別是 "C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" "$LOCAL" "$REMOTE" 和 "C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"。

DiffMerge 命令列參考說明 --merge 模式與 --result 選項。各平台範例中的合併命令都遵循該語法:先傳入結果路徑,再依序傳入本機、基底與遠端檔案。

在 macOS 上設定 DiffMerge

使用 command -v diffmerge 檢查執行檔位置。以下命令採用提供範例中的 /usr/local/bin/diffmerge;若 Mac 回報的路徑不同,請在兩個命令值中都改用該路徑。以單引號括住的值會讓內嵌引號與 Git 佔位符在 .gitconfig 中保持不變。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"/usr/local/bin/diffmerge" --nosplash "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"/usr/local/bin/diffmerge" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

在 Ubuntu 上設定 DiffMerge

使用 command -v diffmerge 檢查執行檔位置。以下命令採用提供範例中的 /usr/bin/diffmerge;若安裝位置不同,請在兩個命令值中都改用實際路徑。以單引號括住的值會讓內嵌引號與 Git 佔位符在 .gitconfig 中保持不變。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"/usr/bin/diffmerge" --nosplash "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"/usr/bin/diffmerge" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

只有在你不希望 Git 保留備份副本時,才將 mergetool.keepBackup 設為 false;熟悉這套工作流程之前,保留備份可能會比較方便。

執行 Git difftool 與 mergetool

設定好工具後,執行 git difftool,即可開啟已變更檔案的比較畫面。若要比較特定的一對修訂版本或單一檔案,請提供修訂版本與路徑,例如 git difftool main feature -- src/app.py。發生合併衝突時,執行 git mergetool;若只要處理特定路徑,可使用 git mergetool -- src/app.py。這些命令需要相關修訂版本或正在進行的合併衝突;只有設定工具並不會產生比較內容。

執行以下獨立範例,建立暫存的 Git 設定檔,並讀取選用的工具:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

config_file="$(mktemp)"
trap 'rm -f "$config_file"' EXIT
git config --file "$config_file" diff.tool diffmerge
git config --file "$config_file" --get diff.tool

了解設定與檔案引數

使用 git config --global --get diff.tool 檢查生效中的設定,或使用 git config --global -e 開啟全域檔案。設定名稱會指定 DiffMerge 作為 Git 使用的工具,而 *.cmd 值則告訴 Git 如何啟動它。請確認設定的執行檔路徑有效,並以引號括住可能含有空格的路徑。

Git 會提供 $LOCAL 與 $REMOTE,作為目前差異比較或合併操作的兩側輸入。它們代表的內容會依操作類型與相關修訂版本而異,因此不能一概視為原始檔與修改後的檔案。合併時,$BASE 表示共同祖先輸入,而 $MERGED 表示存放解決結果的檔案。合併命令必須依 DiffMerge 預期的順序傳入全部四個路徑。請在儲存的命令中保留這些佔位符,不要以實際檔名取代。依平台設定好工具路徑、命令名稱與引數順序後,git difftool 和 git mergetool 就能分別啟動 DiffMerge 執行各自的工作。