Github UI 当文件从一个分支签出到另一个分支时,似乎没有跟踪分支之间的差异

Github UI does not seem to track differences between branches when files are checked out from one branch to another

我的场景是这样的:

  1. 我在 Github.
  2. 有一个开发分支 (dev) 和一个生产分支 (prod)
  3. 在我的 CLI 中,我从 prod 分支出来,检查 dev 的一组更改,并将这些更改合并到 prod(并推送到 Github )
  4. 在 Github 网络 UI 中,如果我随后以 dev 作为来源创建到 prod 的拉取请求,它不会显示我所做的更改已经从dev中挑选出来;它似乎遵循 dev 从未与 prod 合并的逻辑,因此忽略了我刚刚从 dev 中挑选出来并与 prod 合并的变更集。

谁能解释一下这背后的逻辑?这对我的团队来说非常混乱,因为我们定期检查 dev 的更改并将它们合并到 prod,但是 Github 显示所有这些差异尚未合并到来自 devprod。所以在我们看来,dev 分支与 prod 分支严重不同步,而实际上,prod 分支已经包含了大部分 dev 更改。

注意到 git CLI 反映了预期的变化:在命令行上比较两个分支时,我看到 devprod 之间非常接近。 Github 网络 UI 似乎在遵循自己的逻辑。

在从dev(源分支)到prod(目标分支)的拉取请求中,或者在Gitlab的合并请求中,或者在Gerrit的挂起更改中(与其他 2 个),UI 上显示的差异是 git diff prod...dev 的结果。关于git diff prod..dev(相当于git diff prod dev)和git diff prod...dev的区别,阅读this question.

prod...devdevprod 的合并基础与 dev 进行比较。 devprod 的合并基础是 2 个分支的最新共同提交。你可以通过 git merge-base dev prod 获得它。合并基础可以被认为是 devprod 分支出来的分叉点,反之亦然。它显示了自 dev.

上的分叉点以来更改了哪些代码

假设您在提交时从 prod 创建了 dev 并稍后对其进行处理。在您将 dev 合并回 prod 之前,其他开发人员可能会不断更新 prod。要查看自 fork 点以来您所做的更改,git diff prod dev 不是一个好方法。考虑一种边缘情况,其中 prod 已被其他人更新为与您的 dev 完全相同的状态。如果它使用 git diff prod dev,则不会打印任何内容,因为它们具有完全相同的代码。说你什么都没做是不公平的。但是,git diff prod...dev 会显示您的作品。

要按预期显示 UI 上的差异,您可以 运行 git checkout dev && git pull origin -r prod && git push origin -f devdev 重新设置为最新的 prod。这样,新的合并基数正好是prod。现在 git diff prod...devgit diff prod..dev 有相同的结果。