Windows下使用Git,msysgit是首選,但是msysgit的shell實在不給力,大小不能更改,字體難看。所以,在Windows下,在Cygwin下使用Git是個很不錯的選擇。
我們在提交代碼前,或是合並代碼,查看代碼修改時,經常要diff一下看看都有哪些修改內容,diff的輸出,晦澀難懂,修改多了的時候,簡直像天書一樣。Git 1.7以后,有了一個difftool的命令,使用它,用戶可以選擇一個自己喜歡的diff工具來查看不同提交之間的差異。這個工具可以是命令行的如vimdiff,也可以是帶GUI的如Winmerge等。
Windows下的Diff工具有很多,WinMerge(免費), Araxis Merge(收費),裝了TortoiseSVN的話,也帶有一個Diff工具TortioseIDiff。
這里推薦一款SourceGear MergeDiff,支持Windows,Mac,Linux,非常好用。
1. Diff
首先,新建一個腳本 /usr/bin/mydiff.sh,使用以下內容
#!/bin/sh
"$(cygpath -u "C:\Program Files\SourceGear\Common\DiffMerge\sgdm")" \
-caption="DiffMerge For Git" -nosplash $(cygpath -w $1) $(cygpath -w $2)
然后在Git中使用我們的工具
# 設置執行權限
> chmod a+x /usr/bin/mydiff.sh
# 添加一個diff工具 > git config --global diff.tool mydiff # 配置mydiff的命令 > git config --global difftool.mydiff.cmd "mydiff.sh \"\$LOCAL\" \"\$REMOTE\"" # 查看當前目錄的修改 > git difftool # 使用-y,不必每次詢問 > git difftool -y # 查看兩個版本之間的差異 > git difftool HEAD~2 HEAD
2. Merge
同樣的道理,我們也可以使用自定義的Merge工具
首先,新建一個腳本 /usr/bin/mymerge.sh,使用以下內容
#!/bin/sh
# path for DiffMerge
DMPATH="C:\Program Files\SourceGear\Common\DiffMerge\sgdm"
BASEPATH=$(cygpath -w -a "$1")
LOCALPATH=$(cygpath -w -a "$2")
REMOTEPATH=$(cygpath -w -a "$3")
RESULTPATH=$(cygpath -w -a "$4")
if [ ! -f $1 ]
then
echo "No Base, Use Empty"
TMPBASE="/tmp/git-empty-base"
touch $TMPBASE
BASEPATH=$(cygpath -w -a "$TMPBASE")
fi
# echo "Base: ""$BASEPATH"
# echo "Local: ""$LOCALPATH"
# echo "Remote: ""$REMOTEPATH"
# echo "Result: ""$RESULTPATH"
"$(cygpath -u "$DMPATH")" -caption="DiffMerge For Git" -nosplash \
-merge -result "$RESULTPATH" -t1=Mine -t2=Merged -t3=Theirs \
"$LOCALPATH" "$BASEPATH" "$REMOTEPATH"
然后設置使用mymerge.sh
> git config --global merge.tool mymerge > git config --global mergetool.mymerge.cmd "mymerge.sh \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" \"\$MERGED\"" > git config --global mergetool.mymerge.trustExitCode false # 當merge和rebase發生沖突的時候 > git mergetool
3. Color
msysgit中使用git status時會發現是帶顏色輸出,看起來很直觀,其實設置一下就可以了。
> git config --global color.diff auto > git config --global color.status auto > git config --global color.branch auto > git config --global color.interactive true
或者直接修改~/.gitconfig
[diff]
tool = mydiff
[difftool "mydiff"]
cmd = mydiff.sh \"$LOCAL\" \"$REMOTE\"
[color]
diff = auto
status = auto
branch = auto
interactive = true
[alias]
st = status
lg = log -p
lol = log --graph --decorate --pretty=oneline --abbrev-commit
lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
ls = ls-files
[core]
autocrlf = true
[merge]
tool = mymerge
[mergetool "mymerge"]
cmd = mymerge.sh \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
trustExitCode = false
這時再看log,直觀很多

