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

问题描述 投票:85回答:9

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

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

git github merge commit pull-request
9个回答
75
投票

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

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

http://githuburl/org/repo/compare/targetbranch...currentbranch

根据需要替换githuburlorgrepotargetbranchcurrentbranch

或者作为hexsprite在他的回答中指出,您也可以通过单击PR上的编辑并临时将基础更改为其他分支并再次返回来强制更新。这会产生警告:

你确定要改变基数吗?

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

公关中的leave two log entries

enter image description here


41
投票

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


19
投票

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

Solution 1: Rebase

假设您要从master合并到feature-01

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

如果你正在使用fork,那么你可能需要用origin替换上面的upstream。有关跟踪原始存储库的远程分支的详细信息,请参阅How do I update a GitHub forked repository?

Solution 2: Create a new pull request

假设您要合并来自master的介绍feature-01

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased

现在打开feature-01-rebased的拉动请求并关闭feature-01的请求。


13
投票

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


8
投票

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

更多信息请点击此处:git diff targetbranch

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


7
投票

您需要将以下内容添加到https://developer.atlassian.com/blog/2015/01/a-better-pull-request/文件中:

~/.gitconfig

这将自动实现与[rebase] autosquash = true 显示的相同。

我从this answer得到了这个。


2
投票

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

我一直在使用squash并与Github合并作为默认合并策略,包括来自目标分支的合并。这引入了一个新的提交,GitHub没有认识到这个压缩的提交与已经在master中的提交相同(但是具有不同的哈希值)。 Git正确处理它,但你在GitHub中再次看到所有的变化,让审查变得烦人。解决方案是定期合并这些拉入上游提交而不是压缩和合并。如果你想在另一个分支中合并为你的依赖项,here并在从master获取之前恢复那个单一的提交,而其他分支实际上已经使它成为主。


0
投票

我不完全确定这背后的理论。但我多次这样做,并通过执行以下操作来解决这个问题。

git merge --squash

这将从原始repo master分支获取并合并更改(如果你有指向那个)

然后,您将更改强制推送到github克隆的存储库(目标)

git pull --rebase

这将确保您的github克隆和您的父repo处于相同的github提交级别,并且您没有看到跨分支的任何不必要的更改。


-1
投票

如果您太担心搞乱事情,请采用故障安全方法:转到文件并手动删除更改,然后使用上次提交进行压缩

git push -f origin master

我没有冲突,你很高兴!

© www.soinside.com 2019 - 2024. All rights reserved.