Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GitHub拉请求,显示已在目标分支中的提交_Git_Github_Merge_Commit_Pull Request - Fatal编程技术网

GitHub拉请求,显示已在目标分支中的提交

GitHub拉请求,显示已在目标分支中的提交,git,github,merge,commit,pull-request,Git,Github,Merge,Commit,Pull Request,我正在尝试查看GitHub上的一个拉入请求,该请求指向一个非主分支。目标分支位于master之后,pull请求显示来自master的提交,因此我合并了master并将其推送到GitHub,但刷新后,它们的提交和差异仍然出现在pull请求中。我已经仔细检查了GitHub上的分支是否有来自master的提交。为什么它们仍然出现在pull请求中 我也在本地签出了pull请求,它只显示了未合并的提交。看起来pull请求没有跟踪对目标分支的更改(我联系了GitHub支持部门,并在2014年11月18日收到

我正在尝试查看GitHub上的一个拉入请求,该请求指向一个非主分支。目标分支位于master之后,pull请求显示来自master的提交,因此我合并了master并将其推送到GitHub,但刷新后,它们的提交和差异仍然出现在pull请求中。我已经仔细检查了GitHub上的分支是否有来自master的提交。为什么它们仍然出现在pull请求中


我也在本地签出了pull请求,它只显示了未合并的提交。

看起来pull请求没有跟踪对目标分支的更改(我联系了GitHub支持部门,并在2014年11月18日收到一份回复,称这是出于设计)

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

http://githuburl/org/repo/compare/targetbranch...currentbranch
根据需要更换
githuburl
org
repo
targetbranch
,以及
currentbranch

或者,正如hexsprite在他的回答中指出的那样,您也可以通过单击PR上的“编辑”并临时将基础更改为另一个分支,然后再次更改来强制更新它。这将产生警告:

您确定要更改基数吗?

来自旧基分支的某些提交可能会从 时间线,旧的审查意见可能会过时

并将在公共关系中:


对于遇到此问题并被GitHub Pull请求行为弄糊涂的任何其他人来说,根本原因是PR是源分支尖端与源分支和目标分支的共同祖先之间的差异。因此,它将显示源分支上直到公共祖先的所有更改,并且不会考虑目标分支上可能发生的任何更改

更多信息请参见:


基于共同祖先的差异似乎很危险。我希望GitHub能有一个选项来创建一个更标准的基于3路合并的PR。

解决这个问题的一个方法是
git在该PR中重新设置targetbranch
。然后
git push--force targetbranch
,然后GitHub将显示正确的提交和差异。如果不知道自己在做什么,请小心。可能先签出一个测试分支以进行重新基础,然后再签出git diff targetbranch,以确保它仍然是您想要的

我不太清楚这背后的理论。但是,我得到了这几次,并能够修复这一点,通过执行以下操作

git pull --rebase
这将从原始回购主分支获取并合并更改(如果您有此点)

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


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

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

[rebase]
    autosquash = true
这将自动实现与所显示内容相同的效果


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

解决方案1:重新设置基础 假设您想从
feature-01
合并到
master

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force
git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased
如果您正在使用fork,则可能需要将上面的
origin
替换为
上游
。有关跟踪原始存储库的远程分支的详细信息,请参阅

解决方案2:创建新的拉取请求 假设您希望合并来自
feature-01
的简介
主版本

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

现在打开
feature-01-rebased
的拉取请求,关闭
feature-01
的拉取请求,这是一个很好的解决方法。在GitHub中查看PR时,使用
Edit
按钮将基本分支更改为
master
以外的内容。然后将其切换回
master
,此时它将仅正确显示最近提交的更改。

如果您太担心事情会弄糟,请使用故障保护方法: 转到该文件并手动删除更改,然后使用

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

我没有冲突,你可以走了

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

我一直在使用与Github的挤压和合并作为默认合并策略,包括来自目标分支的合并。这引入了一个新的提交,GitHub不知道这个压缩的提交与master中已经存在的提交相同(但使用不同的哈希)。Git正确地处理了它,但是您在GitHub中再次看到所有的更改,这让查看变得很烦人。解决方案是定期合并这些拉入的上游提交,而不是挤压合并。当您想将另一个分支作为依赖项合并到您的分支中时,
git merge--squash
,并在另一个分支实际到达主分支之前,在从主分支提取之前恢复该单个提交


编辑:另一种解决方案是重设基准并强制推送。清除但重写的历史记录

请逐个尝试以下命令

git pull "latest

git reset --hard master

我找到了一种获得正确行为的方法(在2020年11月进行了测试)


git merge
和解决冲突后,需要使用
git merge--continue
而不是
git commit…

而不是3点url使用2点url进行比较

而不是

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


是的,我不久前联系了支持部门,得到了同样的回复。他们没有针对这种情况进行优化。这有点令人沮丧。我们解决这个问题的方法是重新设置基址并强制俯卧撑,或者关闭拉动并创建一个新的。这个答案并不能解决问题,但只允许用户看到真正的差异。问题是“为什么它们仍然出现在拉动请求中?”。它回答了这个问题。请查看我的评论,了解一个好的解决方法。您只需使用PR编辑按钮切换到另一个分支,然后返回到原始基础br