GitHub pull请求显示已经在目标分支中的提交

lob*_*ati 99 git merge commit github pull-request

我正在尝试将GitHub上的拉取请求检查到非主的分支.目标分支在master之后,pull请求显示master的提交,所以我合并master并将其推送到GitHub,但是它们的提交和差异仍然在刷新后出现在pull请求中.我加倍检查GitHub上的分支是否有来自master的提交.为什么他们仍然出现在拉动请求中?

我还在本地检查了pull请求,它只显示了未合并的提交.

Ada*_*hip 82

看起来Pull Request没有跟踪目标分支的变化(我联系了GitHub支持,并于2014年11月18日收到回复,说明这是设计的).

但是,您可以通过执行以下操作让它向您显示更新的更改:

http://githuburl/org/repo/compare/targetbranch...currentbranch
Run Code Online (Sandbox Code Playgroud)

更换githuburl,org,repo,targetbranch,和currentbranch需要.

或者正如在他的回答中指出的hexsprite,您也可以通过单击EditPR并临时将基数更改为其他分支并再次返回来强制更新.这会产生警告:

你确定要改变基数吗?

旧基础分支的某些提交可能会从时间线中删除,旧的审核评论可能会过时.

并将在PR中留下两个日志条目:

在此输入图像描述

  • 有没有**亲爱的github**请求改变这个? (8认同)
  • 是的,我在一段时间后联系了支持并得到了相同的回复.他们没有针对这种情况进行优化.这有点令人沮丧.我们解决这个问题的方法就是改变并强制推动,或者关闭拉动并创建一个新的拉力. (3认同)
  • 查看我的评论以获得一个好的解决方法.您可以简单地使用PR编辑按钮切换到另一个分支,然后返回到原始基本分支,它将重新计算差异. (3认同)
  • 这个答案并没有解决问题,只是让用户看到真正的差异. (2认同)
  • 问题是"为什么他们仍然出现在拉动请求中?".它回答了这个问题. (2认同)
  • 在我们的例子中,比较 URL 仍然显示目标分支中已存在的更改。 (2认同)
  • @JSoet行为没有改变,我刚刚复制了它.请参阅https://github.com/amillerchip/merge-test/pull/1.提交07d3349"添加更多文本"显示在PR中,即使它存在于目标分支中:https://github.com/amillerchip/merge-test/commits/first_branch但是使用比较可以看到正确的差异网址:https://github.com/amillerchip/merge-test/compare/first_branch...second_branch (2认同)
  • 使用上述解决方法@hexsprite时,请确保选择一个分支以切换到与当前分支具有相同历史记录的分支,否则Github将自动关闭PR并不允许您重新打开它,因为“ XX分支没有相同历史记录与YY” (2认同)
  • 这个问题已经6年了。github 方面是否有任何人知道的升级来改变这种行为?当有多个 PR 互为后代且审阅者尚未合并其中任何一个时,就会发生这种情况。按时间顺序合并它们不会更新子分支的 PR 差异。 (2认同)
  • 令我失望的是,六年后这个问题仍未得到解决。我已经向 Github 支持开具了一张请求状态更新的票证(票证 ID:398652),我鼓励其他希望看到此问题得到解决的人继续以礼貌和专业的方式做同样的事情。作为一个在技术支持部门工作过的人,我很难过地提出这样的建议,但我们在这里。 (2认同)
  • 我用其他分支重新建立了分支,之后打开另一个 PR 时仍然显示更改。任何人? (2认同)

hex*_*ite 53

这是一个很好的解决方法.Edit在GitHub中查看PR时使用按钮将基本分支更改为其他内容master.然后将其切换回master,现在它将正确显示最近提交的更改.

  • 这似乎对我不起作用,它只是添加了我将基本分支更改为其他内容然后返回主分支的信息。CFR:https://github.com/europeana/search/pull/30 (15认同)
  • 不管怎样,我刚才再次检查了这个解决方案,它仍然有效。Calvin 的问题是目标存储库正在压缩他的 PR,因此添加到目标存储库的提交与他的提交不同。他应该每次都重置他的“master”分支,而不是合并上游压缩的提交,从而有效地复制所有提交。 (10认同)
  • 谢谢,这对我有用。理想情况下,Github 应该自动执行此操作,或者应该像 Azure Devops SCM 上那样提供更新选项 (7认同)
  • 这对我不起作用。我最终回到了开始时的相同位置。 (7认同)
  • 我很惊讶更多的人不承认这个解决方案。我怀疑原来的过时的拉取请求就可以了,但我不喜欢 GitHub 显示所有过时的文件,所以我使用了这个,它既保留了注释,又只显示了要合并的实际更改。谢谢! (5认同)
  • 我确认直到今天这仍然是这种行为。如果这按预期工作(即在 PR 打开时“冻结”分支的状态),Github 应该添加刷新分支的选项,而无需“编辑”解决方法,这是 Gitlab 中的默认行为。对于那些说解决方法不适合他们的人:确保提交哈希值相同;有时,在某些合并场景中可以更改提交哈希,这可能会导致 difftool 无法正确比较——无论如何,我希望并且可能希望如此。 (2认同)

Mat*_*ski 23

总而言之,GitHub不会在拉取请求中自动重新设置提交历史记录.最简单的解决方案是:

解决方案1:Rebase

假设你要合并到master来自feature-01:

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force
Run Code Online (Sandbox Code Playgroud)

如果你正在使用fork,那么你可能需要替换origin上面的upstream.请参阅如何更新GitHub分叉存储库?了解有关跟踪原始存储库的远程分支的更多信息.

解决方案2:创建新的拉取请求

假设你要合并的前奏master,从feature-01:

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased
Run Code Online (Sandbox Code Playgroud)

现在打开一个拉取请求feature-01-rebased并关闭一个feature-01.

  • 重新设置基础会更改提交哈希,是否最终会浪费现有的评论? (4认同)
  • 或者使用 --force-with-lease 代替 --force ,因为我认为如果有人在存储库中更改了您的分支,这将安全地退出。 (4认同)
  • @haridsv 这不是我的经验。我经常在评审过程中重新调整基准,并且评论不会​​丢失。虽然我确实失去了公关变更的历史 (2认同)

Eli*_*ynn 13

解决这个问题的一种方法是git rebase targetbranch在PR中.然后git push --force targetbranch,Github将显示正确的提交和差异.如果你不知道自己在做什么,请小心.也许首先检查一个测试分支,然后git diff targetbranch确定它仍然是你想要的.

  • 或者使用 --force-with-lease 代替 --force ,因为我认为如果有人在存储库中更改了您的分支,这将安全地退出。 (2认同)

Dav*_*ess 11

对于遇到这种并且被GitHub Pull Request行为混淆的其他人来说,根本原因是PR是源分支提示与源分支和目标分支的共同祖先的差异.因此,它将显示源分支上的所有更改,直到共同的祖先,并且不会考虑目标分支上可能发生的任何更改.

有关更多信息,请访问:https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

基于共同祖先的差异似乎很危险.我希望GitHub可以选择制作更标准的3路合并PR.

  • @G.One,回复真的很晚,但是是的 - 如果您从该主分支合并到源分支,则根据定义,您已经更新了共同的祖先。这是您从中合并的 master 上的提交。 (3认同)
  • 你提到的原因似乎是正确的,但我很困惑,因为通常每当 master 更新时,我都会将更改回合并到我的分支......**git checkout my-branch -> git merge master**。拉取请求会立即刷新。共同祖先也会更新吗? (2认同)
  • 进行重新基准而不是合并时,似乎会出现此现象 (2认同)

Ele*_*ena 10

您需要将以下内容添加到您的~/.gitconfig文件中:

[rebase]
    autosquash = true
Run Code Online (Sandbox Code Playgroud)

这将自动实现与此答案显示的相同.

我从这里得到了这个.

  • 该死的,我不小心点击了投票.这个答案对我有帮助.让我改变它. (2认同)
  • @RonaldRey git rebase 不是通用的解决方案,因为它涉及编辑历史记录。如果每个人都在开发从未被其他人克隆过的私有分支,那很好,但是一旦有人克隆了您的存储库,然后您编辑了历史记录,您就会得到不同的历史记录。 (2认同)

Hon*_*ney 9

我尝试了什么以及为什么会发生这种情况?

这些解决方案都不适合我。当我使用两个点ie..而不是...GH 上的差异时,它更接近我更改的内容。但仍然不完全是我的所有改变。

发生这种情况是因为 GitHub 显示合并更改的方式存在问题。最好的解释在这里

如果出现以下情况,基本上就会发生:

  1. 上推更改featureBranch
  2. 其合并到main
  3. 当我仍在本地时,featureBranch我将其与main. 进行更多更改并再次将其推高。
  4. 但后来在 GitHub 上我看到的变化比我预期的要多。

值得注意的是,这不是 git 问题。相反,这是一个 GitHub 问题。GitHub无法判断压缩的提交与非压缩提交的总和相同,并导致额外的差异。


解决方案

在本地 main 上,撤消并存储尚未与 main 合并的所有更改。为了做到这一点,我做到了。例如,如果我有 4 个不在我的 PR 中的提交被合并了,那么我会这样做:

  • git reset HEAD~4
  • git stash save "last 4 commits"

然后用您刚刚隐藏的内容创建一个新分支。脚步:

  • git checkout main
  • git checkout -b newBranch
  • git stash apply
  • git add --all
  • git commit -m "some message"
  • git push


ach*_*eye 5

当您从目标分支合并提交时,在GitHub上会发生这种情况。

我一直在使用壁球并与Github合并作为默认合并策略,包括来自目标分支的合并。这引入了一个新的提交,并且GitHub无法识别该压缩的提交与已经在master中的提交相同(但是具有不同的哈希值)。Git可以正确处理它,但是您会在GitHub上再次看到所有更改,这很烦人。解决方案是对这些拉入的上游提交进行定期合并,而不是压缩合并。当您想将另一个分支作为一个依赖项合并到您的分支中,git merge --squash并且在该分支实际成为master分支之后,在从master撤回之前还原该单个提交。

  • 谢谢@achille,这确实是我这边的问题。禁用挤压合并后问题就解决了。 (2认同)

use*_*282 5

使用 2-dot url 代替 3-dot url 进行比较

代替

http://githuburl/org/repo/compare/targetbranch...currentbranch
Run Code Online (Sandbox Code Playgroud)

http://githuburl/org/repo/compare/targetbranch..currentbranch
Run Code Online (Sandbox Code Playgroud)


Nas*_*zad 5

当 PR 通过选项合并时会发生这种情况Squash and merge。如果您希望旧的提交不显示在以下 PR 中,则只需将 PR 与Create a merge commit选项合并即可。

  • 创建合并提交
  • 挤压并合并
  • 变基和合并

在此输入图像描述

注意: 完成此操作后,下一个 PR 始终会显示自己的提交,而不是旧的提交,因为旧的 PR 已通过Create a merge commit选项添加到基础分支中。

技术说明: merge --squash 和 rebase 有什么区别?