如何解决代码冲突
今天在更新仓库的时候,发现没有拉取最新代码,被拒绝推送了。所以果断git pull
结果发现,给出的提示跟之前不太一样:
常规做法应该是git commit -m “message” 之后就算解决冲突了
别急,咱们git status 看一下状态
显示的又跟常规不一样,interactive rebase in progress 什么鬼;给出的参考步骤依然是跟git rebase这条命令相关
那么我们先按照常规思路来处理试试能否可行
在处理完冲突后,我执行了下面的命令
git add .
git commit -m "..."
此时执行git push后,被拒绝了:
按照提示,执行git push origin master,这回出现了报错信息
提示显示本地的分支落后于远程分支,不允许推送。
可是之前命令是已经拉取过最新代码了,也解决了冲突,为啥似乎没生效的样子
这个时候,我们再执行git pull origin master 看看效果:
结果残酷,依然被拒绝了。
那么咱们接下来就按照提示的命令执行一下
先git rebase --abort,结果可想而知,我们之前的pull下来的代码不见了
然后git pull 、解决冲突、git add .
之后执行 git rebase --continue 命令,发现输出不一样了
这个时候去查看日志 git log。会看到远端的提交已经合并到本地;
也就是说,这种解决冲突的办法跟merge不太一样
为什么?
这就跟代码分支合并的模式有关系;
git仓库的代码合并有两种模式
-
git merge
-
git rebase
这两种方式的区别 -
git merge 是合并,会将另一个分支合并到本分支,存在非同步的提交时,会将另一个分支的提交合并到当前分支中,并产生一次合并提交;确保团队提交记录的真实性
-
git rebase 是变基,如果远端分支同本分支存在冲突,那么在git rebase之后,会将远端的分支更新到本地,而本地的所有commit 会基于拉取远端分支之后的最新commit提交;不会出现merge commit分支,会保持一个比较整洁的历史记录
-
git merge 只需要处理一次冲突,git rebase 可能要处理多次,所以才有了git rebase --continue命令
-
如果是真实的项目场景,建议大家都用git merge
-
如果基于一个远端分支,有其他开发同事在协作,且也在用git rebase去进行合并,那么可能会导致提交记录无法混乱!!!大家都在rebase,可能你rebase了我的记录,我rebase了他的记录,他又rebase了你记录,想象一下这个关系
git rebase的流程
# 1.先拉取代码
git pull
# 2. 解决冲突并保存到暂存区
git add .
# 3. 继续处理下一个commit的冲突
git rebase --continue
# 或者 终止变基
git rebase --abort
修改git pull 的模式
# 设置rebase模式
git config --global pull.rebase true
# 获取
git config --global --get pull.rebase
# 删除
git config --global --unset pull.rebase
综上,上面遇到的问题,是由于我出于好奇修改了pull的模式,导致,修改回merge就解决了