误在已合并至master的abc分支提交本地代码,如何迁移至master?
这事我熟!你现在的情况是本地abc分支有两次未推送的提交,而远程abc已经合并到master,且master还有新更新。要把这两次提交转移到当前master的HEAD上,用git cherry-pick是最直接的方案,步骤给你列清楚:
第一步:获取目标提交的哈希值
先确保你在abc分支上(如果不在,执行git checkout abc),然后运行:git log --oneline这个命令会显示简短的提交记录,你需要记下那两次本地提交的哈希值(比如看起来像
a1b2c3和d4e5f6的字符串,注意要按提交的先后顺序,先提交的在前)。第二步:切换到最新的master分支
切换到master并拉取远程最新的更新,确保本地master和远程同步:git checkout master git pull origin master第三步:将目标提交应用到master
用cherry-pick把刚才记下的两个提交依次应用到当前master上:git cherry-pick [第一个提交哈希] [第二个提交哈希]注意:如果cherry-pick过程中出现冲突,Git会暂停操作提示你解决冲突。解决完冲突后,执行
git add .标记冲突已解决,然后运行git cherry-pick --continue继续完成操作;如果想跳过某个提交,用git cherry-pick --skip;如果要彻底放弃cherry-pick,用git cherry-pick --abort。第四步:验证并推送(可选)
完成cherry-pick后,用git log检查提交记录是否正确,确认没问题后可以推送到远程master:git push origin master第五步:清理本地abc分支(可选)
既然远程abc已经合并到master,且你需要的提交已经迁移,本地abc分支可以删除:git branch -D abc
替代方案:用rebase迁移提交
如果abc分支上除了这两次提交,其余历史都已经合并到master,你也可以用rebase来迁移:
- 找到abc分支上最后一个已经合并到master的提交哈希(比如用
git log --oneline master..abc可以看到abc上独有的提交,取倒数第三个的哈希) - 运行:
git rebase --onto master [上述哈希] abc - 切换到master并合并abc分支:
git checkout master git merge abc
这个方案适合需要迁移连续多个提交的场景,但cherry-pick更适合你这种明确知道要迁移哪两个提交的情况。
内容的提问来源于stack exchange,提问作者Kevin Buchs

