两个人修改了同一段代码,Git 不知道该保留哪一份,就可能出现冲突。我们需要打开文件,整理成正确的代码,再提交。

下面以把主分支 main 的最新代码合入自己的 feature/profile 分支为例。操作时,把分支名和文件路径换成项目中实际使用的名称。

1. 获取最新代码并合并

先运行 git status,确认没有尚未提交的改动。有的话,先提交自己的工作,再继续:

1
2
3
git switch feature/profile  # 切换到自己的开发分支
git fetch origin # 获取远程最新代码
git merge origin/main # 将主分支合入当前分支

origin 是远程仓库的常用名称,origin/main 代表获取到的远程主分支。

如果出现 CONFLICT,说明有冲突。运行下面的命令查看文件列表:

1
git status

其中标记为 both modified(双方都修改)的文件需要处理。没有冲突时,可以跳过修改步骤,验证代码后推送。

2. 打开文件,修改冲突内容

假设 src/profile.ts 中出现了下面的内容:

1
2
3
4
5
<<<<<<< HEAD
export const name = "新用户";
=======
export const name = "匿名用户";
>>>>>>> origin/main

在本次合并中:

  • <<<<<<< HEAD 到 ======= 之间,是自己当前分支的代码。
  • ======= 到 >>>>>>> origin/main 之间,是主分支的代码。

如果需求确定使用“匿名用户”,就把上面整段改成:

1
export const name = "匿名用户";

最终要保留正确的代码,并删除冲突标记。 如果双方的功能都需要,就手动整合;拿不准时,找修改这段代码的同事确认,不要直接覆盖。

使用 VS Code 更方便

打开冲突文件后,可以点击对应按钮:

按钮 作用
Accept Current Change 保留当前分支的这段代码
Accept Incoming Change 保留主分支传入的这段代码
Accept Both Changes 两段都保留,还需要自己整理

例如,上面的代码如果选择“两段都保留”,就会重复声明 name,仍然需要手动修改。按钮只是帮你编辑代码,不能判断哪种结果正确。

3. 检查并提交

处理完文件后保存,再告诉 Git 这个文件已解决:

1
2
git add src/profile.ts
git status

如果有多个冲突文件,逐个修改并执行 git add。确认 git status 不再列出未解决的文件,再检查本次提交内容:

1
git diff --cached

运行项目已有的测试或构建,确认功能正常后提交并推送:

1
2
git commit -m "Merge main and resolve conflicts"
git push origin feature/profile

如果已经创建了 PR(合并请求),推送后它会自动更新。如果仍提示冲突,检查主分支是否又有新提交,重新获取并合并。

想取消这次合并?

如果还在解决冲突、尚未完成合并提交,可以执行:

1
git merge --abort

这会放弃本次合并和冲突处理结果。需要保留的手动修改,先另存一份。