git pull/push 冲突

一、问题及原因

  1. 在多人协作代码开发中git pullgit push时提示出现冲突,无法进行操作的相关提示
  2. 冲突的原因一般出现在:多人在各自的本地仓库中编辑了同一个文件,然后先提交的人将代码git到服务器之后,后面其它人在另一个地方也修改了该文件。此时,后面的人再git push自己修改过的本地代码到服务器时,或者git pull服务器上别人修改过的代码到本地进行合并时都会提示冲突,无法合并。

二、解决方法

在代码托管平台上创建测试仓库FileTest,并分别将其克隆到两个不同的地方FAFB来进行测试。测试文件为README.md,其原始内容如下所示:
在这里插入图片描述
1、 首先在FA目录下对本地仓库README.md文件进行编辑
在这里插入图片描述
2、将在FA目录下对本地仓库的修改git到服务器上。操作如下:

git add -A
git commit -m "edit in FA"
git push

此时服务器端的代码已经被更新,与FA目录下的本地仓库同步。

3、进入到FB目录下的本地仓库,此时该仓库中的内容已经落后于远程仓库。对该仓库中的README.md文件进行编辑,如下:在这里插入图片描述
4、此时如果将FB目录下,对本地仓库的修改也直接git到服务器上,将会提示错误。因为之前FA目录下也对同一个文件进行了编辑,直接push上去的话FB的修改将会覆盖掉之前FA的修改,所以git会提示错误,拒绝合并操作,如下图:
在这里插入图片描述
因此,git将提醒进行手动解决掉冲突。针对会出现这种问题,通常有两种解决方案,主要思想都是在本地解决冲突后再提交到服务器。

  • 第一种是在没有 git commit 之前合并解决
  • 第二种是在 git commit 之后合并解决

方案一:git commit之前解决

 在团队合作中,很多时候对项目的文件,你不知道在你提交之前是否已经有人进行了修改和提交。因此,你在自己的本地仓库中对文件修改完成后,准备提交之前,首先要将远端的仓库拉下来和本地的仓库进行合并,看看是否有冲突。若没有冲突则可以继续进行提交,若提示有冲突,此时就需要手动解决掉冲突。在此以上面的文件为例,进行测试。

  1. FB目录下修改完成后,首先将远端仓库拉下来进行合并处理,操作及结果如下图:在这里插入图片描述

  2. 此时提示FB目录下本地仓库的README.md文件将会被覆盖掉,需要手动解决掉冲突文件README.md。因此,先将本地文件README.md进行复制备份,此备份文件为本地自己修改的内容,即称为:Local,如下图在这里插入图片描述

  3. 再将原文件README.md回滚到之前的版本,此版本为远程仓库和本地仓库中对应文件的上一个共同父版本,即称为:Base。因为回滚后的版本为远程仓库的上一个版本,此时再进行拉取远程仓库的时候将不会出现冲突。在这里插入图片描述

  4. 进入到FB目录下的本地仓库,可以看到此时的README.md文件内容为同步远程仓库后的内容,该文件即为远程仓库的版本,即称为:Remote。内容如下:
    在这里插入图片描述

  5. 通过对比软件来对LocalRemote对应的文件README.md进行对比:在这里插入图片描述

  6. 然后手动解决冲突的内容,即:决定README.md文件在Local的哪些内容要添加到Remote中,而Remote中的哪些内容要修改。将左边的内容复制到右边。
    在这里插入图片描述

  7. 然后保存右边的内容,此时右边的版本即为合并后的版本,即Merge版。至此本地的修改内容已经添加到了最新的本地仓库中,可以删除掉之前拷贝的副本。最后将当前的版本添加,提交,推送到服务器上即可完成同步。如下:在这里插入图片描述

总结:该方案主要是在本地仓库中,将出现冲突的文件复制副本进行暂存,然后再将这些冲突的文件回滚到远程仓库和本地仓库的上同一个父版本,此时再拉取远程仓库将不会出现冲突。因为冲突只是发生在多人同时修改了某一个文件的情况下,而父版本相对于远端的子版本,相当于只在一个地方被编辑过。然后在本地将副本和最新拉取的版本文件进行对比,确定副本中的哪些内容需要添加到最新版本中,而最新版本中的哪些内容需要被删除。最后保存的最新版本即为手动解决后的Merge版,然后删除掉副本,进行提交同步到服务器即可。


方案二:git commit之后解决

 在FB目录中对README.md文件修改后,进行git addgit commitgit push时,提示当前本地仓库在推送到远程仓库时被拒绝,此时需要先在本地合并解决冲突后才能提交推送。

  1. 此时已经git commit到本地仓库了,所以按照提示进行git pull后会提示有冲突,需要手动进行解决,如下图
    在这里插入图片描述
  2. 打开合并有冲突的文件README.md,可以看见其内容如下:
    在这里插入图片描述
  3. 手动解决该冲突,决定哪些内容需要保留,哪些内容需要删除。在文本编辑器中,删除README.md的多余部分。该步也可以使用git mergetool来进行合并,如resolve merge conflicts in Git repository 。修改后的结果如下图:
    在这里插入图片描述
  4. 保存该文档即为解决冲突后合并的内容,即Merge。然后执行如下命名将其同步到服务器端:
    git add .   必须要先将合并后的改动添加到版本控制中
    git commit -m "fix conflict"
    git push

【注:该方案由于已经先将改动进行了提交git commit,因此再git pull的时候会进行预合并,并报冲突需要解决】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值