问题描述
我的场景是这样的:
- 我在 Github 中有一个开发分支 (
dev
) 和一个生产分支 (prod
)。 - 在我的 CLI 中,我从
prod
分支,从dev
检出一组更改,并将这些更改合并到prod
(并推送到 Github) - 在 Github 网络用户界面中,如果我随后以
prod
作为源创建对dev
的拉取请求,它不会显示我已经从dev
中挑选出的更改;它似乎遵循dev
从未与prod
合并的逻辑,因此忽略了我刚刚从dev
中挑选出来并与prod
合并的变更集。立>
有人能解释一下这背后的逻辑吗?这让我的团队感到非常困惑,因为我们定期检查 dev
的更改并将它们合并到 prod
,但 Github 将所有这些差异显示在来自 dev
的拉取请求中尚未合并到prod
。因此在我们看来,dev
分支与 prod
分支严重不同步,而实际上,prod
分支已经包含大部分 dev
更改。
注意到 git CLI 反映了预期的变化:在命令行上比较两个分支时,我看到 dev
和 prod
之间的奇偶校验。 Github Web 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...dev
将 dev
和 prod
的合并基础与 dev
进行比较。 dev
和 prod
的合并基础是 2 个分支的最新共同提交。您可以通过 git merge-base dev prod
获取。合并基可以被认为是 dev
从 prod
分支的分叉点,反之亦然。它显示了自 dev
上的分叉点以来已更改的代码。
假设您在提交时从 dev
创建 prod
,然后对其进行处理。在您将 dev
合并回 prod
之前,其他开发者可能会不断更新 prod
。要查看自分叉点以来您发生了什么变化,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 dev
将 dev
重新定位到最新的 prod
。这样,新的合并基础就是 prod
。现在 git diff prod...dev
和 git diff prod..dev
具有相同的结果。