Bootstrap

git 常见冲突—— git pull遇到报错Your local changes to the following files would be overwritten by merge

1 场景

在进行代码开发时,忘了先git pull到本地之后,直接在台式机上的代码进行编写,突然想起忘了pull了,然后想用git pull来更新本地代码。结果报错:

error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.xx Please, commit your changes or stash them before you can merge. Aborting

2 报错分析

出现这个问题的原因是其他人修改了项目中的代码文件xxx并提交到远程版本库中去了,而你本地也修改了改代码文件xxx,这时候你进行git pull操作就好出现冲突了,上面报错的意思是我台式机上新修改的代码的文件,将会被git服务器上的代码覆盖,我们当然不想刚刚写的代码被覆盖掉,那么我们应该如何解决呢。

3 解决方案:

在报错中我们看到官方推荐的解决方案是使用直接commit或者使用stash。那么我们来看看这两种操作方式的区别和使用:

3.1 方案一:使用stash

保留本地的方式修改(强烈推荐,还有一种是直接拉取服务器的(不推荐使用就不写了),这样你本地修改的代码的,就会舍弃,相当于你写的代码直接没,你还的重新写)。
主要方式如下:
通过git stash将工作区恢复到上次提交的内容,同时备份并暂时隐藏本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改隐藏的应用拉取到当前工作区。
stash翻译为“隐藏”,如下操作:

git stash
git pull
git stash pop
  • git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
  • git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
  • git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
  • git stash clear: 清空Git栈。此时使用gitk等图形化工具会发现,原来stash的哪些节点都消失了。

3.2 方案二:硬覆盖(谨慎使用,使用前先备份当前代码!!!):

放弃本地修改,只保留服务器端代码,则直接回退到上一个版本,再进行pull:

git reset --hard
git pull origin master

注:其中origin master表示git的主分支。

4 Git冲突解决方法实际应用场景

4.1 硬覆盖应用

忽略本地修改,强制拉取远程到本地,硬覆盖是一种比较通用的方式吗,但是不建议使用,如果使用需要先将修改在本地做好备份,否则本得改变将丢失。
主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉

git fetch --all

git reset --hard origin/dev

git pull

4.2 commit和pull的先后顺序造成的冲突的情况

关于commit和pull的先后顺序,commit >> pull >> push 和 pull >> commit >> push的顺序,两种情况都遇到过代码冲突。解决方法如下:

4.2.1 未commit先pull(pull >> commit >> push)

未commit先pull,视本地修改量选择revert或stash

场景:
同事 有新提交
我 没有pull -> 修改了文件 -> pull -> 提示有冲突

4.2.1.1 本地修改量小

如果本地修改量小,例如只修改了一行,可以按照以下流程:

 git revert(把自己的代码取消) >> git pull >> 在最新代码上修改 >> [pull确认最新] >> commit&push
4.2.1.2 本地修改量大

本地修改量大,冲突较多,有两种方式处理:

  • 第一种:
stash save(把自己的代码隐藏存起来) >> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) >> 代码文件会显示冲突 >> 右键选择edit conficts,解决后点击编辑页面的 mark as resolved >>  commit&push
  • 第二种:
>> stash save(把自己的代码隐藏存起来) >> 重新pull >> stash pop(把存起来的隐藏的代码取回来 ) >> 代码文件会显示冲突 >> 右键选择resolve conflict >> 打开文件解决冲突 ->commit&push

4.2.2 已commit未push(commit >> pull >> push)

已commit未push,视本地修改量选择reset或直接merge。

场景:
同事 有新提交
我 没有pull >> 修改了文件 >> commit >> pull >> 提示有冲突

4.2.2.1 修改量小

修改量小,直接回退到未提交的版本(可选择是否保存本地修改)
如果本地修改量小,例如只修改了一行,可以按照以下流程

reset(回退到未修改之前,选hard模式,把自己的更改取消) >> 重新pull >> 在最新代码上修改 >> [pull确认最新] >> commit&push

ps:实际上完全可以采取直接merge的方法,这里主要是根据尽量避免merge的原则,提供一种思路

4.2.2.2 修改量大

修改量大,直接merge,再提交(目前常用)

commit后pull显示冲突 >> 手动merge解决冲突 >> 重新commit >> push

5 总结

以上就是笔者遇到或者整理的一些冲突的解决场景或者方案,希望可以帮到大家。

;