默认的 git diff 行为是串行打开每个 diff 文件(在打开下一个文件之前等待前一个文件关闭)。
我正在寻找一种方法来一次打开所有文件 - 例如在 BeyondCompare 中,这将打开同一 BC 窗口中选项卡中的所有文件。
这将使审查一组复杂的更改变得更加容易;在差异文件之间来回滑动并忽略不重要的文件。
从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}"
)
以下答案适用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>]
这就是我决定的...
将以下代码复制到名为git-diffall
(无扩展名)的文件中:
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done
将文件放在cmd
git install 目录的文件夹中(例如C:\Program Files (x86)\Git\cmd
)
并像你一样使用git diff
:
git diffall
git diffall HEAD
git diffall --cached
git diffall rev1..rev2
etc...
注意:它的关键是&参数,它告诉外部 diff 命令在后台任务中运行,以便立即处理文件。在 BeyondCompare 的情况下,这将打开一个屏幕,每个文件都在其自己的选项卡中。
meld
有一个简洁的功能,如果你给它一个源代码控制下的目录(Git、Mercurial、Subversion、Bazaar 和可能的其他),它会自动列出所有更改的文件,你可以双击查看个体差异。
meld .
IMO 键入并让它找出 VCS 比将 VCS 配置为启动要容易得多meld
。另外,无论您的项目碰巧使用什么 VCS,您都可以使用相同的命令,如果您经常在它们之间切换,那就太好了。
唯一的缺点是,meld 扫描更改比从 git/hg/svn 传递更改要慢,尽管它是否慢到足以成为问题将取决于你如何使用它,我敢肯定。
git meld
=> https://github.com/wmanley/git-meld是一个很棒的脚本,它将在一个窗口中打开所有文件的简洁差异。
注意到这里Araxis Merge 有一个“-nowait”命令选项:
-nowait 防止比较等待关闭比较
也许这会返回一个立即退出代码并且会起作用,有人经历过吗?找不到 BeyondCompare 的类似选项...
Diffuse还具有 VCS 集成。它与大量其他 VCS 互操作,包括 SVN、Mercurial、Bazaar ……对于 Git,如果部分但不是全部更改都已上演,它甚至会显示三个窗格。在发生冲突的情况下,甚至会有四个窗格。
调用它
diffuse -m
在你的 Git 工作副本中。
如果你问我,十年来我见过的最好的视觉效果。(我也尝试过融合。)
以下适用于 meld 和 kdiff3
git difftool --dir-diff origin/branch1..origin/branch2
在您可以轻松浏览的窗口中打开所有文件。可以与变更集一起使用来代替 origin/branch-name
例如:git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1
如果您只想打开当前修改的所有文件,请尝试以下操作:
vi $(git status | sed -n '/.*modified: */s///p')
如果您正在提交“复杂的更改集”,您可能需要重新考虑您的工作流程。git 的一个非常好的特性是它使开发人员可以轻松地将复杂的更改集减少为一系列简单的补丁。与其尝试编辑当前修改的所有文件,不如查看
git add --patch这将允许您有选择地展示帅哥。
我编写了一个 powershell 脚本,它将复制两个工作树并与 DiffMerge 进行比较。所以你可以这样做:
GitNdiff master~3 .
例如,将三个签入前的主分支与当前工作树进行比较。
它闪亮而新,可能充满了错误。一个缺点是工作树中尚未添加的文件会被复制到两个工作树中。它也可能很慢。
对于那些对在带有 Araxis 的 Mac OS X 上使用 git-diffall 感兴趣的人,我在 github 上创建了 git-diffall 项目,并添加了一个包装 Araxis Merge 命令的 AppleScript。araxisgitdiff
注意:这是对 Mac OS X 的 Araxis Merge 附带的文件的稍微修改的克隆。
您可以使用gitk并同时查看所有差异