目录里翻半天,不如把这套流程刻进脑子里。Git冲突这块,很多人一看到 CONFLICT 字样就慌,尤其2026年AI生成代码大量进入日常开发之后,冲突频率肉眼可见地上升。这篇文章我把merge和rebase两种冲突的手动解决最短流程拆开讲透,顺便聊聊为什么AI写的代码特别容易撞车,以及我自己踩过的一些坑。
1. Git冲突到底是怎么产生的——先搞清楚原理再动手
1.1 冲突的本质:同一位置的两种修改
Git合并说白了就是把两个分支的改动合到一起,冲突的本质是“两个人改了同一个地方,Git不知道该听谁的”。
举个具体的例子。你和同事都在改 userService.java,你在自己分支把第42行 validateEmail() 改成了 validateEmailWithRetry(),同事在主分支把同一行的参数从 String email 改成了 User user。合并的时候Git发现同一行出现了两个不同版本,它没法替你决策,只能停下来问你:这行到底用谁的?
这个“停下来问你”的过程,就是冲突。
我经常用一句话跟新人解释:冲突不是错误,而是Git在行使它的职责——它检测到了并行的修改,把决策权交还给人。 真正的问题不是冲突本身,而是很多人不知道怎么高效地处理它,导致合并现场变成事故现场。
从Git底层的角度看,合并不是简单的“文件对比”,而是三路合并(three-way merge)。Git会比较三个版本:你的版本(ours)、对方的版本(theirs)、以及两个分支的共同祖先(base)。只有当base版本和两个分支版本都不相同,且你的修改和对方的修改在相邻或相同区域时,才会产生冲突。
理解了这个原理,你就知道为什么有时候改动看起来“八竿子打不着”也会冲突——因为Git的冲突检测单位是“块”(hunk),而不是“行”。你改了第45行,对方改了第48行,如果这两处属于同一个hunk的上下文范围,Git也可能判定为冲突。
1.2 merge冲突和rebase冲突的区别
很多人搞不清merge和rebase到底选哪个,更搞不清两者冲突时的区别。我直接说结论:
merge是把另一条分支的改动“带回来”,rebase是把你的改动“搬过去”。
具体到冲突表现上:
- merge冲突:通常发生在合并那一刻,冲突来源是你和对方分支上都有对方的“新代码”,解决一次就行。合并完成后会生成一个 merge commit,历史呈分叉状。
- rebase冲突:是把你的提交逐个“回放”到目标分支之上,如果你的分支上有3个提交都改了同一个文件,那可能在rebase过程中遇到3次冲突,需要反复解决。
举个例子,你从 main 切出 feature-branch 后提交了3次,此时 main 上别人也提交了2次。你用 git merge main,只需要处理一次冲突,生成一个合并提交;你用 git rebase main,Git会把你那3个提交拆开,逐个重新应用到 main 的最新提交之上——如果三个提交都改了同一个区域,你就得处理三次,甚至第一次解决了、第二次又冲突。
从经验上讲,rebase冲突往往更琐碎,但解决完之后的提交历史是干净的线性结构,这对追求整洁历史的团队很有吸引力。我的建议是:如果分支改动较少、冲突面小,用rebase保持历史干净;如果改动量大、跨文件多,用merge更省心。
1.3 2026年AI生成代码为什么更容易冲突
现在聊一个2026年特别现实的问题——AI生成代码大量进入仓库之后,冲突频率确实上升了。这不只是感觉,背后有结构性的原因。
第一,AI生成代码的特征是“大块重写”。你让AI加一个功能,它可能不是小修小补,而是把整个函数、整个类甚至整个模块重写一遍。这种大范围的改动,天然容易和别人的局部修改撞车。
第二,AI生成的代码风格一致性高,但结构随机性强。两个人分别让AI生成实现同一功能的代码,AI可能给出完全不同的命名、结构拆分方式,导致文件的绝大多数行都变了。这种情况下,Git的hunk合并几乎必然冲突。
第三,AI代码里常常包含样板式的重复结构。比如一个服务类里每个方法都长得很像,AI批量生成时会把相似代码复制粘贴进去。两个人各自让AI添加不同方法时,Git可能把新增代码判定为“同一区域的修改”,产生非常莫名其妙的冲突。
第四,也是我感受最深的一点:AI生成的代码往往改变了原来代码的上下文。 比如你原来有个工具类有20个方法,别人在前面加了1个方法,你让AI在文件里加了1个方法。AI生成的代码把原本的缩进、注释、空行都格式化了一遍,导致Git认为整个文件都被你改了。这种冲突最烦人,因为看起来满屏都是 <<<<<<< 和 >>>>>>>,但实际真正需要保留的改动可能只有几行。
理解了这层背景,你就明白为什么2026年的开发者必须把“手动解决Git冲突”这项基本功练扎实。接下来的篇幅,我把最短流程一步一步拆给你看。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决冲突前的必备操作——状态查看与操作回退
2.1 冲突发生后第一步干什么
不要急着改文件。冲突发生后,先做的事情只有一件:搞清楚当前处于什么状态。
用 git status 看一眼输出,Git会明确告诉你哪些文件有冲突。以merge为例,输出大概是:
bash复制$ git status
On branch feature-branch
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified
