266

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

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

这将使审查一组复杂的更改变得更加容易;在差异文件之间来回滑动并忽略不重要的文件。

4

12 回答 12

239

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 mail list上也提出了同样的问题。

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

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

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

以下是项目描述:

git-diffall 脚本为 git 提供了基于目录的差异机制。该脚本依赖于 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>]

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

于 2010-04-30T17:04:00.173 回答
64

这就是我决定的...

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

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

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

并像你一样使用git diff

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

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

于 2009-08-18T03:04:30.110 回答
23

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

meld .IMO 键入并让它找出 VCS 比将 VCS 配置为启动要容易得多meld。另外,无论您的项目碰巧使用什么 VCS,您都可以使用相同的命令,如果您经常在它们之间切换,那就太好了。

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

于 2010-11-16T07:01:41.217 回答
3

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

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

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

于 2009-08-03T00:58:14.233 回答
3

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

于 2011-10-18T05:26:03.813 回答
2

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

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

也许这会返回一个立即退出代码并且会起作用,有人经历过吗?找不到 BeyondCompare 的类似选项...

于 2009-08-04T04:10:34.150 回答
2

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

带有分阶段和非分阶段编辑的漫反射屏幕截图

调用它

diffuse -m

在你的 Git 工作副本中。

如果你问我,十年来我见过的最好的视觉效果。(我也尝试过融合。)

于 2012-10-24T21:18:56.250 回答
2

以下适用于 meld 和 kdiff3

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

在您可以轻松浏览的窗口中打开所有文件。可以与变更集一起使用来代替 origin/branch-name

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

于 2018-06-29T19:26:50.227 回答
1

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

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

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

git add --patch
这将允许您有选择地展示帅哥。

于 2009-08-11T11:30:06.493 回答
1

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

GitNdiff master~3 .

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

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

http://github.com/fschwiet/GitNdiff

于 2010-07-01T16:09:14.377 回答
1

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

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

于 2011-02-17T10:54:37.797 回答
-2

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

于 2009-08-11T02:50:41.720 回答