git difftool,立即打开所有差异文件,而不是以串行方式打开


240

默认的git diff行为是依次打开每个diff文件(等待上一个文件关闭后再打开下一个文件)。

我正在寻找一次打开所有文件的方法-例如,在BeyondCompare中,这将打开同一BC窗口中选项卡中的所有文件。

这样可以更轻松地审查一组复杂的更改;在diff文件之间来回滑动并忽略不重要的文件。


“ git diff”或“ git difftool”?您可能要在git邮件列表上发布请求(所有人开放,并使用各种Web界面):git@vger.kernel.org
JakubNarębski09年

我正在使用“ git difftool”来触发外部差异应用程序。感谢您的邮件列表提示。
塞巴·伊林沃思

了解平台将很有帮助。在基于Unix的平台上,我将编写一个脚本来执行diff并指示git使用该脚本。在脚本中,我只需在后台运行diff,然后让脚本死亡。
克里斯·克莱兰德

Windows平台,但感谢克里斯的想法。
塞巴·伊林沃思2009年

Answers:


214

gitv1.7.11 开始,您可以git difftool --dir-diff用来执行目录差异。

例如,此功能可与Meld 3.14.2配合使用,并让您浏览所有已修改的文件:

git difftool --dir-diff --tool=meld HEAD~ HEAD

这是一个方便的Bash函数:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

以下答案适用git于v1.7.11之前的安装。


git邮件列表上也问了同样的问题。

我根据该电子邮件线程整理了一个shell脚本,该脚本在任意提交之间执行目录差异。

从git v1.7.10开始,该git-diffall脚本包含在contrib标准git安装的中。

对于v1.7.10之前的版本,可以从GitHub上git-diffall项目安装。

这是项目说明:

git-diffall脚本为git提供了基于目录的diff机制。该脚本依靠diff.tool配置选项来确定使用哪种diff查看器。

该脚本与用于指定diff修订范围的所有格式兼容:

1)git diffall:显示工作树和已执行的更改之间的差异
2)git diffall --cached [<commit>]:显示工作树和已更改HEAD (或其他命名的提交)之间的差异
3)git diffall <commit>:显示工作树和已命名的提交之间的差异
4)git diffall <commit> <commit>:显示两个已命名的提交之间的差异
5)git diffall <commit>..<commit>:相同如上
6)git diffall <commit>...<commit>:显示包含且直到第二个分支的变化,从两个分支的共同祖先开始<commit>

注意:所有表格均采用可选的路径限制器 [--] [<path>]

该脚本基于Thomas Rast在Git列表上提供示例


git-diffall和github.com/wmanley/git-meld有什么区别?我尝试了两者,乍一看它们似乎提供了相同的功能。
kynan 2011年

5
我非常感谢您的脚本。坦白地说,我无法理解为什么Git在这方面的行为方式不正确(Mercurial的做法已经这样做了很多年),也无法理解Git社区对此缺乏兴趣。
道格拉斯

6
更新(关于git difftool --dir-diff和超越比较):我联系了Scooter Software(超越比较的作者),他们说这bcompare.exe不是受支持的解决方案,并且如果一次打开的差异超过一个,可能会引起问题。他们计划bcomp.exe在将来的版本中增加对文件夹diff的支持(与此同时,我将继续使用它bcompare.exe作为不受支持的解决方法)。
彼得·鲁斯特

4
我刚刚使用Beyond Compare 4测试了@coin,并且--dir-diff似乎可以与支持的bcomp.exe一起使用。
彼得·鲁斯特

5
只是评论说这--dir-diff与Meld完美搭配。从那里,它可以让您选择和查看单个文件的差异。
mkasberg 2015年

61

这就是我所决定的...

将以下代码复制到一个名为git-diffall(无扩展名)的文件中:

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

将文件放在cmdgit install dir 的文件夹中(例如C:\Program Files (x86)\Git\cmd

并像您一样使用git diff

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

注意:关键是参数,它告诉外部diff命令在后台任务中运行,以便立即处理文件。对于BeyondCompare,这将打开一个屏幕,每个文件都位于其自己的标签中。


感谢您的发布。不幸的是,它不适用于WinMerge的-s选项。除第一个临时文件外,其他所有临时文件都将在WinMerge查看之前删除。
卡洛斯·雷登

卡洛斯:我在Git中使用WinMerge。我的方法是在启动WinMerge之后添加一个“ sleep 1”(在我看来,它已经“在后台”启动了-不需要&)。这样,临时文件的生存时间就足够长,WinMerge可以将其拾取一次(奇怪的情况除外)。这也确实意味着每个文件需要1秒才能全部打开。这是一个令人讨厌的技巧(我永远不会将其作为“答案”!),而是一种简单而有效的技巧。
伍迪Zenfell III

2
为了在Linux上使用Git 2.x,我必须进行一些修改:更改"$filename""../$filename"。然后,它与Beyond Compare
Dave C

1
@DaveC在原始线程中说“将文件存储在git install的cmd文件夹中”,并在Windows上进行示例。您在Linux的哪里存储了“ git-diffall”文件?
m4l490n

2
git-diffall文件添加到C:\Program Files\Git\cmd文件夹后,是否需要重新启动Windows ?我完全按照指示进行了操作,但是这样做了 $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld 具有一个巧妙的功能,如果您在源代码管理下为它提供目录(Git,Mercurial,Subversion,Bazaar以及其他),它将自动列出所有更改的文件,您可以双击以查看各个差异。

与IMO相比,键入meld .它并弄清楚VCS比配置VCS启动要容易得多meld。另外,无论您的项目正使用哪种VCS,您都可以使用相同的命令,如果您在它们之间进行了很多切换,那将是一个很好的选择。

唯一的缺点是,对于meld来说,扫描更改要比从git / hg / svn传递更改慢,尽管我确定它是否足够慢才成为问题,但这取决于您的使用方式。


4
对我来说,主要缺点是,meld(无论出于何种原因)会在新窗口中而不是新选项卡中打开差异,并且在关闭差异后,工作目录中的文件会在新选项卡中打开,并且之前会显示讨厌的弹出消息。
kynan 2011年

不错的工具,但Windows安装糟糕(截至2012年初)。
Wernight

@kynan这似乎是解决VCS不可知方式(如果不是针对这种烦人的双窗口弹出窗口)的完美解决方案。这是一个耻辱。:(
PKKid 2012年

Meld的一个重要功能是它的差异过滤器:忽略更改(例如注释中的更改)或添加/删除空白行(git diff不提供)。
凯南

1
我已经使用这种方法大约一年了;它适用于较小的项目,但是一旦您有一个较大的项目(即,有很多文件),它的速度就会非常慢,因为它手动“扫描”了git diff(不确定为什么git清楚地向它提供列表时,为什么会采用这种方法)文件直接...)
namuol 2013年

3

我确实找到了此方法(GitDiff.bat和GitDiff.rb),该方法将文件复制到旧/新的临时目录中,然后对它们进行文件夹比较。

但是我宁愿直接从工作目录中查看工作文件,因为BeyondCompare具有方便的功能,能够从diff窗口中编辑文件,这对于快速清理非常有用。

编辑:在这里,我在git邮件列表上的问题类似的方法




2

Diffuse还具有VCS集成。它可以与大量其他VCS(包括SVN,Mercurial,Bazaar等)进行互操作。对于Git,如果上演了部分但不是全部更改,它甚至会显示三个窗格。在发生冲突的情况下,甚至会有四个窗格。

带有阶段性和非阶段性编辑的diffuse屏幕截图

调用

diffuse -m

在您的Git工作副本中。

如果您问我,十年来最好的视觉效果就与众不同。(我也尝试过融合)。


你能说出你喜欢哪一部分漫射,尤其是在熔体上吗?
musiphil

@musiphil:我喜欢它的简单性-它似乎具有解决任务所需的确切功能,而不是更多,但也不少。(就像差异和制表符大小宽度的重新对齐一样。)我不记得为什么我从融合转换了,并且从那时起我就没有使用过融合,所以现在不能真正比较它们了。
krlmlr 2015年

1
Diffuse在没有任何配置的情况下与git一起使用。Diffuse -m使用不同选项卡中的git diffs打开单个窗口;而其他其他工具则需要太多的配置才能上手。
mosh

1

如果您要做的就是打开所有当前已修改的文件,请尝试以下操作:

vi $(git status | sed -n'/.*修改:* / s /// p')

如果要提交“复杂的更改集”,则可能需要重新考虑工作流程。git的真正不错的功能之一是,它使开发人员可以轻松地将复杂的变更集减少为一系列简单的补丁程序。与其尝试编辑当前已修改的所有文件,不如尝试查看

git添加--patch
这将允许您有选择地演出帅哥。


1

我编写了一个powershell脚本,该脚本将复制两个工作树并与DiffMerge进行比较。因此,您可以执行以下操作:

GitNdiff master~3 .

例如,要将三个签入之前的master分支与当前工作树进行比较。

它的光泽和新的,可能充满了错误。缺点之一是工作树中尚未添加的文件被复制到两个工作树中。它也可能很慢。

http://github.com/fschwiet/GitNdiff


1

对于那些对在具有Araxis的Mac OS X上使用git-diffall感兴趣的人,我在github上创建了git-diffall项目,并添加了一个包含Araxis Merge命令的AppleScript。注意:这是araxisgitdiffAraxis Merge for Mac OS X附带的文件的稍作修改的副本。

https://github.com/sorens/git-diffall


1

以下适用于meld和kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

在您可以轻松浏览的窗口中打开所有文件。可以与变更集一起使用,以代替原产地/分支名称

例如: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.