当我执行“git diff”时,如何获得并排差异?
当我输入 git diff
时,我希望看到并排的差异,就像使用 diff -y
一样,或者希望在交互式差异中显示差异像kdiff3
这样的工具。这怎么能做到呢?
When I type git diff
, I'd like to see a side-by-side diff, like with diff -y
, or like to display the diff in an interactive diff tool like kdiff3
. How can this be done?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
尝试 git difftool
使用
git difftool
而不是git diff
。你永远不会回去。更新以添加示例用法:
这是另一个有关 git difftool 的 stackoverflow 的链接:如何使用我的首选 diff 工具/查看器查看“git diff”输出?
对于较新版本的
git
, 这difftool
命令支持许多开箱即用的外部比较工具。例如,vimdiff
是自动支持的,可以通过以下方式从命令行打开:其他支持的外部 diff 工具通过
git difftool --tool-help
列出,这是一个示例输出:Try git difftool
Use
git difftool
instead ofgit diff
. You'll never go back.UPDATE to add an example usage:
Here is a link to another stackoverflow that talks about
git difftool
: How do I view 'git diff' output with my preferred diff tool/ viewer?For newer versions of
git
, thedifftool
command supports many external diff tools out-of-the-box. For examplevimdiff
is auto supported and can be opened from the command line by:Other supported external diff tools are listed via
git difftool --tool-help
here is an example output:尽管 Git 有 diff 的内部实现,但您可以设置一个外部工具。
有两种不同的方法可以指定外部 diff 工具:
git config
配置外部 diff 工具ymattw
的答案也非常简洁,使用ydiff
另请参阅:
git diff --help
进行
git diff
时, Git 检查上述环境变量的设置及其 .gitconfig 文件。默认情况下,Git 将以下七个参数传递给 diff 程序:
您通常只需要旧文件和新文件参数。当然,大多数 diff 工具只接受两个文件名作为参数。这意味着您需要编写一个小的包装脚本,它接受 Git 提供给脚本的参数,并将它们传递给您选择的外部 git 程序。
假设您将包装脚本放在
~/scripts/my_diff.sh
下:然后您需要使该脚本可执行:
然后您需要告诉 Git 如何以及在哪里找到您的自定义 diff 包装脚本。
您有三种选择:(我更喜欢编辑 .gitconfig 文件)
使用
GIT_EXTERNAL_DIFF
、GIT_DIFF_OPTS
例如,您可以在 .bashrc 或 .bash_profile 文件中设置:
使用
git config
使用“git config”来定义包装脚本的位置:
编辑您的
~/.gitconfig
文件您可以编辑
~/.gitconfig
文件来添加以下行:<前><代码> [差异]
外部 = ~/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
Although Git has an internal implementation of diff, you can set up an external tool instead.
There are two different ways to specify an external diff tool:
GIT_EXTERNAL_DIFF
and theGIT_DIFF_OPTS
environment variables.git config
ymattw
's answer is also pretty neat, usingydiff
See also:
git diff --help
When doing a
git diff
, Git checks both the settings of above environment variables and its.gitconfig
file.By default, Git passes the following seven arguments to the diff program:
You typically only need the old-file and new-file parameters. Of course most diff tools only take two file names as an argument. This means that you need to write a small wrapper-script, which takes the arguments which Git provides to the script, and hands them on to the external git program of your choice.
Let's say you put your wrapper-script under
~/scripts/my_diff.sh
:you then need to make that script executable:
you then need to tell Git how and where to find your custom diff wrapper script.
You have three choices how to do that: (I prefer editing the .gitconfig file)
Using
GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
e.g. in your .bashrc or .bash_profile file you can set:
Using
git config
use "git config" to define where your wrapper script can be found:
Editing your
~/.gitconfig
fileyou can edit your
~/.gitconfig
file to add these lines:Note:
Similarly to installing your custom diff tool, you can also install a custom merge-tool, which could be a visual merging tool to better help visualizing the merge. (see the progit.org page)
See: http://fredpalma.com/518/visual-diff-and-merge-tool/ and https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
您还可以尝试 git diff --word-diff 。
它并不完全是并排的,但在某种程度上更好,所以您可能更喜欢它而不是您实际的并排需求。
You can also try
git diff --word-diff
.It's not exactly side-by-side, but somehow better, so you might prefer it to your actual side-by-side need.
ydiff
以前称为
cdiff
,该工具可以显示并排、增量、和彩色差异。不要执行 git diff,而是执行以下操作:
这将为每个有差异的文件以并排显示模式启动 ydiff。
安装:
- 或 -
对于
git log
,您可以使用:-w0
自动检测您的终端宽度。有关详细信息和演示,请参阅ydiff
GitHub 存储库页面。在 Git 2.18.0、ydiff 1.1 中测试。
ydiff
Formerly called
cdiff
, this tool can display side by side, incremental, and colorful diff.Instead of doing
git diff
, do:This will launch
ydiff
in side-by-side display mode for each of the files with differences.Install with:
-or-
For
git log
, you can use:-w0
auto-detects your terminal width. See theydiff
GitHub repository page for detail and demo.Tested in Git 2.18.0, ydiff 1.1.
您可以使用
sdiff
进行并排diff
,如下所示:其中
HEAD^
是一个示例,您应该将其替换为您想要的任何内容来区别。我在这里找到了这个解决方案还有其他一些建议。然而,这个答案简洁明了地回答了OP的问题。
有关参数的说明,请参阅 man git-difftool 。
考虑到板上的注释,您可以通过编写以下可执行脚本来创建一个方便的
git sdiff
命令:将其另存为
/usr/bin/git-sdiff
和chmod +x
它。然后你就可以这样做:额外提示
正如评论中所建议的,你可以使用
icdiff
来执行sdiff
对彩色输出所做的操作:You can do a side-by-side
diff
usingsdiff
as follows:where
HEAD^
is an example that you should replace with whatever you want to diff against.I found this solution here where there are a couple of other suggestions also. However, this one answer's the OP's question succinctly and clearly.
See the man git-difftool for an explanation of the arguments.
Taking the comments on board, you can create a handy
git sdiff
command by writing the following executable script:Save it as
/usr/bin/git-sdiff
andchmod +x
it. Then you'll be able to do this:Extra Tip
As suggested in comments you can use
icdiff
to do whatsdiff
does with colored output:我最近实现了一个工具,它正是这样做的: https://github.com/banga/git-split -diffs
以下是如何使用它:
这是它在终端中的外观(使用默认主题):
如您所见,它还支持语法突出显示和突出显示行内更改的单词
I recently implemented a tool that does exactly this: https://github.com/banga/git-split-diffs
Here's how to use it:
And this is how it looks in your terminal (with the default theme):
As you can see, it also supports syntax highlighting and highlighting changed words within lines
对于 unix,仅结合
git
和内置diff
:当然,您可以将 HEAD 替换为任何其他 git 引用,并且您可能想要添加类似
的内容>-W 170
到 diff 命令。这假设您只是将目录内容与过去的提交进行比较。两次提交之间的比较更为复杂。如果您的 shell 是 bash,您可以使用“进程替换”:
其中 REF1 和 REF2 是 git 引用 – 标签、分支或哈希。
For unix, combining just
git
and the built-indiff
:Of course, you can replace HEAD with any other git reference, and you probably want to add something like
-W 170
to the diff command.This assumes that you are just comparing your directory contents with a past commit. Comparing between two commits is more complex. If your shell is
bash
you can use "process substitution":where
REF1
andREF2
are git references – tags, branches or hashes.然后简单地:
then simply:
如果您希望在不涉及 GitHub 的情况下在浏览器中查看并排差异,您可能会喜欢 git webdiff,
git diff
的直接替代品:与
tkdiff
等传统 GUI difftools 相比,它具有许多优势,因为它可以为您提供语法突出显示并显示图像差异。此处了解更多相关信息。
If you'd like to see side-by-side diffs in a browser without involving GitHub, you might enjoy git webdiff, a drop-in replacement for
git diff
:This offers a number of advantages over traditional GUI difftools like
tkdiff
in that it can give you syntax highlighting and show image diffs.Read more about it here.
我使用 colordiff。
在 Mac OS X 上,使用 Linux 上的安装方式
可能是 apt get install colordiff 或类似的东西,具体取决于您的发行版。
然后:
或者创建一个别名
然后你就可以使用它了
我称之为“diffy”,因为
diff -y
是 unix 中的并排差异。 Colordiff 还添加了更好的颜色。在选项
-ydw
中,y
用于并排,w
用于忽略空格,d
是产生最小的差异(通常你会得到更好的结果作为差异)I use colordiff.
On Mac OS X, install it with
On Linux is possibly
apt get install colordiff
or something like that, depending on your distro.Then:
Or create an alias
Then you can use it
I called it "diffy" because
diff -y
is the side-by-side diff in unix. Colordiff also adds colors, that are nicer.In the option
-ydw
, they
is for the side-by-side, thew
is to ignore whitespaces, and thed
is to produce the minimal diff (usually you get a better result as diff)我个人非常喜欢 icdiff !
如果您使用的是带有
HomeBrew
的Mac OS X
,只需执行brew install icdiff
即可。为了正确获取文件标签以及其他很酷的功能,我在
~/.gitconfig
中使用了它:
git difftool
I personally really like icdiff !
If you're on
Mac OS X
withHomeBrew
, just dobrew install icdiff
.To get the file labels correctly, plus other cool features, I have in my
~/.gitconfig
:And I use it like:
git difftool
使用
delta
。在 gitconfig 文件(通常是
~/.gitconfig
或~/.config/git/config
)中,添加:
Use
delta
.In your gitconfig file (usually
~/.gitconfig
or~/.config/git/config
),add:
当我正在寻找一种使用 git 内置方式来查找差异的快速方法时,出现了这个问题。我的解决方案标准:
这个答案在 git 中获取颜色。
为了获得并排差异而不是行差异,我调整了 mb14 的优秀 使用以下参数回答此问题:
如果您不喜欢额外的 [- 或 {+ 选项可以使用
--word-diff=color
。这有助于正确比较 json 和 xml 文本以及 java 代码。
总之,当浏览大文件和小文件时,
--word-diff-regex
选项具有有用的可见性和颜色设置,与标准行差异相比,可以获得彩色并排源代码体验。线路变化。This question showed up when I was searching for a fast way to use git builtin way to locate differences. My solution criteria:
I found this answer to get color in git.
To get side by side diff instead of line diff I tweaked mb14's excellent answer on this question with the following parameters:
If you do not like the extra [- or {+ the option
--word-diff=color
can be used.That helped to get proper comparison with both json and xml text and java code.
In summary the
--word-diff-regex
options has a helpful visibility together with color settings to get a colorized side by side source code experience compared to the standard line diff, when browsing through big files with small line changes.打开Intellij IDEA,在“版本控制”工具窗口中选择单个或多个提交,浏览更改文件,然后双击它们以并排检查每个文件的更改。
使用捆绑的命令行启动器,您可以通过简单的
idea some/path
Open Intellij IDEA, select a single or multiple commits in the "Version Control" tool window, browse changed files, and double click them to inspect changes side by side for each file.
With the bundled command-line launcher you can bring IDEA up anywhere with a simple
idea some/path
这是一个方法。如果您通过 less 进行管道传输,则 xterm 宽度将设置为 80,这并不是那么热。但如果您继续执行该命令,例如 COLS=210,您就可以使用扩展的 xterm。
Here's an approach. If you pipe through less, the xterm width is set to 80, which ain't so hot. But if you proceed the command with, e.g. COLS=210, you can utilize your expanded xterm.
其他几个人已经提到了 cdiff 用于 git 并排比较,但没有人给出它的完整实现。
设置 cdiff:
编辑 ~/.gitconfig 插入以下行:
cdiff 需要关闭分页器才能与 Diff 一起使用,无论如何它本质上是一个分页器,所以这很好。无论这些设置如何,Difftool 都会起作用。
需要 show 别名,因为 git show 仅通过参数支持外部 diff 工具。
diff 外部命令末尾的“#”很重要。 Git 的 diff 命令将 $@ (所有可用的 diff 变量)附加到 diff 命令,但我们只需要两个文件名。因此,我们用 $2 和 $5 显式地调用这两个,然后将 $@ 隐藏在注释后面,否则会使 sdiff 感到困惑。导致出现如下错误:
现在生成并排比较的 Git 命令:
Cdiff 用法:
现在,您可以通过 git diff 和 difftool 进行并排比较。如果您需要的话,您还可以使用 cdiff python 源代码进行高级用户定制。
Several others already mentioned cdiff for git side-by-side diffing but no one gave a full implementation of it.
Setup cdiff:
Edit ~/.gitconfig inserting these lines:
The pager off is needed for cdiff to work with Diff, it is essentially a pager anyway so this is fine. Difftool will work regardless of these settings.
The show alias is needed because git show only supports external diff tools via argument.
The '#' at the end of the diff external command is important. Git's diff command appends a $@ (all available diff variables) to the diff command, but we only want the two filenames. So we call out those two explicitly with $2 and $5, and then hide the $@ behind a comment which would otherwise confuse sdiff. Resulting in an error that looks like:
Git commands that now produce side-by-side diffing:
Cdiff usage:
You now have side-by-side diff via git diff and difftool. And you have the cdiff python source code for power user customization should you need it.
这可能是一个有点有限的解决方案,但是使用系统的
diff
命令无需外部工具即可完成工作:--suppress-common-lines
过滤更改行(如果您的diff
支持该选项)。diff
标记--width=term-width
;在 Bash 中可以通过$COLUMNS
或tput cols
获取宽度。为了更方便,也可以将其包装到辅助 git 脚本中,例如,如下所示的用法:
This may be a somewhat limited solution, but does the job using the system's
diff
command without external tools:--suppress-common-lines
(if yourdiff
supports the option).diff
markers--width=term-width
; in Bash can get the width as$COLUMNS
ortput cols
.This can be wrapped into a helper git-script too for more convenience, for example, usage like this:
有多种解决方案:
解决方案1:Meld:
安装meld(在ubuntu中我使用
sudo apt install meld
)。然后像下面这样配置它。解决方案 2:Delta:
如果您决定使用 cli,请安装 delta 。我使用的配置是:
解决方案3:Melt:
您还可以使用Melt。它的语法突出显示是通过 bat 完成的。这也是一个 cli 工具。
There are multiple solutions:
Solution 1 : Meld :
Install meld (in ubuntu I used
sudo apt install meld
). Then configure it like bellow.Solution 2 : Delta :
If you decide to use cli, then install delta. The config I use is:
Solution 3 : Melt :
You can also use Melt. It's syntax highlighting is done with bat. This is also a cli tool.
这个线程中有很多很好的答案。我对这个问题的解决方案是编写一个脚本。
将此命名为“git-scriptname”(并使其可执行并将其放入您的 PATH 中,就像任何脚本一样),您可以通过运行像普通 git 命令一样调用它
。实际功能只是最后一行。这是来源:
There are a lot of good answers on this thread. My solution for this issue was to write a script.
Name this 'git-scriptname' (and make it executable and put it in your PATH, like any script), and you can invoke it like a normal git command by running
The actual functionality is just the last line. Here's the source: