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 中出现了新的提交(C
、D
和 E
),您的同事已经解决了您评论中的评论。他压缩了对提交 F
和 G
的更改,因为他重命名了 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。
为了更好的解释,我参考了一些相关主题
我希望能够看到自上次审查以来分支中的更改,但忽略了同时发生的 master 中的更改。
F - G H - I
/ /
A - B - C - D - E
我有两个提交范围c3af8fc5..7ccc4b49
(由B - G
表示)和4dfdabdd..301a443c
(由E - I
表示)。
想象一下,您正在为您的同事进行代码审查,您检查了他在本地的分支,而您的 HEAD
现在指向 G
。您进行代码审查并继续做其他事情。
一段时间过去了,master 中出现了新的提交(C
、D
和 E
),您的同事已经解决了您评论中的评论。他压缩了对提交 F
和 G
的更改,因为他重命名了 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。
为了更好的解释,我参考了一些相关主题