>[success] # 简单的冲突
1. 当你在编写代码时候已将将代码 `commit` 到本地仓库
2. 你的同事手快先提交了一次代码到了远程
3. 此时你本地仓库和远程仓库就会差一个历史版本
4. 当你提交自己本地仓库到远程,就会产生一次常见的冲突(不修改同一个文件相同位置)
* **远端仓库上含有本地仓库没有的内容,所以这次 push 被拒绝了**
![](https://img.kancloud.cn/7e/85/7e85e5b6abab7b0f94ed5f751c22d70b_573x164.png)
* **解决**:**先用 pull 把远端仓库上的新内容取回到本地和本地合并(此时本地和远程版本一致),然后再把合并后的本地仓库向远端仓库推送**,这次`pull`就完成了:远端仓库被取到了本地,**并和本地仓库进行了合并**。在这个时候,就可以再`push`一次了。由于现在本地仓库已经包含了所有远端仓库的 commits,所以这次`push`不会再失败
* **原理**: 这次`pull`操作发现不仅远端仓库包含本地没有的`commit`,本地仓库也包含远端没有的`commit`,就会把远端和本地的独有`commit`进行合并,自动生成一个新的`commit`,`push`提交时候也会带上这次合并的提交到远程
* **总结**:一个项目通常会有多个人进行协作开发,那么存在多人不确定时间的push,那么在你push以前,就先pull一下代码,确认本地仓库已经同步了中央仓库的更新内容后,然后在push提交就可以了
>[success] # 合并冲突(分支合并 和 他人代码合并)
`merge`在做合并的时候,是有一定的自动合并能力的:如果一个分支改了 A 文件,另一个分支改了 B 文件,那么合并后就是既改 A 也改 B,这个动作会自动完成;如果两个分支都改了同一个文件,但一个改的是第 1 行,另一个改的是第 2 行,那么合并后就是第 1 行和第 2 行都改,也是自动完成
![](https://img.kancloud.cn/0e/8a/0e8abb369ab9fcd1a95e7a6fc3c8d029_660x402.gif)
![](https://img.kancloud.cn/21/2d/212dae94411f607f8b174b4d626220a0_636x418.gif)
* **如果修同一文件同一行产生冲突**,下图 `a.js` 发生了合并冲突,要求 "fix conflicts and then commit the result"(把冲突解决掉后提交)
![](https://img.kancloud.cn/0c/cc/0ccc9a87c1b36d50c4ddc60bfe5a8ed4_530x88.png)
冲突文件会被git 记录**用符号标记出了它们的边界以及它们的出处**,现在要做的就是选择你要合并的内容
![](https://img.kancloud.cn/ee/a6/eea6ccd732ec194e7af22d5ec3d0ab56_603x147.png)
横向对比冲突 会对具体行显示会更清楚点
![](https://img.kancloud.cn/b6/e5/b6e5b070d21c36041ae221f0368f9640_772x64.png)
这次只想保存自己忽略合并过来的代码经过修改后,只需要将这个文件手动提交即可,`git add .` 在` git commit -m '解决冲突'`
![](https://img.kancloud.cn/e5/0a/e50a612c5e7e428a1fc6b896ba1871cf_351x73.png)
*****
**冲突我就是不会解决** 可以放弃本次合并 `git merge --abort`,Git 仓库就会回到`merge`前的状态