场景
多人协作开发同一个分支,远程分支进行push或者pull时,如果涉及到同一个文件的修改,会提示冲突
情景一:自己在本地开发完成,未提交到本地仓库,然后pull upstream时,提示冲突;
情景二:自己在本地开发完成,已提交到本地仓库,然后pull upstream时,提示冲突;
解决
场景一的解决demo
情景,aa/a.txt中的,bb=1
git status
image
修改本地的aa/a.txt中的,bb=3
在服务器也修改了aa/a.txt,bb=2
image
提交本地的代码到远程仓库
在服务器执行
git pull
image
此时,发生代码冲突
1 如果希望保存本地改动并拉下最新服务器代码,手动merge
(1)要保留服务器上的修改
git stash
image
git stash list将当前的Git栈信息打印出来
git stash list
image
stash@{0}就是刚才保存的标记
(2)暂存了本地修改之后,pull内容
git pull
image
(3)还原暂存的内容
git stash pop stash@{0}
image
系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突
(4)解决文件中冲突的的部分
打开冲突的文件
image
Updated upstream 和=====之间的内容就是pull下来的内容
====和stashed changes之间的内容就是本地修改的内容
这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容
直接编辑冲突了的文件(test.txt),把冲突标记删掉,把冲突解决正确
eg:
保留bb=2
保存退出
(5) 删除stash
git stash drop stash@{0}
清除0编号的stash
清除所有stash
git stash clear
image
image
(6)提交aa/a.txt的修改
git add aa/a.txt
image
image
修改本地的其他文件,并提交到远程仓库
服务器上拉取代码
image
将本地的a.txt,bb=5,提交代码,更新到远程仓库
image
按照(1)-(6)步骤处理冲突
如果希望服务器上版本完全覆盖本地修改,使用如下命令回退并更新
git reset --hard
git pull
场景二的解决demo
在master分支上给readme.md这样的文件,其中readme.md内容为空,并且提交到master分支上。
创建一个新的分支
git checkout -b "dev"
然后在dev分支下将readme.md这个文件内容修改为
我喜欢python
并且提交到dev分支上。然后切换到master分支上
git checkout master
我们在master分支上对readme.md进行修改,添加如下内容为
我喜欢java
并且提交到master分支上,
git add readme.md
git commit -m "master提交我喜欢java"
重点来了,此时,我们需要将dev分支中内容合并到master中,即
git merge dev
报错
[root@localhost learngit]# git merge dev
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.
解决冲突
第一步:打开冲突的文件,内容如下:
<<<<<<< HEAD
我喜欢java
=======
我喜欢python
>>>>>>> dev
然后需要将<<<<<< HEAD和>>>>>>>dev之间的内容进行修改,并且需要删除<<<<<< HEAD和>>>>>>>dev
修改为如下内容
master喜欢java, dev喜欢python
1
然后提交到当前分支上,即master上
[root@localhost learngit]# git add readme.md
[root@localhost learngit]# git commit -m "解决conflict"
1
2
以上就能解决冲突的内容!
然后我们可以把dev分支给删除了
[root@localhost learngit]# git branch -d dev
参考