Git合并origin master分支后丢失本地最新代码,如何同时保留双方改动?
问题原因排查
- 优先检查分支名拼写问题:合并操作的第4步执行的命令为
git checkout fearure-1,和实际开发的功能分支名feature-1存在拼写偏差。如果本地不存在fearure-1分支,部分Git版本会默认基于当前的master分支创建全新的同名空分支,此时执行git merge master不会产生任何有效内容变化,你原本在feature-1分支的改动自然不会出现在当前分支上,这是概率最高的诱因。 - 若确认分支切换操作无误,丢失改动是因为Git默认的递归合并策略对代码改动的优先级判断出现偏差,自动合并时误将master分支的内容判定为更新版本,覆盖了你的本地改动。
本次丢失改动的恢复方法
- 先切换回正确的功能分支:执行
git checkout feature-1 - 查看分支提交日志找到你最后一次提交的哈希值:执行
git log --oneline,记录你自己提交的最新commit哈希值 - 执行回退操作到合并前的状态:
git reset --hard <你自己的最新commit哈希值>,注意该操作会丢弃合并后产生的所有未保存改动,执行前确认没有需要留存的内容。
后续同时保留两边改动的操作方案
方案一:带检查的合并操作
执行合并时关闭自动提交,手动校验合并结果后再完成提交,从根源避免自动覆盖问题,操作步骤如下:
- 同步远程最新的master分支内容
git fetch origin git checkout master git pull origin master
- 切换回功能分支,执行带参数的合并命令
git checkout feature-1 git merge --no-commit --no-ff master
- 此时Git会将合并结果放在工作区但不自动提交,你可以逐文件检查改动,确认自己的代码和master的改动都正确保留、没有异常覆盖后,再执行
git commit提交合并结果。如果检查过程中发现有改动被误覆盖,可以手动修改对应文件后再提交。
方案二:使用变基操作同步改动
如果你希望功能分支的提交记录更干净,可以用变基代替合并,操作如下:
git fetch origin git checkout feature-1 git rebase origin/master
变基过程中如果出现冲突,Git会逐个提交暂停等待你解决冲突,解决完成后执行git add <冲突文件>,再执行git rebase --continue直到所有变基操作完成。变基完成后你的提交会排在master所有新提交的后面,不会产生额外的合并提交记录,改动也不会被自动覆盖。
内容的提问来源于stack exchange,提问作者DS9
相关产品推荐
相关产品推荐

