【问题标题】:Git diff branch before and after rebase ignoring changes in mastergit diff分支之前和之后rebase忽略master的变化
【发布时间】:2017-10-06 19:15:22
【问题描述】:

我希望能够看到分支中的更改,因为我上次查看了它,但忽略了同时发生的 master 中的更改。

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

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


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

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

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

您可以执行git-diff G I 之类的操作,但这也会向您展示 master 中发生了什么变化,而这对您毫无帮助。

您还可以在当前主服务器上重新设置旧的 refs,然后对它们进行比较。这可能会有所帮助,但也可能会出现很多冲突,这可能会使再次审查整个分支变得更加容易。


我试过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 可能提供的上下文 - 所以......还有什么更好的吗?

【问题讨论】:

  • Git 只能显示两次提交之间的差异。听起来你想要一个 diff 的 diff,所以这不是 Git 可以做的。
  • 我知道,但是 git 有变化的上下文,它可以巧妙地生成两个差异的差异。
  • 但是那会是什么样子呢?我什至无法直观地想到它。
  • 我不知道,这就是我打开这个问题的原因:)
  • 注意:语法c3af8fc5...7ccc4b49 意味着,对于git diff,它应该找到c3af8fc57ccc4b49合并基,然后区分针对7ccc4b49 提交(无论是什么)。这可能不是你想要的。请注意,git diff X..Y(两个点对三个点)的含义与git diff X Y 完全相同,而git diff X...Y 具有这种特殊的、仅区别的含义。

标签: git diff


【解决方案1】:

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

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

为了更好的解释,我引用了一些相关的主题

【讨论】:

  • 干得好! git rang-diff(使用 Git 2.19+,2018 年第三季度)摇滚。 +1
  • 请注意:我必须颠倒较长版本的顺序才能使输出相同。 git range-diff c3af8fc5..7ccc4b49 4dfdabdd..301a443c 变成了 git range-diff 4dfdabdd..301a443c c3af8fc5..7ccc4b49
【解决方案2】:

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

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

# 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

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2012-07-26
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2012-06-27
    • 2022-11-10
    相关资源
    最近更新 更多