Git rebase 前后的 diff 分支忽略 master 中的变化

Git diff branch before and after rebase ignoring changes in master

我希望能够看到自上次审查以来分支中的更改,但忽略了同时发生的 master 中的更改。

     F - G       H - I
    /           /
A - B - C - D - E

我有两个提交范围c3af8fc5..7ccc4b49(由B - G表示)和4dfdabdd..301a443c(由E - I表示)。


想象一下,您正在为您的同事进行代码审查,您检查了他在本地的分支,而您的 HEAD 现在指向 G。您进行代码审查并继续做其他事情。

一段时间过去了,master 中出现了新的提交(CDE),您的同事已经解决了您评论中的评论。他压缩了对提交 FG 的更改,因为他重命名了 F 中引入的方法并修复了 G 中的用法。他还重新将分支建立在 master 上,以确保一切正常。

现在你想再次进行代码审查,但你又懒得对整个分支再次进行代码审查,所以你只想看看与上次相比发生了什么变化。您仍然可以在本地获取旧引用。你是做什么的?

你可以做类似 git-diff G I 的事情,但那也会告诉你 master 中的改变对你没有任何帮助。

您还可以将旧引用重新设置为当前主控的基准,然后对它们进行比较。这可能会有所帮助,但也可能存在很多冲突,这可能会使再次审查整个分支变得更容易。


我试过了diffing patches

diff <(git-diff c3af8fc5...7ccc4b49) <(git-diff 4dfdabdd...301a443c)

它帮助我将注意力转移到某个地方,但它非常粗糙。

你知道解决这个问题的更好、更原生的方法吗?谢谢。


编辑:我刚刚 discovered interdiff,这使得比较两个差异变得更好

interdiff <(git-diff -U100 c3af8fc5...7ccc4b49) <(git-diff -U100 4dfdabdd...301a443c)  | colordiff

但是,它仍然缺少 git 可能提供的上下文 - 那么...还有什么更好的吗?

最简单的方法可能是:直观比较差异

启动两个差异查看器,并在您想查看重新定位的修订版的内容时比较这两个视图:

# view the "old" patch :
git difftool -d B G

# view the "new" patch :
git difftool -d H I

您只能关注修改过的文件:

git diff --name-only B G

会列出B到G之间修改过的文件名

您可以仅定位修改过的文件,例如:

# compare G and I,
# looking only at files modified between B and G, or between E and I :
git difftool -d G I -- $(
    git diff --name-only B G; git diff --name-only E I
)

您也可以尝试在本地计算机上 E 之上重新设置 B..G,如果它不会触发太多冲突,然后查看差异:

git checkout G

# as an option, you can make a temporary branch :
git checkout -b wip/G

# rebase on the tip of 'master' :
git rebase E

# look at the diff between "rebased G" and I
git difftool -d wip/G I

所以解决方案是使用新的git range-diff

简单地 运行 git range-diff c3af8fc5..7ccc4b49 4dfdabdd..301a443c,或者更简单的 git range-diff 7ccc4b49...301a443c 可能会起作用,除非你做了一些非常疯狂的 rebase。

为了更好的解释,我参考了一些相关主题