git - 当文件从一个分支检出到另一个分支时,Github UI 似乎没有跟踪分支之间的差异
问题描述
我的情况是这样的:
- 我在 Github 中有一个开发分支 (
dev
) 和一个生产分支 ( )。prod
- 在我的 CLI 中,我从 中分支出来
prod
,从中签出一组更改dev
,并将更改合并到prod
(并推送到 Github) - 在 Github Web UI 中,如果我随后创建一个
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
,请阅读此问题。
prod...dev
比较 和 的dev
合并prod
基数dev
。dev
和的合并基础prod
是 2 个分支的最新共同提交。你可以得到它git merge-base dev prod
。合并基础可以被认为dev
是分支的分支点,prod
反之亦然。它显示了自 fork point on 以来更改了哪些代码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
得到了同样的结果。
推荐阅读
- javascript - 重新加载使用 ajax 填充的 DataTables 的缓存
- java - 是否从 BufferedInputStream 构造 ZipInputStream
- sed - 如何替换固定长度的字母数字字符?
- c - 如何在 C 中使用 fscanf 检查匹配失败
- css - 如何关闭导航栏的物化默认阴影
- android - Activity 1 调用 Activity 2 并从 Activity 2 获取字符串结果
- python - 无法使用 Postgres、Docker Compose 和 Psycopg2 将主机名“db”转换为地址
- oracle - 如何将用户定义的表类型作为参数传递给游标?
- php - Laravel API Post 返回登录屏幕
- ruby - 在 Ruby 中使用 creek 跳过读取 EXCEL 文件的第一行