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

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

这将使审查一组复杂的变更更加容易;在差异文件之间来回切换,忽略不重要的文件。


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

但是我宁愿直接查看工作文件(从工作目录),因为BeyondCompare有一个方便的功能,可以在diff窗口内编辑文件,这对于快速清理非常好。

编辑:这里有一个类似的方法来回应我在git邮件列表上的问题。


注意这里Araxis Merge有一个'-nowait'命令选项:

-nowait防止compare等待比较被关闭

也许这会返回一个立即退出码,可以工作,有人经历过吗?找不到类似的BeyondCompare选项…


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


如果你想要做的就是打开当前修改过的所有文件,试试下面的方法:

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

如果您正在提交“复杂的更改集”,您可能需要重新考虑您的工作流。git的一个非常好的特性是,它使开发人员可以轻松地将复杂的更改集简化为一系列简单的补丁。与其尝试编辑当前修改的所有文件,不如查看git add——patch,它将允许您有选择地分段块。


这是我决定的……

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

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

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

然后使用like you would git diff:

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

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


从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邮件列表中也有同样的问题。

我在电子邮件线程的基础上组合了一个shell脚本,它在任意提交之间执行目录差异。

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

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

以下是项目描述:

The git-diffall script provides a directory based diff mechanism for git. The script relies on the diff.tool configuration option to determine what diff viewer is used. This script is compatible with all the forms used to specify a range of revisions to diff: 1) git diffall: shows diff between working tree and staged changes 2) git diffall --cached [<commit>]: shows diff between staged changes and HEAD (or other named commit) 3) git diffall <commit>: shows diff between working tree and named commit 4) git diffall <commit> <commit>: show diff between two named commits 5) git diffall <commit>..<commit>: same as above 6) git diffall <commit>...<commit>: show the changes on the branch containing and up to the second , starting at a common ancestor of both <commit> Note: all forms take an optional path limiter [--] [<path>] This script is based on an example provided by Thomas Rast on the Git list.


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

GitNdiff master~3 .

例如,比较三个签入前的主分支与当前工作树。

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

http://github.com/fschwiet/GitNdiff


meld有一个很好的特性,如果你在源代码控制下给它一个目录(Git、Mercurial、Subversion、Bazaar等),它会自动列出所有更改过的文件,你可以双击查看各个不同的文件。

在我看来,打字融合要容易得多。让它找出VCS,而不是配置VCS来启动meld。另外,无论你的项目使用什么VCS,你都可以使用相同的命令,如果你经常在它们之间切换,这是很棒的。

唯一的缺点是,meld扫描更改比从git/hg/svn传递更改要慢,尽管它是否慢到足以成为一个问题,这将取决于您如何使用它。


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

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


Git meld => https://github.com/wmanley/git-meld是一个很棒的脚本,它将在一个窗口中打开所有文件的整齐差异。


Diffuse也有VCS集成。它与大量其他VCS进行互操作,包括SVN、Mercurial、Bazaar……对于Git来说,如果部分更改(但不是全部更改)是阶段性的,它甚至会显示三个窗格。在冲突的情况下,甚至会有四个窗格。

使用

diffuse -m

在Git工作副本中。

要我说,这是十年来我见过的最好的视觉差异。(我也试过融合。)


下面使用meld和kdiff3

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

在您可以轻松浏览的窗口中打开所有文件。 可以在原点/分支名称的地方使用变更集吗

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


写了一个小工具,打开所有文件作为标签页在vim。

https://github.com/balki/vimtabdiff