master分支落后合并致特性丢失,如何保留branchA的变更?
嘿,这种合并后搞丢同事代码的坑我太熟了,咱们一步步把你的branchA变更安全迁移到最新的master上,完全不会影响其他人的工作:
第一步:确保本地master是最新状态
先切换到master分支,拉取远程最新的代码,保证我们的操作基于最完整的版本:
git checkout master git pull origin master
第二步:创建干净的新分支,基于最新master
咱们新建一个分支(比如叫branchA-clean),用来存放你在branchA里的有效变更,避免和之前混乱的合并历史纠缠:
git checkout -b branchA-clean master
第三步:把branchA的专属变更移植到新分支
这里有两种可靠的方法,选你觉得顺手的就行:
方法一:用Cherry-pick精准提取你的提交
如果你记得branchA在合并branchB之前的最后一个提交哈希(或者能在git日志里找到,比如用git log --oneline branchA查看),假设那个提交是abc123,那咱们把从这个提交到branchA最新的所有变更摘到新分支:
git cherry-pick abc123..branchA
提示:如果遇到冲突,解决完冲突后执行
git cherry-pick --continue继续即可;如果某个提交不需要,用git cherry-pick --skip跳过。
方法二:用Rebase剥离branchB的旧内容
如果不确定合并前的提交,或者你的提交都是在branchB合并之后新增的,直接用rebase --onto命令,自动把branchA中不属于branchB的变更移到master顶端:
git rebase --onto master branchB branchA
注意:这个命令会改写branchA的历史,如果branchA已经推送到远程,建议先和团队沟通,或者优先用方法一;冲突解决后执行
git rebase --continue。
第四步:合并干净的分支到master
当branchA-clean分支里只有你的变更,且和最新master没有冲突后,就可以安全合并了:
git checkout master git merge branchA-clean
后续避免踩坑的建议
以后再合并分支前,记得先把落后的分支(比如branchB)同步到最新master:
git checkout branchB git rebase master # 解决冲突后推送到远程(如果需要) git push origin branchB --force-with-lease
再把同步后的branchB合并到branchA,这样branchA的历史就会很干净,合并到master时就不会出现覆盖同事代码的问题了。
内容的提问来源于stack exchange,提问作者user6728767

