# 合并的原则
在本地修改项目,远程也被其他人进行了修改后,本地版本库与远程存在冲突。需要进行冲突的解决,才能进行推送。
原则就是:将远程最新的代码拉取到本地,在本地进行合并和冲突解决,随后再push到远程。
方式有多种,本质上一样。
git pull
+git push
git fetch
+git merge
+git push
git fetch
+git rebase
+git push
git reset --hard origin/branch
+git cherry-pick [commid-id]
+git push
1. 本地提交
在参与到一个项目中,先用git clone克隆到本地,随后进行一系列修改后commit到版本库
此时会生成一个commit id。
2. 远程更新
在自己push之前,有其他开发者先进行了push,导致远程仓库的内容更新
此时进行push,如果远程最新的代码code_new与我们的commit=ff9b675有地方冲突的话,push就会失败报错。
也就是上面我们遇到的情况。
3. 合并方式
假设直接进行push会有冲突导致push失败,那么需要将自己的本地仓库更新成最新的远程仓库的内容,再进行push。
可以使用
git reset --hard origin/branch
回退到最新的远程分支仓库版本,然后再使用
git cherry-pick [commit-id]
将自己的commit与最新的代码合并。
此时会出现冲突,同时状态会变成CHERRY-PICKING
。
合并方式有很多,直接使用git pull拉取并合并最新的代码
或者使用git fetch拉去远程代码到本地仓库(不会更改本地的内容),再使用git merge或者git rebase进行合并,随后再解决冲突。
4. 远程推送
在git cherry-pick
后,手动解决冲突,然后再git add
到我们的commit中,随后执行git cherry-pick --continue
继续合并。
最后执行
git push origin 本地源:远程目标
如此便可以成功推送到远程。
附其他流程:
5. 冲突解决
在commit之后,先使用git pull,发现Auto-merge failed
于是先回退到原先还没修改的时候:
git reset --hard origin/base_3024
这句命令的作用是将工作区、暂存区和版本库都回退到远程仓库origin 的base_3024分支上
然后再执行
git cherry-pick ff9b675b #ff9b675是之前本地修改后commit的id
在执行完
git reset --hard
后,git log
就看不到自己之前的commit信息了,因此需要先记住commit id
用git cherry-pick
后将commit合并,这个时候发生了冲突,没办法自动合并,因此需要手动解决冲突。
合并后出现的冲突,会以这种形式出现:
分为上下两段:
<<<<<<< HEAD
的是pull下来的代码(最新远程的)
>>>>>>> commig-id
的是本地修改的代码
回到code,全搜"<<<<<<",出现
双击进去查看冲突
不一致导致的冲突,需要手动修改。
保留想要的更改,删掉多余的信息。
将所有的冲突处解决。
修改完后回到git bash
直接使用git cherry-pick --continue
,会存在未解决的冲突。
由于现在的状态在CHERRY-PICKING
,本次的commit与最新的代码有冲突,需要把冲突的文件使用git add
添加到这次的commit中。
git add [冲突的文件]
随后再执行
git cherry-pick --continue
合并成功
再使用git push推送到远程。
出现SUCCESS则表示push成功。