当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?
当前回答
在查看了其他一些外部差异工具后,我发现IntelliJ IDEA(和Android Studio)中的差异视图是我最喜欢的。
步骤1-设置IntelliJ IDEA以从命令行运行
如果要使用IntelliJ IDEA作为差异工具,应首先设置IntelliJ IDEA,以便按照以下说明从命令行运行:
在macOS或UNIX上:
确保IntelliJ IDEA正在运行。在主菜单上,选择“工具”|“创建命令行启动器”。将打开“创建启动器脚本”对话框,其中包含启动器脚本的建议路径和名称。您可以接受默认值,也可以指定自己的路径。注意它,因为你稍后会需要它。在IntelliJ IDEA之外,将启动器脚本的路径和名称添加到路径中。
在Windows上:
在Path系统环境变量中指定IntelliJ IDEA可执行文件的位置。在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。
步骤2-配置git以使用IntelliJ IDEA作为difftool
遵循此博客文章的说明:
Bash
export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH
Fish
set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH
现在将以下内容添加到git配置中:
[merge]
tool = intellij
[mergetool "intellij"]
cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
trustExitCode = true
[diff]
tool = intellij
[difftool "intellij"]
cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")
您可以使用gitdifftool或gitdifftoolHEAD~1进行测试
其他回答
Windows/MSYS Git解决方案
看完答案后,我发现了一种更简单的方法,只需要更改一个文件。
使用参数2和5创建一个批处理文件来调用diff程序。此文件必须位于您路径中的某个位置。(如果您不知道它在哪里,请将其放在C:\windows中。)调用它,例如,“gitdiff.bat”。我的是:@回声消失REM这是gitdiff.bat“C:\Program Files\WinMerge\WinMergeU.exe”%2%5将环境变量设置为指向批处理文件。例如:GIT_EXTERNAL_DIFF=gitdiff.bat。或通过PowerShell键入GIT-config--globaldiff.EXTERNAL gitdiff.bat。重要的是不要使用引号或指定任何路径信息,否则将无法工作。这就是为什么gitdiff.bat必须在您的路径中。
现在,当您键入“gitdiff”时,它将调用外部diff查看器。
我还有一个补充。我喜欢经常使用不支持作为默认工具之一的diff应用程序(例如万花筒),通过
git difftool -t
我还希望将默认diff作为常规命令行,因此设置GIT_EXTERNAL_diff变量不是一个选项。
您可以使用以下命令一次性使用任意diff应用程序:
git difftool --extcmd=/usr/bin/ksdiff
它只将2个文件传递给您指定的命令,因此您可能也不需要包装器。
介绍
作为参考,我想加入我对VonC答案的变化。请记住,我使用的是MSys版本的Git(此时为1.6.0.2)和修改的PATH,并从PowerShell(或cmd.exe)运行Git本身,而不是Bash shell。
我引入了一个新命令gitdiff。运行此命令会暂时重定向git diff以使用您选择的可视化diff程序(与VonC的解决方案相反,VonC会永久执行此操作)。这使我既可以使用默认的Git diff功能(gitdiff),也可以使用可视化diff功能。这两个命令都采用相同的参数,例如,为了直观地区分特定文件中的更改,可以键入
gitdiff path/file.txt
安装程序
注意,$GitInstall用作安装Git的目录的占位符。
创建新文件$GitInstall\cmd\gitdiff.cmd@回声消失设置本地的对于/F“delims=”%%I in(“%~dp0...”)do@set path=%%~fI\bin;%%~fI\mingw\bin;%路径%如果“%HOME%”==“”@设置HOME=%USERPROFILE%设置GIT_EXTERNAL_DIFF=GIT-DIFF-visual.cmd设置GIT_PAGER=猫git差异%*末端局部的创建一个新文件$GitInstall\bin\git-diff-visual.cmd(用您选择的diff程序的完整路径替换[visual_diff_exe]占位符)@回声消失git使用7个参数调用rem-diff:rem路径旧文件旧十六进制旧模式新文件新十六进制新模式回声差异“%5”“[visual_diff_exe]”“%2”“%5”退出0你现在完成了。在Git存储库中运行gitdiff现在应该为每个更改的文件调用可视化diff程序。
要完成前面的“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 1.6.3版开始,有了“gitdifftool”,您可以将其配置为使用您最喜欢的图形diff工具。
目前(在撰写此答案时)开箱即用支持KDiff3、Kompare、tkdiff、Meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、Diffuse和opendiff;如果您要使用的工具不在此列表中,您可以始终使用difftool<tool>.cmd'配置选项。
“gitdifftool”接受与“gitdiff”相同的选项。
推荐文章
- 如何将git配置存储为存储库的一部分?
- 如何修改GitHub拉请求?
- 如何在Github和本地删除最后n次提交?
- 我如何调试git/git-shell相关的问题?
- 错误:无法使用rebase进行拉取:您有未分阶段的更改
- Git隐藏未缓存:如何把所有未分期的变化?
- 真实的恶魔
- 如何从另一个分支获得更改
- Git:权限被拒绝(publickey)致命-无法从远程存储库读取。克隆Git存储库时
- git reflog和log有什么区别?
- git推挂在Total line之后
- 重命名git子模块
- 结合Git存储库的前两次提交?
- Xcode 6 gitignore文件应该包括什么?
- 我如何从现有回购的分支创建一个新的GitHub回购?