== Git Pull失败解决实例 ==
日常工作中,我们通常需要通过git pull来更新本地代码,git pull实质上等于git fetch和git merge。有的时候我们合并的过程会非常顺利,有的时候我们的合并虽然成功但是会多出一些冗余的commit信息,还有的时候我们的合并会因为冲突而失败。本节就带大家来看看如何优雅且干净地进行合并。
1.在合并前,我们首先要做的事情需要执行git fetch origin来获取远端的最新代码。如果该命令没有任何输出,说明本地已有远端最新代码;否则说明远端在近期做出了更新,并且运行该命令之后,本地也有了远端最新代码。
2.此时运行git status来看看本地代码与远端代码是否有分叉,可以得到以下几种情况。注意,请保证本地分支与远端分支是有关联的,即运行git branch --set-upstream-to=origin/master,否则git status将不会显示本地与远端的状态。
- 本地与远端同步。
- 本地落后于远端,无分叉可以直接合并,因为可以fast-forward
- 本次与远端分叉
3.本地与远端同步,则无需merge;本地无分叉落后于远端,直接运行git pull合并即可;如果本地与远端分叉,则需进行以下操作。 首先看看,直接运行git pull会出现什么结果(先假设不会出现冲突)
此时我们会做一个merge的提交,此类提交信息用处不大。我们希望git log的信息都是有用的信息,所以要尽可能避免这种commit message的存在。有没有更好的方法,可以让我们在pull的时候不产生这种信息呢?答案是有的。
以上图为例,首先我们可以执行git reset HEAD^把我们所做的修改给撤销,此时运行git status可以得到结果
注意到输出提示我们现在的分支可以被fast-forwarded,于是我们现在做git pull就不会出现merge的commit信息了,大家可以运行git log查证一下。
还需要注意一点,虽然可以被fast-forwarded,但是merge的时候冲突还是不可避免的,如果我们本次修改与远端更新的修改,动了同一个文件的话,那么就会发生冲突。具体结果如下
按照提示,我们可以先运行git stash保存我们的修改,然后运行git pull与远端同步。
再执行git stash pop取回我们的修改,此时肯定会发生冲突。
然后按照输出给我们的冲突文件列表,修改冲突文件。绿色为我们的修改,蓝色为远端修改。
然后再git add+commit就好了。