变基后推送feature分支时偶尔混入他人提交,原因何在?
核心问题本质
变基本身是把你的feature分支提交重放到最新master的顶端,正常情况下只会包含你自己的X类修改,不会把master里的Y类提交带到feature分支。出现随机带代码的情况,肯定是操作环节的疏漏,以下是常见原因:
冲突解决时误提交了master的内容
执行git rebase master如果遇到冲突,不管是命令行还是IDE界面,解决冲突时很容易误把master分支上Y类的改动保留并提交。比如对比冲突文件时,不小心选中了master的版本,或者直接用IDE的“接受所有master修改”选项,导致Y类的改动被加到了你的feature分支提交里。这种情况只有遇到冲突才会发生,所以看起来是“随机出现”。拉取master时的分支或追踪错误
切到master分支后,先执行git branch确认当前分支确实是master(避免切到类似master-dev的同名分支);另外git pull最好明确指定远程分支:git pull origin master,防止本地master和远程master的追踪关系失效,拉取了错误的内容,后续变基时把无关代码带进来。IDE的自动操作干扰
部分IDE会在切换分支、拉取代码时自动处理未暂存的修改,比如你在feature分支上有未提交的改动,切换到master时IDE自动把这些改动暂存/提交,拉取master后又切回feature,此时这些改动可能和master的Y类内容混在一起,最后变基时被一起推送。变基后错误的推送方式
变基会重写本地feature的提交历史,此时如果远程feature分支有其他人的提交(你没注意到),执行推送时IDE会提示冲突。如果误选了“合并远程分支”而不是强制推送,就会把master的Y类内容和远程feature的内容合并,看起来像是你推送了他人代码。
标准操作流程(避免踩坑)
- 确保feature分支的所有修改都已提交:
git add . git commit -m "完成X类修改" - 切换到master并拉取最新代码:
git checkout master git pull origin master - 切回feature分支执行变基:
git checkout feature git rebase master- 遇到冲突时,只保留自己X类的修改,解决后执行
git rebase --continue;如果变基出问题,直接用git rebase --abort重来
- 遇到冲突时,只保留自己X类的修改,解决后执行
- 变基完成后强制推送到远程feature(因为历史已重写):
git push -f origin feature
内容的提问来源于stack exchange,提问作者Mat23

