为何GitHub中从master到feature分支的PR却将feature合并至master?
我们使用GitHub作为代码仓库,此前在某feature分支上开发已久,完成后准备创建Pull Request进行代码评审。为便于后续将feature分支合并至master分支,我创建了compare为master、base为feature分支的Pull Request,解决2个合并冲突后点击了“Squash and merge”。但随后发现feature分支被合并到了master分支,Pull Request页面显示“iliev-ivaylo merged 7 commits into feature/
一、现象原因
核心是你搞反了GitHub Pull Request里base和compare分支的逻辑:
- GitHub PR的规则是:把
compare分支的代码合并到base分支——base是最终要接收代码的目标分支,compare是提供代码的源分支。 - 你原本想把feature合并到master,应该设置
base: master、compare: feature,但你搞反成了base: feature、compare: master,这意味着PR的预设操作是把master的代码合并到feature。
而提交记录和PR页面显示矛盾的原因,是你在解决冲突的过程中误操作了:要么是本地切换到master分支后执行了git merge feature并推送到远程,要么是在GitHub上处理冲突时触发了反向合并,导致master分支被意外合并了feature的代码。PR页面的信息是基于你最初错误设置的分支关系,所以和实际提交记录出现了偏差。
二、撤销master分支的错误提交
分两种场景处理:
场景1:错误提交还没被其他开发者拉取
这种情况可以直接重置分支历史,操作步骤:
- 切换到master分支:
git checkout master - 用
git log --oneline查看提交记录,找到错误提交的上一个正常提交的哈希值 - 硬重置到该提交:
git reset --hard <正常提交哈希值> - 强制推送到远程:
git push origin master --force
⚠️ 注意:强制推送会覆盖远程master的历史,必须确保没有其他人已经拉取了错误的提交版本。
场景2:错误提交已被其他开发者拉取
这种情况不能硬重置(会导致他人本地分支和远程冲突),必须用安全的方式撤销:
- 切换到master分支:
git checkout master - 用
git log --oneline找到错误合并提交的哈希值 - 执行revert操作:
git revert -m 1 <合并提交哈希值>(-m 1表示保留master分支的原始代码,抵消合并进来的feature代码) - 推送到远程:
git push origin master
三、git revert是否合适
git revert的适用性取决于分支的公开状态:
- 如果错误提交还没被他人拉取:用
git reset --hard更直接,能彻底清除错误提交,保持分支历史干净。 - 如果错误提交已经被公开(他人已拉取):git revert是最合适的方式——它不会修改已有的历史记录,而是生成一个新提交来抵消错误变更,不会影响其他开发者的本地工作。
总的来说,git revert是多人协作场景下的安全选择,适合处理已经公开的错误提交。
内容的提问来源于stack exchange,提问作者Ivajlo Iliev

