@概述
- 当团队的两个不同成员A、B修改了同一文件的相同代码段并且改动不一致时,就形成了冲突;
- 在合并A、B二人的代码时,冲突就会爆发,必须先解决冲突,才能完成代码的合并工作;
- 冲突情形1:主分支合并AB二人的分支——主分支必须先解决冲突才能完成合并;
- 冲突情形2:A完成push后,B拉取A的分支——B必须先解决冲突才能完成对A的拉取;
- 冲突情形3:AB工作在同一分支(远程仓库已经同时持有了AB的公钥),A先push,B再push——B必须先解决冲突才能完成push的工作;
- 解决冲突时版本控制系统的重要组成部分;
- 冲突的解决方式是:删除冲突标记,然后将冲突部分的代码修改为意见一致的版本;
@冲突案例
- dev提交公共资源,后续由张全蛋和穆铁柱做出不一致的修改;
- 张全蛋拉取并修改公共资源
- 张全蛋提交并push分支
- 穆铁柱拉取并修改公共资源,意见与张全蛋不一致
- 穆铁柱提交并push分支,由于二人不在同一分支,此时冲突是不会爆发的,穆能够完成push动作;
- dev先合并张全蛋分支
- dev再合并穆铁柱分支,此时冲突会爆发,因为张穆二人意见不一致,无法完成合并;
- dev处理冲突:删除冲突标记、然后将代码修改为一个能够取得统一意见的版本;
- dev提交并push分支
@完整模拟过程
# dev提交公共资源
git checkout dev
git add best.py
git commit best.py -m 'dev提交公共资源best.py:“php是世界上最美丽的语言”'
# 张全蛋修改公共资源后push到自己的分支
git checkout zqd
git pull origin master
git add best.py
git commit best.py -m '张全蛋提交公共资源best.py:“张全蛋的php是世界上最美丽的语言”'
git push origin zqd
# 穆铁柱修改公共资源后也push到自己的分支,但意见与张全蛋不一致
git checkout mtz
git pull origin master
git add best.py
git commit best.py -m '穆铁柱提交公共资源best.py:“穆铁柱的php是世界上最美丽的语言”'
git push origin mtz
# dev试图合并张穆二人的分支
git checkout dev
# 合并张全蛋的分支,没有问题
git merge zqd
# 合并穆铁柱的分支,冲突爆发,必须先将best.py修改为意见一致的版本才能完成合并
git merge mtz
# dev修改了best.py为新的统一版本
# dev提交并push解决冲突后的best.py
git add best.py
git commit best.py -m 'dev提交公共资源best.py,解决了张穆冲突:“张全蛋和穆铁柱一起php是世界上最美丽的语言”'
git push origin dev
best.py的演化过程是下面这样的
# dev提交时的best.py
print('php是世界上最美丽的语言')
# 张全蛋push在自己分支上的的best.py
print('张全蛋的php是世界上最美丽的语言')
# 穆铁柱push在自己分支上的的best.py
print('穆铁柱的php是世界上最美丽的语言')
# dev合并了张分支后再合并穆分支时的best.py,代码以外的特殊标记就是系统所加的冲突标记
<<<<<<< HEAD
print('张全蛋的php是世界上最美丽的语言')
=======
print('穆铁柱的php是世界上最美丽的语言')
>>>>>>> mtz
# dev删除标记,统一意见后的best.py
print('张全蛋和穆铁柱一起php是世界上最美丽的语言')