为什么我的分支和开发之间的所有差异都没有显示在 PR 中?

Why aren't all of the differences between my branch and dev showing in the PR?

上周我将一个功能分支合并到我们的开发分支中进行测试。测试人员发现了一个错误,所以我再次从 dev 分支来修复它。昨天,合并被恢复,因为它没有及时发布。做了一些修改后,我在那个新分支上开了一个新的 PR。现在,在 GitHub Files changed 选项卡中,它只显示较新的修订版(~50 行而不是实际的 ~1000 行)。

查看 dev 和 myBranch 上的文件,我确认更改已成功还原并且仅存在于 myBranch 上。

git diff dev..myBranch 仅显示较新的修订版,但 git diff <latest-dev-commit-hash>..<latest-myBranch-commit-hash> 显示文件之间的所有差异。

在我看来,差异是由提交而不是实际差异来衡量的。我可以强制 GitHub 比较每个文件并更新 PR,以便审阅者可以看到所有差异吗?

由于还原的工作方式,这是一个常见问题。一旦得到解释,它就非常有道理,但在此之前它并不直观......(tl;dr: 看一眼下面的粗体句子以获取有关原因的提示。)

当你还原一个提交时,你创建了一个 new 提交,它与原始提交相反,所以实际上它是一个撤销,但现在你有 2 个提交:一个执行 X,然后撤消 X。以正确的顺序在同一分支上一起执行,这 2 次提交无效。

当你恢复一个 merge 提交时(通常是从一个完成的 PR 中恢复到第一个父级),你在做同样的事情,但是这次你在做一个新的单一提交,它反转了该合并(或 PR)带来的所有提交。一个有趣的旁注是,如果您的合并(或 PR)仅包含 1 个新提交,那么无论您恢复该提交还是合并提交都不会产生影响;结果是一样的。一旦合并中有超过 1 个提交,与单独恢复合并分支中的所有提交相比,通常更容易恢复合并提交。

稍后当您决定要将您的分支重新带回时,就会出现混乱。也许你决定你确实想要你的代码,或者你修复了一个错误并添加了一个新的提交(你的场景)。无论哪种方式,当您尝试再次重新合并您的分支时,您的提交都不会出现! 原因是因为这些提交已经在目标分支上,所以新的合并无法将它们引入再次

那你能做什么?您有以下选项:

  1. 还原还原。有时这是有道理的。在 nextpu(来自 gitworkflow)等一次性集成分支上,我可能会选择它。如果您在永久分支上执行此操作,请善待并在提交详细信息中解释到底发生了什么,因为还原的还原令人困惑,不知道原因。
  2. 重写您分支上的提交 ID。您可能知道可以使用 git merge --no-ff some-branch 强制合并提交,但是您知道您也可以使用 rebase 强制重写吗?语法相同:git rebase --no-ff commit-ID 其中“commit-ID”是您分支上第一个提交的父级(通常是您的分支和目标分支的合并基础)。所有这一切都是接受你的提交并“现在”重写它们,这只会改变提交 ID(以及提交者日期和作者),就像你进行常规 rebase 一样。
  3. 在另一个分支上重写提交 ID。我想不出一个好的用例,但从概念上讲,有些人发现它更容易理解,因为他们对 rebase 命令持谨慎态度。从您的起点创建一个新分支,切换到它(检查它),然后从您的分支中挑选每个提交到新分支。这将重写提交 ID,您甚至可以通过这样的一系列提交一次完成所有操作:git cherry-pick parent-of-first-commit..last-commit (Update:一个潜在的通用用例如果您想从无法重写的受保护分支引入还原的提交,或者在还原的提交之后有您不希望重写的提交。)

完成这些选项后,再次尝试合并,您的提交将显示在 PR 中。