当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?
当前回答
我在这里尝试了一些新奇的东西(使用tkdiff),但没有任何效果。所以我写了下面的脚本,tkgitdiff。它做了我需要它做的事。
$ cat tkgitdiff
#!/bin/sh
#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#
newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile
其他回答
使用新的gitdifftool,只需将其添加到.gitconfig文件中即可:
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
也可以选择添加:
[difftool]
prompt = false
还可以查看diffall,这是我编写的一个简单脚本,用于扩展串行打开每个文件的烦人(IMO)默认diff行为。
Windows上的全局.gitconfig位于%USERPROFILE%\.gitconfig中
要完成前面的“diff.external”配置回答:
正如Jakub所提到的,Git1.6.3引入了gitdifftool,最初于2008年9月提出:
用法=“[--工具=工具][--提交=参考][--开始=参考--结束=参考]][--无提示][要合并的文件]”(请参阅此答案的最后部分中的--extcmd)
$LOCAL包含起始修订版中的文件内容,$REMOTE包含结束修订版中文件的内容。$BASE包含世界中文件的内容
它基本上被修改为在git索引/工作树上操作。此脚本的通常使用情况是当您有暂存或未暂存的更改,并且希望在并排的diff查看器(例如xxdiff、tkdiff等)中查看更改时。
git difftool [<filename>*]
另一个用例是当您希望看到相同的信息,但比较任意提交时(这是revarg解析可能更好的部分)
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
最后一个用例是当您想将当前工作树与HEAD以外的其他东西(例如标记)进行比较时
git difftool --commit=v1.0.0 [-- <filename>*]
注意:由于Git2.5,Git-configdiff.toolwinmerge就足够了!请参阅“git mergetool winmerge”
从Git 1.7.11开始,您可以选择-dir diff,以便生成外部diff工具,在填充两个临时目录后,可以一次比较两个目录层次结构,而不是每个文件对运行一次外部工具的实例。
Git 2.5之前:
使用自定义diff工具配置difftool的实际案例:
C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false
如果winmerge.sh存储在PATH的目录部分中:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
如果您有另一个工具(kdiff3、P4Diff…),请创建另一个shell脚本和相应的difftool.myDiffTool.cmd配置指令。然后,您可以使用diff.tool配置轻松切换工具。
你还有Dave的这个博客条目,以添加其他详细信息。(或针对winmergeu选项的此问题)
此设置感兴趣的是winmerge.shscript:您可以自定义它以考虑特殊情况。
例如,请参见下面David Marble的回答,以获取处理以下问题的示例:
源或目标中的新文件已删除源或目标中的文件
正如Kem Mason在他的回答中提到的,您也可以通过使用--extcmd选项来避免任何包装器:
--extcmd=<command>
指定用于查看差异的自定义命令。gitdifftool忽略配置的默认值,并在指定此选项时运行$command$LOCAL$REMOTE。
例如,这就是gitk能够运行/使用任何diff工具的方式。
对以前的伟大答案的简短总结:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
然后通过键入(也可以选择指定文件名)使用它:
git difftool
你可以使用gitdifftool。
例如,如果您有Meld,可以通过以下方式编辑分支master和devel:
git config --global diff.external meld
git difftool master..devel
我已经在文件~/.gitconfig中使用这个位很长时间了:
[diff]
external = ~/Dropbox/source/bash/git-meld
使用git meld:
#!/bin/bash
if [ "$DISPLAY" = "" ];
then
diff $2 $5
else
meld $2 $5
fi
但是现在我已经厌倦了在图形环境中使用Meld,使用这个设置调用普通的diff并不是件容易的事,所以我切换到了这个:
[alias]
v = "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"
使用此设置,类似于这样的工作:
git v
git v --staged
git v -t kompare
git v --staged -t tkdiff
我仍然能保持好的老样子。
推荐文章
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别
- GitHub -致命:无法读取用户名https://github.com':没有这样的文件或目录
- 撤消git平分错误
- 使用.gitconfig配置diff工具
- 如何从另一个文件A中删除文件B中出现的行?
- 如何配置Mac OS X术语,使git有颜色?