Bitbucket手动回退代码后Pull Request未显示差异问题求助
核心原因:Git差异计算与合并逻辑的差异
1. PR差异的计算逻辑
Bitbucket默认的PR差异是基于源分支与目标分支的最近共同祖先(merge base)来计算的,显示的是源分支相对于merge base的净变更。在你的场景中:
- 你的
my-feature-branch提交历史:初始提交 → 你的功能代码 → 合并staging-branch(引入feature-xyz) → 回退feature-xyz的提交 develop提交历史:初始提交 → ... → 合并feature-xyz
两者的merge base是my-feature-branch从develop切出时的初始提交。从merge base到my-feature-branch的路径中,“添加feature-xyz”和“回退feature-xyz”是两个反向操作,Git会判定这部分的净变更为0,因此不会在PR差异中显示。
2. Git合并的逻辑
合并操作是按提交历史逐个应用变更,而非只看净变更。当你将my-feature-branch合并到develop时,Git会把所有提交(包括回退feature-xyz的那个)依次应用到develop上。由于develop此时已经包含feature-xyz的变更,回退提交会直接删除这些代码,导致最终develop中的feature-xyz被移除。
解决方案
切换PR对比方式
在Bitbucket的PR页面中,找到对比选项(通常在差异视图顶部),切换为**“源分支 vs 目标分支当前状态”**的直接对比。此时会显示my-feature-branch与最新develop的差异——也就是你回退feature-xyz的删除操作。合并最新develop到你的分支再发起PR
在发起PR前,执行以下操作:git checkout my-feature-branch git pull origin develop git push origin my-feature-branch这样会更新你的分支与
develop的merge base为最新的develop提交,PR差异会准确显示你的分支相对于develop的所有变更(包括回退操作)。优化分支协作流程
避免直接拉取staging-branch到个人功能分支,而是从develop拉取最新代码。团队的staging-branch仅用于验证,代码合并应通过develop流转,减少无关变更引入个人分支的概率。
内容的提问来源于stack exchange,提问作者continuousLearner

