5. Git进阶之冲突与合并

# 合并的原则

在本地修改项目,远程也被其他人进行了修改后,本地版本库与远程存在冲突。需要进行冲突的解决,才能进行推送。

原则就是:将远程最新的代码拉取到本地,在本地进行合并和冲突解决,随后再push到远程。

方式有多种,本质上一样。

  1. git pull + git push
  2. git fetch + git merge + git push
  3. git fetch + git rebase + git push
  4. git reset --hard origin/branch + git cherry-pick [commid-id] + git push

image-20220314114629632

1. 本地提交

在参与到一个项目中,先用git clone克隆到本地,随后进行一系列修改后commit到版本库

image-20220228171652239

此时会生成一个commit id。

2. 远程更新

在自己push之前,有其他开发者先进行了push,导致远程仓库的内容更新

image-20220228172301553

此时进行push,如果远程最新的代码code_new与我们的commit=ff9b675有地方冲突的话,push就会失败报错。

也就是上面我们遇到的情况。

3. 合并方式

假设直接进行push会有冲突导致push失败,那么需要将自己的本地仓库更新成最新的远程仓库的内容,再进行push。

可以使用

git reset --hard origin/branch

回退到最新的远程分支仓库版本,然后再使用

git cherry-pick [commit-id]

将自己的commit与最新的代码合并。

image-20220228174434528

此时会出现冲突,同时状态会变成CHERRY-PICKING

合并方式有很多,直接使用git pull拉取并合并最新的代码

或者使用git fetch拉去远程代码到本地仓库(不会更改本地的内容),再使用git merge或者git rebase进行合并,随后再解决冲突。

4. 远程推送

git cherry-pick后,手动解决冲突,然后再git add到我们的commit中,随后执行git cherry-pick --continue继续合并。

最后执行

git push origin 本地源:远程目标

image-20220228180155186

如此便可以成功推送到远程。

附其他流程:

image-20220314114723860

image-20220314114754381

image-20220314114812921

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成功。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值