git总结(5)解决冲突

git总结(5)

前面的一些操作都是针对个人的,众所周知,git是作为一个版本控制工具,解决多人协作开发的问题才是最重要的,那么久开始学习一些多人协作所用到的知识吧

多用户下的基本操作

首先假设有两个用户,分别为user1 和 user2接下来以这两个角色进行一些基本的操作吧

user1:
    ##设置提交信息
    git config --global user.name "user1"
    git config --global user.email "user1@user1.com"

    git clone https://git.oschina.net/zzcsy/demo.git ##克隆远程版本库

    echo "Hello." >README ##在根目录下创建一个README文件并写入内容
    git commit add README
    git commit -m "initial commit."
    git push ##将提交推送到远程版本库,这里之所以不加远程版本库的路径是因为克隆操作默认会对远程版本库进行注册
    ##假设每个用户都需要在team目录下建立以自己名字命名的文件描述
user1:
    mkdir team
    echo "I'm user1" > team/user1.txt
    git add team 
    git commit -m "user1's profile"
    git push
user2:
    git clonehttps://git.oschina.net/zzcsy/demo.git ##克隆远程版本库

    echo "I'm user2" > team/user2.txt
    git add team 
    git commit -m "user2's profile"
    git pull ##在推送之前最好先进行拉取操作否则有肯能发生非快进式提交错误
    git push

解决冲突

上面是最简单的协同工作,user1和user2共用一个版本库工作,每个人忙自己的事情并且相安无事。在真正的工作场景。但这只是理想的情况下,真正的工作场景中,冲突是非常常见的,一般的冲突git都能很好的替你解决,例如对不同文件的修改,对相同文件的不同位置修改,一个用户将文件改名之后,另一个用户继续在原来的文件上进行操作,一个用户将文件修改位置后另一个用户继续在该文件上操作等,这正式git的强大之处,但也有些冲突git是解决不了的!比如 两个用户修改了相同文件的相同地方,git 不能越俎代庖,替用户做决定,该用哪个,还有逻辑冲突,比如java中,一个用户改了一个类的调用方式,而另一个用户,仍然继续用原来旧的方式进行调用,这样就会发生错误,但git却无法察觉。这种冲突叫做逻辑冲突,没有很好的解决方式,这完全需要程序员自己的自觉,做好测试,协调沟通,杜绝这种错误的发生。还有一种冲突叫做树冲突,就是如果两个用户同时对一个文件进行改名操作,这样的冲突也需要用户来商量后来决定用哪一个!下面分开来介绍各种冲突的解决方案

一般冲突

情景: user1和user2同时对文件执行pull操作,然后user1对文件README进行了修改,提交并推送,user2对
user1的操作并不知情,在README相同的位置进行了操作,当user2执行pull操作后,会提示用户有冲
突,需要解决冲突后再进行提交。

user1 ,user2 :
    git pull
user1:
    ##在README第一行Hello后面加上自己的名字
    git add -u
    git commit -m "say hello to user1"
    git push
user2:
    ##user2总是比user1要慢,user2也和user1做了同样的操作也是加了自己的名字
    git add -u 
    git commit -m "say hello to user2"
    git pull ##这样就发生了冲突

git status 可以看到README的状态是冲突状态
git ls-files -s ##查看到暂存区有三个README文件其中编号为1的是源文件,编号为2的README代表当前分支修改的README文件,编号为3的README代表在远程分支中修改的版本
git show :1:README ##可以查看暂存区中编号为1的README的文件内容,可用同样的方式查看编号2和3的内容

##用户可以查看工作区中的README 中的文件出现了 <<<<<<<自己修改的内容 =======别人修改的内容 >>>>>>>
##然后可以通过手动的方式将<<<<<<< ======= >>>>>>> 符号删掉,双方协调后修改成 Hello user2 and user1.

git add -u 
git commit -m "say Hello to user2 and user1"
git push
##这样就提交完成了

逻辑冲突

逻辑冲突并没有很好的解决方法,在多人协同工作的情况下出现逻辑冲突是最不愿意看到的情况,这需要用户养成良好的变成习惯,为自己写的方法运行单元测试,团队成员做好沟通协调。

树冲突

情景: 当同时user1将文件README 改为 readme.txt,user2 将文件改为 README.txt这样就会发生树冲
突,这种冲突同样是git不能替用户做决定的,这需要用户沟通后解决冲突然后重新提交。

    user1,user2:
        git pull
    user1:
        git mv README readme.txt
        git commit -m "rename README to readme.txt"
        git push
    user2:
        git mv README README.txt
        git commit -m "rename README to README.txt"
        git pull
    ##然后git 会提醒用户发生冲突
    用户需要手动解决冲突,将冲突的文件删除然后重新提交
    git commit -m "rename README to README.md"
    git push

merge工具

其实上面的冲突文件除了用手动方式,还可以用软件来自动合并,工具的用法也很简单git mergetool ##调用工具,然后git会提示用户可用的工具,用户点确定后会进入工具 的界面,按照提示解决冲突就OK了由于太简单就不再多说了,那么还是说说git mergetool的配置吧
首先下载kdiff3,可以百度去官网下载,然后安装。
git config –global merge.tool kdiff3 ##配置git的合并工具为kdiff3
git config –global mergetool.kdiff3.path

如果所用的冲突工具 不再内置的冲突解决工具列表中 ,还可以使用git config –global mergetoo.cmd对自定义工具进行配置

git config –merge.tool mykdiff3
git config –mergetool.mykdiff3.cmd ‘user/bin/kdiff3 -L1 “ MERGED(Base)"L2"MERGED(Local)"L3" MERGED(Remote)” –auto -o “ MERGED"" BASE” “ LOCAL"" REMOTE”’

冲突的显示样式

除了对冲突的合并工具进行设置外,还可以设置冲突的样式,默认的合并样式是”merge”<<<<<<< ======= >>>>>>> , <<<<<<< 和 ======= 之间的数据是自己修改的 ======= 和 >>>>>>>之间的数据是别人修改的。
可以设置merge.configcstyle为diff3,diff3的风格是 <<<<<<<|||||||=======>>>>>>>
<<<<<<<和|||||||是自己的修改,|||||||和=======之间的是原始的数据,|||||||和>>>>>>>之间的是别人修改的。

git config –global merge.conflictstyle “diff3” ##修改冲突的显示样式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值