在git使用中,尤其是多人维护相同项目时,“冲突”是一个经常要解决的问题,但是对这个问题似乎一直似懂非懂。现在感觉真的想明白了,这里把它从发生到处理整个机制做个描述。
有人会说“当多个人同时改一个文件时会发生冲突”,这句话不能说错,但其实很不精确。个人觉得更精确的说法应该是“当多个人从同一个主分支,各自拉出相同的子分支后,又在各自的子分支中改了同一个文件时,冲突会在第一个人合并回主分支后,其他人再合回主分支时发生在那个相同的文件上”。
假设有一个项目A,由甲乙两个程序员共同维护,里面一共有a、b、c三个文件。程序员甲首先接到一个需求,需求会改动到文件a和b,于是他从项目A的主分支拉出了开发子分支A1,按部就班开始了工作。正在这时,有人发现项目A在线上出现一个bug需要马上处理,于是程序员乙接受了任务并发现修复bug要修改文件b,在又从项目A中拉出了他的子分支A2后,也按部就班开始了工作。
程序员甲和程序员乙拉了各自的分支A1和A2后,双方开始写代码前,A1和A2是和A完全相同的两个副本,有着相同的a,b,c三个文件。然后甲乙各自开始工作后,他们都修改了文件b,这个文件便会在后期引发冲突。如果乙先处理完bug,并将自己的分支合并回主分支,他不会遇到任何问题,但是后一步完成需求合并回主分支的甲却会遭遇发生在文件b上的冲突。如果相反,是甲先完成需求与合并,乙后处理完bug与合并,那么就是乙在文件b上遭遇冲突。
这里不难发现,在多人维护相同项目时,单个项目开发周期越长,将来它合并回主分支遇到冲突的概率就越高,因为跟你拉出相同的分支的可能有多个人,你如果在最后才提交合并,要处理的冲突可能也涉及多个人,你要面对一对多的沟通协调,虽然冲突的处理不当可能对自己和别人都有影响,但是所有的锅肯定都是最后处理冲突的人,所以项目切记不要拖太久。
因为没有冲突机制,多个人改相同文件时,后合并的人就会覆盖先合并的人的改动,在最终效果上就是先合并的人的工作在主分支上被归零,就像他没合并过一样。如果在处理冲突时,直接“以己方分支为主”的方式处理,也是会覆盖先合并之人的工作。
在发生冲突的文件里,一般都会被插入一些"特殊的字符",类似"<<<<<<< HEAD"、“=======”、“>>>>>>> feature1”这些,它们是帮助你看清冲突的位置,告诉你相同的地方,你和对方有什么不同:比如文件b第12行,对方的版本是空行,但你却有一句代码。如果你看出冲突是什么了,就可以删除"<<<<<<< HEAD"、“=======”、“>>>>>>> feature1”这些符号了。然后接下来你就要处理问题,比如你可以很确定,自己在12行增加的代码对对方的代码毫无影响,那就可以自己的为主。
这里要强调的是,只在这一行以自己为主,而不是整个文件为主,很多时候,一个文件可能有多处冲突,每个冲突你都要切实深入细节确定双方的影响。对于改动较大的情况,多数时候只是遭遇冲突的人单方面是无法判断影响的,他只知道以自己的为主自己没问题,不确定是否影响对方,这时就要通过git的log找到上一个合并者,两个人一起看冲突发生的地方,确认一个两个人都不会影响的修改方案。
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
提交代码出现冲突如何解决?包括:树冲突(文件名修改造成的冲突,称为树冲突)、内容冲突(git pull拉取最新代码发现)、直接编辑冲突文件、利用图形界面工具解决冲突
点击输入框失去焦点会触发验证方法,点击提交按钮的时候也会触发验证方法,如果用户点击输入框后点击提交按钮就会同时触发失去焦点方法和提交按钮方法,这样就会触发两次验证
简单来说就是本地修改的文件和目标远程库的同一个文件都有修改。这时无论是pull丶push丶merge时都会产生冲突。
虽然在团队协作开发中强调尽量避免操作同一文件,以避免冲突,但是在实际开发中还是会遇到冲突,所以掌握解决冲突的方法必不可少。冲突一般是由于两个人同时修改同一文件而造成的。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!