Git分支疑问:基于新分支的Pull Request包含先前分支提交如何处理?
嘿,刚从IBM RTC转Git确实容易碰到这类分支管理的小问题,我来帮你搞定这个PR包含多余提交的情况~
为什么会出现这个问题?
你的新分支是基于自己fork仓库的master分支创建的,而这个master已经有了commit-1、commit-2(这些原仓库的master还没有合并)。当你给原仓库开PR时,Git会对比「原仓库master」和「你的新分支」的差异,自然就把这两个旧commit也包含进去了。
解决方案
这里给你两种常用的解决办法,你可以根据自己的情况选:
方案一:重新创建干净的分支(推荐,适合新分支修改不多的情况)
这种方法最稳妥,不会搞乱提交历史:
- 先把原仓库设为上游仓库(如果还没设置的话),并拉取最新代码:
git remote add upstream <原仓库的Git地址> git fetch upstream master - 基于原仓库的master创建一个全新的干净分支:
git checkout -b fresh-feature-branch upstream/master - 把你新分支里的commit-3迁移过来,用
cherry-pick最方便:# 先切换回原来的新分支,复制commit-3的哈希值,再切回来执行 git cherry-pick <commit-3的哈希值> - 把这个干净的分支推送到你的fork仓库:
git push origin fresh-feature-branch - 最后基于
fresh-feature-branch创建PR,这次就只会包含commit-3啦。
方案二:修复现有的新分支(适合新分支已有较多修改的情况)
如果不想重新建分支,可以通过变基(rebase)来调整分支的基点:
- 同样先拉取原仓库master的最新代码:
git fetch upstream master - 切换到你的现有新分支:
git checkout your-current-feature-branch - 执行交互式变基,把分支的起点移到原仓库master上:
git rebase -i upstream/master - 这时会弹出一个文本编辑器,里面列出了你的分支上所有的commit(包括commit-1、2、3)。你只需要保留commit-3:把commit-1和commit-2前面的
pick改成drop(或者直接删除这两行),然后保存退出。 - 因为变基修改了提交历史,需要强制推送到你的fork仓库:
git push origin your-current-feature-branch --force - 刷新PR页面,就能看到PR里只剩下commit-3了。
小贴士:避免以后再踩坑
从RTC转Git后,记得不要在自己fork的master分支上直接写代码!正确的姿势是:
- 每次开发前,先把自己fork的master和原仓库master同步;
- 基于同步后的master创建新分支来开发;
- 开发完成后,基于这个新分支开PR到原仓库。
同步fork的master的命令:
git checkout master git fetch upstream master git merge upstream/master git push origin master
内容的提问来源于stack exchange,提问作者LppEdd
相关产品推荐
相关产品推荐

