git difftool,立即打开所有diff文件,而不是串行打开

时间:2009-08-03 00:52:52

标签: git difftool

默认的git diff行为是以串行方式打开每个diff文件(等待先前的文件在打开下一个文件之前关闭)。

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

这样可以更轻松地查看一组复杂的变化;在diff文件之间向后和向前翻转并忽略不重要的文件。

12 个答案:

答案 0 :(得分:194)

git v1.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}"
)

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


git mail list上提出了同样的问题。

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

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

对于v1.7.10之前的版本,您可以通过git-diffall上的GitHub项目进行安装。

以下是项目说明:

  

git-diffall脚本提供了一个   基于目录的diff机制   饭桶。该脚本依赖于   diff.tool配置选项   确定使用什么差异查看器。

     

此脚本与所有版本兼容   用于指定范围的表单   对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>]

     

此脚本基于example provided by Thomas Rast on the Git list

答案 1 :(得分:60)

这就是我所确定的......

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

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

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

并像你git diff一样使用:

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

注意:它的关键是&amp; param,它告诉外部diff命令在后台任务中运行,以便立即处理文件。在BeyondCompare的情况下,这将打开一个屏幕,每个文件都在自己的选项卡中。

答案 2 :(得分:19)

meld有一个很好的功能,如果你在源代码控制下给它一个目录(Git,Mercurial,Subversion,Bazaar和其他人),它会自动列出所有已更改的文件,你可以双击查看个体差异。

IMO可以更轻松地输入meld .并让它找出VCS而不是配置您的VCS以启动meld。另外,无论您的项目使用什么VCS,您都可以使用相同的命令,如果您在它们之间进行大量切换,那就太棒了。

唯一的缺点是,扫描变化的速度比传递来自git / hg / svn的变化要慢,但是它是否足够缓慢成问题将取决于你如何使用它我是肯定的。

答案 3 :(得分:3)

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

但我宁愿直接查看工作文件(来自工作目录),因为BeyondCompare具有能够在diff窗口内编辑文件的便利功能,这对于快速清理非常有用。

编辑:similar method here回复我在git邮件列表上的问题。

答案 4 :(得分:3)

git meld =&gt; https://github.com/wmanley/git-meld是一个非常棒的脚本,可以在一个窗口中打开所有文件的整齐差异。

答案 5 :(得分:2)

Diffuse也有VCS集成。它与许多其他VCS互操作,包括SVN,Mercurial,Bazaar ......对于Git,它甚至会显示三个窗格,如果某些但不是所有的变化都被上演。在冲突的情况下,甚至会有四个窗格。

Screenshot of diffuse with staged and unstaged edits

调用它
diffuse -m

在你的Git工作副本中。

如果你问我,十年来我见过的最佳视觉效果。 (而且我也试过了。)

答案 6 :(得分:1)

Noticed here Araxis Merge有'-nowait'命令选项:

  

-nowait阻止比较等待比较结束

也许这会返回一个立即退出代码并且可以正常工作,任何人都有这样的经历找不到BeyondCompare的类似选项...

答案 7 :(得分:1)

如果您只想打开当前修改过的所有文件,请尝试以下操作:

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

如果您要提交“复杂的更改集”,则可能需要重新考虑工作流程。 git的一个非常好的功能是它使开发人员可以轻松地将复杂的更改集减少为一系列简单的补丁。您可能希望查看

git add --patch
,而不是尝试编辑当前修改过的所有文件,这样您就可以选择性地调度。

答案 8 :(得分:1)

我编写了一个powershell脚本,它将复制两个工作树并与DiffMerge进行比较。所以你可以这样做:

GitNdiff master~3 .

比较三个签到前的主分支与当前工作树。

它闪亮而新颖,可能充满了虫子。一个缺点是工作树中尚未添加的文件被复制到两个工作树中。它也可能很慢。

http://github.com/fschwiet/GitNdiff

答案 9 :(得分:1)

对于那些对使用Araxis在Mac OS X上使用git-diffall感兴趣的人,我在github上分叉了git-diffall项目并添加了一个包装Araxis Merge命令的AppleScript。注意:这是Araxis Merge for Mac OS X附带的araxisgitdiff文件的略微修改的克隆。

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

答案 10 :(得分:1)

以下适用于meld和kdiff3

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

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

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

答案 11 :(得分:-2)

您可以使用gitk并同时查看所有差异