当我输入git diff时,我希望看到一个并排的diff,就像用diff -y一样,或者像在kdiff3这样的交互式diff工具中显示diff。如何做到这一点呢?
当前回答
这可能是一个有点有限的解决方案,但在没有外部工具的情况下使用系统的diff命令完成工作:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
仅过滤更改行使用——suppress-common-lines(如果您的diff支持该选项)。 在这种情况下,没有颜色,只有通常的不同标记 可以调整列宽度-width=term-width;在Bash中可以获取宽度为$COLUMNS或tput cols。
为了更方便,这也可以被包装到一个helper git-script中,例如,这样使用:
git diffy the/file/path --from rev1 --to rev2
其他回答
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
然后简单的:
git diff
尝试 git difftool
使用git difftool而不是git diff,你将永远不会回到过去。
UPDATE添加一个示例用法:
这是另一个关于git difftool的stackoverflow的链接:我如何用我喜欢的diff工具/查看器查看'git diff'输出?
对于较新版本的git, difftool命令支持许多即时可用的外部diff工具。例如vimdiff是自动支持的,可以通过以下方式从命令行打开:
cd /path/to/git/repo
git difftool --tool=vimdiff
其他支持的外部diff工具通过git difftool列出——tool-help这里是一个示例输出:
'git difftool --tool=<tool>' may be set to one of the following:
araxis
kompare
vimdiff
vimdiff2
The following tools are valid, but not currently available:
bc3
codecompare
deltawalker
diffuse
ecmerge
emerge
gvimdiff
gvimdiff2
kdiff3
meld
opendiff
tkdiff
xxdiff
对于unix,只组合git和内置的diff:
git show HEAD:path/to/file | diff -y - path/to/file
当然,您可以用任何其他git引用替换HEAD,并且您可能希望在diff命令中添加-W 170之类的东西。
这里假设您只是将您的目录内容与过去的提交进行比较。两个提交之间的比较比较复杂。如果你的shell是bash,你可以使用“进程替换”:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
其中REF1和REF2是git引用-标签,分支或哈希。
当我在寻找一种使用git内置方式来定位差异的快速方法时,这个问题出现了。我的解决方案标准:
快速启动,需要内置选项 可以处理多种格式,xml,不同的编程语言 快速识别大文本文件中的小代码更改
我找到这个答案是为了给git上色。
为了获得并排diff而不是行diff,我调整了mb14在这个问题上的优秀答案,使用以下参数:
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
如果你不喜欢额外的[-或{+选项——word-diff=color可以使用。
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
这有助于与json和xml文本以及java代码进行适当的比较。
总之,——word-diff-regex选项与颜色设置一起具有非常有用的可见性,与标准行差异相比,当浏览带有小行更改的大文件时,可以获得彩色的并排源代码体验。
尽管Git有一个diff的内部实现,但是您可以设置一个外部工具。
有两种不同的方法来指定外部差异工具:
设置GIT_EXTERNAL_DIFF和GIT_DIFF_OPTS环境变量。 通过git config配置外部diff工具
Ymattw的答案也非常简洁,使用ydiff
参见:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration Git diff——救命 http://www.pixelbeat.org/programming/diffs/
在执行git diff时,git会检查上述环境变量的设置及其.gitconfig文件。
默认情况下,Git将以下七个参数传递给diff程序:
path old-file old-hex old-mode new-file new-hex new-mode
通常只需要old-file和new-file参数。当然,大多数diff工具只接受两个文件名作为参数。这意味着您需要编写一个小的包装器脚本,它接受Git提供给脚本的参数,并将它们传递给您选择的外部Git程序。
假设你把你的包装脚本放在~/scripts/my_diff.sh下面:
#!/bin/bash
# un-comment one diff tool you'd like to use
# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5"
# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"
# using Meld
/usr/bin/meld "$2" "$5"
# using VIM
# /usr/bin/vim -d "$2" "$5"
然后你需要使该脚本可执行:
chmod a+x ~/scripts/my_diff.sh
然后,您需要告诉Git如何以及在哪里找到您的自定义差异包装器脚本。 你有三个选择如何做到这一点:(我更喜欢编辑.gitconfig文件)
使用GIT_EXTERNAL_DIFF, GIT_DIFF_OPTS 例如,在你的.bashrc或.bash_profile文件中,你可以设置: GIT_EXTERNAL_DIFF = $ HOME /脚本/ my_diff.sh 出口GIT_EXTERNAL_DIFF 使用git配置 使用“git config”来定义你的包装器脚本可以在哪里找到: Git配置——global diff.external ~/scripts/my_diff.sh 编辑~/。gitconfig文件 您可以编辑~/。Gitconfig文件添加这些行: (diff) External = ~/scripts/my_diff.sh
注意:
与安装自定义diff工具类似,您还可以安装一个自定义合并工具,它可以是一个可视化的合并工具,以更好地帮助可视化合并。(参见progit.org页面)
参见:http://fredpalma.com/518/visual-diff-and-merge-tool/和https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解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之间的区别