忽略master分支的更改,比较rebase前后的Git分支差异

9

我希望能够查看分支自上次审核以来的更改,但忽略期间在主分支中发生的更改。

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

我有两个提交范围 c3af8fc5..7ccc4b49(用 B - G 表示)和 4dfdabdd..301a443c(用 E - I 表示)。
假设你正在为你的同事进行代码审查,你在本地检出了他的分支,现在你的 HEAD 指向 G。你完成了代码审查并继续做其他事情。
一段时间过去了,主分支出现了新的提交 (C, DE),你的同事已经解决了你的审查意见。他将更改压缩为提交 FG,因为他重命名了在 F 中引入的方法,并修复了其在 G 中的使用。他还将分支重新基于主分支,以确保一切正常。
现在你想再次进行代码审查,但是你懒得再次对整个分支进行审查,所以你只想看看上次以来有什么变化。你仍然在本地获取了旧的引用。你该怎么办?
你可以像这样执行 git-diff G I,但这也会显示主分支中的更改,这对你没有任何帮助。
你也可以将旧引用基于当前主分支进行变基,然后再进行差异比较。这可能有所帮助,但也可能会产生很多冲突,这可能会使重新审查整个分支更容易。
我已经尝试过diffing patches
diff <(git-diff c3af8fc5...7ccc4b49) <(git-diff 4dfdabdd...301a443c)

它帮助我将注意力集中在某个地方,但很粗糙。

您知道任何更好的、更本地的解决这个问题的方法吗?谢谢。


编辑:我刚刚发现了interdiff,它可以更好地比较两个差异。

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

但是,它仍然缺乏Git可能提供的上下文——那么...有更好的选择吗?


Git 只能显示两个提交之间的差异。看起来你想要一个差异的差异,所以 Git 不能做到这一点。 - poke
我知道,但是git有改变的上下文,它可以巧妙地生成两个diff的差异。 - Filip Procházka
3
注意:语法 c3af8fc5...7ccc4b49git diff 中表示应找到 c3af8fc57ccc4b49合并基础,然后将该提交记录(无论是什么)与7ccc4b49 进行比较。这可能不是您想要的结果。请注意,git diff X..Y(两个点与三个点)的含义完全相同,而git diff X Ygit diff X...Y具有此特殊的仅差异含义。 - torek
我无法理解你在这里尝试实现什么。你只展示了两个分支引用,GI。你是想暗示从图表中看出主分支当前在E吗?如果是这样,那么你想要理解的F-GH-I之间的关系是什么?(即为什么在标题中说“变基前后”?) - LightCC
我尝试提供更好的解释。这有帮助吗? - Filip Procházka
显示剩余5条评论
2个回答

12

干得好!git rang-diff(使用Git 2.19+,2018年Q3)非常棒。+1 - VonC
仅供参考:我不得不反转较长版本的顺序,以使输出相同。 git range-diff c3af8fc5..7ccc4b49 4dfdabdd..301a443c 变成了 git range-diff 4dfdabdd..301a443c c3af8fc5..7ccc4b49 - Will Bender

3
最简单的方法可能是:通过视觉比较差异。
启动两个差异查看器,并在想要查看来自重新基于版本的内容时进行比较。
# 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
)

你也可以在本地尝试将 B..G 变基到 E 的基础上,如果没有触发太多冲突,然后查看差异:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接