能否用单条命令同时完成git reset --hard与cherry pick提交操作?
解决方案
你需要的效果可以通过git rebase带参数单条命令实现,无需手动创建备份分支。
前置操作
- 首先执行
git fetch origin拉取远程仓库最新代码,确保本地已经同步同事force push后的分支A最新版本 - 切换到你的功能分支X:
git checkout X
核心命令
场景1:明确知道X上你自己的提交数量
比如你在X上一共提交了3次,直接执行:
git rebase --onto origin/A HEAD~3
命令逻辑:
--onto origin/A指定新的基底为最新的远程分支AHEAD~3表示取当前分支最新的3个提交作为要迁移的内容
git会自动完成以下操作:
- 暂存你指定的3个本地提交
- 将当前X分支重置到最新的
origin/A版本 - 按顺序将暂存的3个提交应用到新的基底上
场景2:不清楚具体提交数量,自动识别独有提交
不用手动数提交数,直接执行带--fork-point参数的命令即可:
git rebase --onto origin/A --fork-point origin/A
命令逻辑:--fork-point参数会自动查询X分支和旧版本origin/A的分叉点,自动筛选出所有你在X上独有的提交进行迁移,适合提交次数多、记不清具体数量的场景,准确率更高。
冲突处理
如果迁移过程中出现冲突,属于你的代码和最新分支A的代码存在重叠修改的正常情况,和你之前cherry-pick遇到冲突的处理逻辑完全一致:
- 手动解决文件中的冲突内容
- 执行
git add <冲突文件名>标记冲突已解决 - 执行
git rebase --continue继续后续提交的迁移 - 若要终止本次操作,执行
git rebase --abort即可回退到操作前的状态,不会丢失任何提交
常见疑问
为什么之前直接执行
git rebase origin/A会出现大量多余冲突?
因为默认rebase会将旧版本分支A的提交和同事重写后的新版本分支A的提交都纳入比对范围,两边对同一文件的修改会被识别为冲突。而上述带参数的rebase命令只会迁移你自己在X上的提交,完全忽略新旧分支A的重叠变更,自然不会产生多余冲突。
内容的提问来源于stack exchange,提问作者Michael Očenášek
相关产品推荐
相关产品推荐

