我正在尝试将GitHub上的拉取请求检查到非主的分支。目标分支在master之后,pull请求显示master的提交,所以我合并master并将其推送到GitHub,但是它们的提交和差异仍然在刷新后出现在pull请求中。我加倍检查GitHub上的分支是否有来自master的提交。为什么他们仍然出现在拉动请求中?
我还在本地检查了pull请求,它只显示了未合并的提交。
看起来Pull Request没有跟踪目标分支的变化(我联系了GitHub支持,并于2014年11月18日收到回复,说明这是设计的)。
但是,您可以通过执行以下操作让它向您显示更新的更改:
http://githuburl/org/repo/compare/targetbranch...currentbranch
根据需要替换githuburl
,org
,repo
,targetbranch
和currentbranch
。
或者作为hexsprite在他的回答中指出,您也可以通过单击PR上的编辑并临时将基础更改为其他分支并再次返回来强制更新。这会产生警告:
你确定要改变基数吗?
旧基础分支的某些提交可能会从时间线中删除,旧的审核评论可能会过时。
这是一个很好的解决方法。在GitHub中查看PR时使用Edit
按钮将基本分支更改为master
以外的其他分支。然后将其切换回master
,现在它将正确显示最近提交的更改。
总而言之,GitHub不会在拉取请求中自动重新设置提交历史记录。最简单的解决方案是:
假设您要从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?。
假设您要合并来自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
的请求。
解决这个问题的一种方法是在PR中加入git rebase targetbranch
。然后git push --force targetbranch
,然后Github将显示正确的提交和差异。如果你不知道自己在做什么,请小心。也许先检查一个测试分支,然后再进行qasexswpoi,以确保它仍然是你想要的。
对于遇到这种并且被GitHub Pull Request行为混淆的其他人来说,根本原因是PR是源分支提示与源分支和目标分支的共同祖先的差异。因此,它将显示源分支上的所有更改,直到共同的祖先,并且不会考虑目标分支上可能发生的任何更改。
更多信息请点击此处:git diff targetbranch
基于共同祖先的差异似乎很危险。我希望GitHub可以选择制作更标准的3路合并PR。
您需要将以下内容添加到https://developer.atlassian.com/blog/2015/01/a-better-pull-request/文件中:
~/.gitconfig
这将自动实现与[rebase]
autosquash = true
显示的相同。
我从this answer得到了这个。
当您压缩从目标分支合并的提交时,GitHub会发生这种情况。
我一直在使用squash并与Github合并作为默认合并策略,包括来自目标分支的合并。这引入了一个新的提交,GitHub没有认识到这个压缩的提交与已经在master中的提交相同(但是具有不同的哈希值)。 Git正确处理它,但你在GitHub中再次看到所有的变化,让审查变得烦人。解决方案是定期合并这些拉入上游提交而不是压缩和合并。如果你想在另一个分支中合并为你的依赖项,here并在从master获取之前恢复那个单一的提交,而其他分支实际上已经使它成为主。
我不完全确定这背后的理论。但我多次这样做,并通过执行以下操作来解决这个问题。
git merge --squash
这将从原始repo master分支获取并合并更改(如果你有指向那个)
然后,您将更改强制推送到github克隆的存储库(目标)
git pull --rebase
这将确保您的github克隆和您的父repo处于相同的github提交级别,并且您没有看到跨分支的任何不必要的更改。
如果您太担心搞乱事情,请采用故障安全方法:转到文件并手动删除更改,然后使用上次提交进行压缩
git push -f origin master
我没有冲突,你很高兴!