Git Merge时main分支被合并分支覆盖问题及分支优化咨询
问题分析与解决方案
为什么合并后main分支内容被直接覆盖?
问题出在两个分支的修改差异类型上:
- 你从完成作业的
main分支切出linkedListUpdate后,直接用教授的新模板完全替换了原作业文件,相当于把整个文件的内容彻底换掉了 - 而
main分支只做了个无关紧要的注释修改,属于很小的增量变动
Git合并时会对比三个版本:共同祖先(切分支时的main,也就是你写完作业的版本)、main的最新版(作业加注释修改)、linkedListUpdate的最新版(教授新模板)。对于那些被完全替换的文件,Git会判定linkedListUpdate的修改是更彻底的更新,而main的注释改动可以忽略,所以直接用了新模板的内容,没触发冲突。
怎么强制触发合并冲突,避免自动覆盖?
改注释的方法确实太牵强,这里有两个更靠谱的办法:
方法1:用git merge的强制参数
执行命令:
git merge --no-ff --no-commit linkedListUpdate
--no-ff:不管Git觉得能不能快进合并,都强制生成一个合并提交,确保分支历史是分叉的,不会把linkedListUpdate的提交直接接到main上--no-commit:合并后不自动提交,让你先检查结果,如果有自动合并的内容不符合预期,可以手动调整,或者直接触发冲突处理流程
方法2:给linkedListUpdate分支加个冲突触发提交
在覆盖新模板之前,先对原作业文件做一处核心修改,再提交,最后再覆盖新模板:
- 切到分支:
git checkout -b linkedListUpdate - 修改原作业里的核心内容(比如把核心函数名改了,或者删几行关键代码),然后提交:
git add . && git commit -m "temp change to force conflict" - 把教授的新模板覆盖进来,再提交:
git add . && git commit -m "added professor's updated template" - 切回
main合并:git merge linkedListUpdate
这样Git会明确看到两个分支对同一文件有根本性的修改,必然触发冲突,让你手动解决。
更适合这个场景的工作流
其实针对教授更新作业模板的情况,用上游同步的方式更合理:
- 把教授的仓库设为上游远程:
git remote add upstream <教授的仓库地址> - 拉取教授的最新代码:
git fetch upstream - 基于教授的最新模板创建新分支:
git checkout -b new_assignment upstream/main - 把你原来的作业合并到这个新分支里:
git merge main,这时候自然会触发冲突,你就可以一步步把自己的代码适配到新模板里。
内容的提问来源于stack exchange,提问作者Michael Marais
相关产品推荐
相关产品推荐

