说明
在采用 merge 方式合并时,不是任何时候都会合并成功,有时会在合并时产生冲突。我们来看如何解决这种合并冲突的问题。
有这样的一个场景:
开发一个项目,大家都是团队协作一起开发。某天,开发人员 A 和测试人员 B 都
clone
了远程代码库,开发人员 A 首先追加了某个文件最后一行的内容,且推送到了远程代码库成功。此时测试人员 B 也编辑这个文件,也在该文件的末尾追加了一行,push
推到远程代码库直接报错。尝试pull
与本地的仓库进行合并,发现是 control.txt 在相同的行数大家内容不一致。一般这种情况下都需要和其他人协商,以谁的修改内容为准,修改后重新commit
、push
即可。这种git
合并冲突在项目中非常常见,当然也与项目负责人的协调性有关系,他是不是将各个模块的开发人员的工作分配到位,否则冲突都需要去协商解决。
如下图所示:
本地仓库模拟合并冲突
步骤一:在 master 分支的最新提交记录上新创建一个分支
PS > cd E:\git-test\
PS > git branch
* master
PS > ls
Directory: E:\git-test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2025/3/15 10:55 36 control.txt
-a--- 2025/3/9 21:31 39 lab-file.txt
-a--- 2025/3/12 17:08 11 start.log
-a--- 2025/3/9 21:31 12 Tmp-File.txt
PS > git log --oneline
6f4b5d9 (HEAD -> master) 对文件control.txt的第三行进行追加
33fca75 新增文件control.txt
4be932e newb1分支中的第一个新文件
8a77771 修改后的lab-file文件
f20abbc lab-file初始内容
47d9368 tmp-file.txt --> Tmp-File.txt
ae6cc9d First commit
9a70355 测试文件
PS > git switch -c features
Switched to a new branch 'features'
步骤二:在 features 分支下新增文件 error.log
PS > new-Item error.log
# `n 在 PowerShell 中表示换行
PS > echo "1111`nERROR`n3333" > error.log
PS > cat .\error.log
1111
ERROR
3333
PS > git add ./
PS > git commit -m "新增三行内容到新文件 error.log"
步骤三:在 master 分支下新增同名的 error.log 文件且第二行文件内容不一样
PS > git switch master
PS > new-Item error.log
PS > echo "1111`nNAME`n3333" > error.log
PS > cat .\error.log
1111
NAME
3333
PS > git add ./
PS > git commit -m "新文件 error.log"
步骤四:将 features 分支合并到 master 分支,出现合并冲突
PS > git switch master
PS > git merge features
Auto-merging error.log
CONFLICT (add/add): Merge conflict in error.log
Automatic merge failed; fix conflicts and then commit the result.
PS > cat .\error.log
1111
<<<<<<< HEAD
NAME
=======
ERROR
>>>>>>> features
3333
如文件所示的那样,会用 "=======" 分割两个分支的内容,其中 "<<<<<<<" 表示当前分支下的文件修改,">>>>>>>" 表示其他分支修改的内容,由于出现了合并冲突,Git 不知道以谁为准,需要人为解决冲突的内容。
步骤五:解决合并冲突
假设我是项目负责人,觉得两个分支下对该文件的修改都是合理的,所以我将保留两个分支下的修改:
# 用编辑器修改文件内容,其内容如下:
PS > cat .\error.log
1111
NAME
ERROR
3333
PS > git status
On branch master
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 added: error.log
no changes added to commit (use "git add" and/or "git commit -a")
# 重新提交一次
PS > git add ./
PS > git commit -m "人为解决 error.log 的合并冲突"
PS > git status
On branch master
nothing to commit, working tree clean
PS > ls
Directory: E:\git-test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2025/3/15 10:55 36 control.txt
-a--- 2025/3/15 11:22 25 error.log
-a--- 2025/3/9 21:31 39 lab-file.txt
-a--- 2025/3/12 17:08 11 start.log
-a--- 2025/3/9 21:31 12 Tmp-File.txt
PS > cat .\error.log
1111
NAME
ERROR
3333
步骤六:删除已经合并到上游的分支
PS > git branch -d features
PS > git branch
* master
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)

用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论