我在自己的分支开发,我在 dev 分支开发,想提交 Merge Request 合并到 main 分支,但是代码冲突,无法合并,需要先处理冲突,常用的解法有两种,一种是 merge 的方式合并代码,另一种是 rebase

merge 方式合并

这种方式需要有 push 主分支代码的权限

1
2
3
4
5
6
7
8
# 先切换到main分支
git checkout main

# 确保main分支更新到最新了
git pull

# 合并dev分支到main分支
git merge dev

这个时候可能会出现代码冲突,建议使用 vscode 之类的软件进行合并,使用 VSCode 合并方式如下:

image.png|531

冲突解决完成,建议搜索一下关键词 >>>>>>>,能搜到,说明你的冲突还没解决完。
image.png|180

1
2
3
4
5
# 合并完成后,将代码再次提交
# 这一步一般都是管理员完成,需要有推送main分支的权限。
git add .
git commit -m 'merge dev to main'
git push

rebase 方式合并

rebase 的方式就是改变代码的分支起点,类似于把 dev 分支的起点转变到 main 的最新

1
2
3
4
5
          main
|
A---B---C---D
\
E---F (dev)

变成

1
2
3
A---B---C---D  (main)
\
E'---F' (dev)

其中 E’ 和 F’ 是 E、F 在 D 基础上重放的副本。

这样的好处是合并后的代码历史更简洁,是一条直线,且合并的时候可以不用管理员来处理代码冲突的情况(由自己处理掉),坏处是比较麻烦,可能会多次处理冲突。

1
2
3
4
5
6
7
# 保证main分支是最新的
git checkout main
git pull origin main

# rebase 到 main分支最新的commit
git checkout dev
git rebase main

如果这个界面直接 :wq 保存退出
image.png|474

这个时候如果有冲突,rebase 会停止,这个时候你需要手动解决冲突
image.png|485

建议使用 vscode 之类的软件解决冲突,使用 VSCode 合并方式如下:

image.png|531

冲突解决完成,建议搜索一下关键词 >>>>>>>,能搜到,说明你的冲突还没解决完。
image.png|180

解决完成后,执行

1
2
git add .
git status

确保没有 both modified:

然后继续执行 rebase:

1
git rebase --continue

如果有冲突,再次手动解决冲突,直到 rebase 操作结束。结束后你应该能看到:

image.png|455

因为分支历史被改写了,所以会出现 当前状态同时领先远程和落后远程的情况,这个时候需要强制推送到

1
git push --force-with-lease origin dev

然后你就可以正常的 merge 代码了。
image.png|549