编辑
2025-01-20
记录知识
0
请注意,本文编写于 158 天前,最后修改于 59 天前,其中某些信息可能已经过时。

目录

一、什么是冲突
二、解决冲突
2.1 具体语义具体分析
三、建议
3.1 单笔合入解决冲突
3.2 放弃自己改动,先合入上游再合入自己改动
四、总结

作为程序员,我们每天都在和git打交道,无论是自己在编写代码时和同事的协作情况下还是在合并别人的提交的时候,都很容易出现冲突的情况,我们在将整个操作系统进行同步上游的时候,冲突几乎是必定出现,这里介绍一下出现冲突应该怎么应对

一、什么是冲突

当我们敲入

git merge tangfeng

将tangfeng分钟merge到自己分支的时候,如果代码存在不能自动合并的情况下,我们需要自己解决冲突,主要情况如下:

# git status 位于分支 egf/v101-tablet-dev 您的分支与上游分支 'origin/egf/v101-tablet-dev' 一致。 您有尚未合并的路径。 (解决冲突并运行 "git commit") (使用 "git merge --abort" 终止合并) 要提交的变更: 修改: windowsview/qml/AppArea.qml 修改: windowsview/qml/AppPreviewWindow.qml 修改: windowsview/qml/TabletPreviewWindow.qml 修改: windowsview/qml/TabletViewMain.qml 修改: windowsview/qml/multitaskview.qml 修改: windowsview/ukui-window-switch_bo_CN.ts 修改: windowsview/ukui-window-switch_zh_CN.ts 未合并的路径: (使用 "git add <文件>..." 标记解决方案) 双方修改: debian/changelog

我们留意两方面的信息

  • 您有尚未合并的路径,这里提示你merge是失败了,需要手动解决
  • 双方修改: debian/changelog,这里提示具体的冲突情况 至此,我们以最常见的changelog冲突为例展示了一次冲突,我们接下来看冲突的具体内容
# git diff debian/changelog diff --cc debian/changelog index 9bb9968,f1c60be..0000000 --- a/debian/changelog +++ b/debian/changelog @@@ -1,14 -1,15 +1,29 @@@ ++<<<<<<< HEAD +ukui-window-switch (3.1.0.1-0k0.1tablet7rk1.egf0.1) v101; urgency=medium + + * No-Change rebuild for ci. + + -- yangquan <yangquan@kylinos.cn> Thu, 14 Mar 2024 15:16:56 +0800 + +ukui-window-switch (3.1.0.1-0k0.1tablet7rk1) v101; urgency=medium + + * Support RK3588 + + -- tangfeng <tangfeng@kylinos.cn> Wed, 09 Aug 2023 12:56:59 +0800 ++======= + ukui-window-switch (3.1.0.1-0k0.1tablet8) v101; urgency=medium + + * BUG: + - 209242 【多任务视图】【TM】改变系统字体,多任务视图未随之变化 + - 209246 【多任务视图】【TM】改变系统字号,多任务视图中字号无变化 + - 209264 【多任务视图】PC模式,传书和计算器在多任务视图中显示为尖角 + - 209266 【多任务视图】PC模式,应用缩略图左右两端显示不完整 + * 需求号: + * 其他改动说明: + * 其他改动影响域:自身 + + -- jiaodian <jiaodian@kylinos.cn> Mon, 15 Jan 2024 09:02:51 +0800 ++>>>>>>> up

第一次看到这些信息先不要害怕,我们接下来介绍

二、解决冲突

我们首先看下面这个图

image.png

这里我标注了1,2,3。也就是说,任意的冲突,我们都可以拆分为1,2,3三个框架

  • 标注1:这里代表我们的HEAD分支目前的改动,<<<<<是开始 这里示例如下:
<<<<<<< local branch
  • 标注2:这里代表是分割线,也就是HEAD分支改动的最后 这里示例如下:
=======
  • 标注3:这里代表是我们上游分支的结尾,>>>>>>>是结束 这里示例如下:
>>>>>>> upstream branch

至此,我们知道了冲突的格式,接下来是解决

2.1 具体语义具体分析

涉及到冲突的解决,我们需要根据上下文代码来分析, 这里我们举例的是changelog,所以以这里来看

首先,我们知道,我们的版本号是逐步递增的,所以我们不能一味的选中HEAD或者up分支的内容,也就是我们需要都合并

其次,我们合并需要有顺序关系,也就是3.1.0.1-0k0.1tablet7--->3.1.0.1-0k0.1tablet7rk1--->3.1.0.1-0k0.1tablet7rk1.egf0.1--->3.1.0.1-0k0.1tablet8

再者,我们的changelog有明确的命名规范,3.1.0.1-0k0.1tablet8应该修改成3.1.0.1-0k0.1tablet8rk1.egf0.1

至此我们应该修改如下:

  1. 删除<<<<<<< HEAD
  2. 删除=======
  3. 删除>>>>>>> up
  4. 将up的改动放在HEAD之上
  5. 将版本号3.1.0.1-0k0.1tablet8修改为3.1.0.1-0k0.1tablet8rk1.egf0.1 改后的diff如下:
diff --cc debian/changelog index 9bb9968,f1c60be..0000000 --- a/debian/changelog +++ b/debian/changelog @@@ -1,15 -1,16 +1,28 @@@ -ukui-window-switch (3.1.0.1-0k0.1tablet8) v101; urgency=medium ++ukui-window-switch (3.1.0.1-0k0.1tablet8rk1.egf0.1) v101; urgency=medium + + * BUG: + - 209242 【多任务视图】【TM】改变系统字体,多任务视图未随之变化 + - 209246 【多任务视图】【TM】改变系统字号,多任务视图中字号无变化 + - 209264 【多任务视图】PC模式,传书和计算器在多任务视图中显示为尖角 + - 209266 【多任务视图】PC模式,应用缩略图左右两端显示不完整 + * 需求号: + * 其他改动说明: + * 其他改动影响域:自身 + + -- jiaodian <jiaodian@kylinos.cn> Mon, 15 Jan 2024 09:02:51 +0800 + +ukui-window-switch (3.1.0.1-0k0.1tablet7rk1.egf0.1) v101; urgency=medium + + * No-Change rebuild for ci. + + -- yangquan <yangquan@kylinos.cn> Thu, 14 Mar 2024 15:16:56 +0800 + +ukui-window-switch (3.1.0.1-0k0.1tablet7rk1) v101; urgency=medium + + * Support RK3588 + + -- tangfeng <tangfeng@kylinos.cn> Wed, 09 Aug 2023 12:56:59 +0800 + ukui-window-switch (3.1.0.1-0k0.1tablet7) v101; urgency=medium * BUG:

改好之后,我们通过git add来提交,代表我们解决了冲突

git add debian/changelog

然后我们需要使用git commit来执行合并

git commit

接下来我们先不提交pr,需要本地编译用于此测试验证

dpkg-buildpackage -uc -us

我们知道ukui-window-switch用作系统的多任务窗口的程序,所以我们自测如下:

scp ../ukui-kwin-effects_3.1.0.1-0k0.1tablet8rk1.egf0.1_all.deb ../ukui-window-switch_3.1.0.1-0k0.1tablet8rk1.egf0.1_arm64.deb root@172.25.83.91:~

然后机器上安装

dpkg -i ukui-kwin-effects_3.1.0.1-0k0.1tablet8rk1.egf0.1_all.deb ukui-window-switch_3.1.0.1-0k0.1tablet8rk1.egf0.1_arm64.deb

然后重启开始自测

systemctl restart lightdm

在平板模式和桌面模式上都点击多任务,这里不展示每个自测,只展示如下bug的自测:

PC模式,应用缩略图左右两端显示不完整 改变系统字体,多任务视图未随之变化 改变系统字号,多任务视图中字号无变化 传书和计算器在多任务视图中显示为尖角

自测完毕之后,直接提交branch,如下:

git branch -m tangfeng git push origin tangfeng

此时我们登录网页提交对egf/v101-tablet-dev的pr请求后提交ci

待ci完成之后,我们填写集成单,事情即完成。

三、建议

我们在合入分支的时候,并不是每一笔都能够正常合入,所以我们必须要根据合入的代码进行review和理解,这同样对于代码的提交者和审核者都具备此要求。

3.1 单笔合入解决冲突

但是我们在git merge的时候,还是会出现了大量无法合并的情况,或者我们针对上下文无法进行分析或代码能力不够的前提下,不清楚补丁改了什么的时候,这时候更建议按照一个一个补丁的方式合入,如下:

首先切到上游分支

git checkout up

然后我们得在上游分支上看领先了多少提交

commit cd205b17db39334e2f07a9cc474822015b705ddd (HEAD -> up, tag: build/3.1.0.1-0k0.1tablet8, origin_upstream/yhkylin/v101-tablet) Author: jiaodian <jiaodian@kylinos.cn> Date: Mon Jan 15 09:03:44 2024 +0800 [Chore]: xctablet changelog 3.1.0.1-0k0.1tablet8 commit 3c993741e0fd5edcb5bf939fd99c727e03611abd Merge: 954a1c6 ad3c421 Author: 庞毅 <pangyi@kylinos.cn> Date: Wed Jan 10 02:36:08 2024 +0000 Merge branch 'yhkylin/v101-tablet-font' into 'yhkylin/v101-tablet' 平板模式增加适配字体字号变化的功能 See merge request kylinos-src/ukui-window-switch!131 commit 954a1c671a355ac6335274b9355e59fac081fb83 Merge: 75404f5 deaf58a Author: 庞毅 <pangyi@kylinos.cn> Date: Wed Jan 10 02:35:10 2024 +0000 Merge branch 'yhkylin/v101-tablet' into 'yhkylin/v101-tablet' 同步主线缩略图的大小以及圆角改动 See merge request kylinos-src/ukui-window-switch!130 commit ad3c421e7e3dd74030cd755a72e39d5e6118e3f3 Author: jiaodian <jiaodian@kylinos.cn> Date: Wed Jan 10 09:52:18 2024 +0800 平板模式增加适配字体字号变化的功能 commit deaf58a71bf71367490a5550f1ee2d3b97416c1f Author: pang_yi <pangyi@kylinos.cn> Date: Fri Nov 17 15:25:17 2023 +0800 Fix: bug 209264 传书和计算器缩略图不是圆角 commit 9b3deeb06f75dd22b862fda2f3b2d4545968b92f Author: jiaodian <jiaodian@kylinos.cn> Date: Wed Jul 5 14:31:04 2023 +0800 修改缩略图大小 commit 75404f571fd82fe35085395804289036a9d39bed (tag: build/3.1.0.1-0k0.1tablet7, origin/yhkylin/v101-tablet)

这里我们留意最后一行:

commit 75404f571fd82fe35085395804289036a9d39bed (tag: build/3.1.0.1-0k0.1tablet7, origin/yhkylin/v101-tablet)

可以知道,我们的提交领先到这里了,此时我们生成patch,如下:

git format-patch 75404f571fd82fe35085395804289036a9d39bed

此时我们会提供HEAD到75404f571fd82fe35085395804289036a9d39bed的所有patch文件,我们逐一合入:

patch -p1 < 0001-xxx.patch patch -p1 < 0002-xxx.patch patch -p1 < 0003-xxx.patch patch -p1 < 0004-xxx.patch

此时我们可以把之前的git merge的冲突拆解为这四笔提交的冲突,相当于将问题一分为四。

3.2 放弃自己改动,先合入上游再合入自己改动

如果我们发现上游更新太多了,理解代码太困难了,我们可以先合上游,再提交自己的补丁,如下:

此时我们在tangfeng分支 查看日志如下:

commit f5eb14a05d9f1bdaa8527317d8c6d2b6c1868430 (tag: build/3.1.0.1-0k0.1tablet7rk1, origin/3588-tablet) Author: Your Name <you@example.com> Date: Wed Aug 9 12:57:51 2023 +0800 支持RK3588平台 commit 381dee6e9d9e417404be791f041daf62ab4bf884 Merge: 7cf2d58 75404f5 Author: Your Name <you@example.com> Date: Wed Aug 9 10:53:51 2023 +0800 Merge branch 'tablet' into 3588 commit 75404f571fd82fe35085395804289036a9d39bed (tag: build/3.1.0.1-0k0.1tablet7, origin/yhkylin/v101-tablet)

这里可以看到从origin/yhkylin/v101-tablet到build/3.1.0.1-0k0.1tablet7rk1我们总共两笔提交,其中一笔是merge的日志。也就是一笔提交,我们可以将其生成补丁,如下:

git format-patch 75404f571fd82fe35085395804289036a9d39bed

此时我们存在一个patch,如下:

0001-xxx.patch

然后我们将代码直接reset/revert,如下:

如果是reset,则:

git reset 75404f571fd82fe35085395804289036a9d39bed git checkout .

如果是revert,则

git revert f5eb14a05d9f1bdaa8527317d8c6d2b6c1868430

至此,我们回到了和主线分支完全一致的状态,然后我们合入主线

git merge up

这里因为没有我们的任何一笔改动,所以merge一定是成功的。

然后我们合入自己的补丁,如下

patch -p1 < 0001-xxx.patch

此时我们的补丁会产生冲突,我们解决自己的冲突即可。

在解决好冲突之后,我们需要rebase来解决问题。如下:

git rebase git push -f

值得注意的是,我们在敲git rebase的时候请与管理员先沟通,再git push -f强推。

四、总结

本文描述了我们通常情况下在合入补丁时的解决方法,我们提供了三种思路,处理问题的优先级按照描述的优先级

  • 我们默认优先的方法是git merge,然后在遇到冲突的时候解决冲突。
  • 其次优先是通过git am或patch命令来单笔合入
  • 如果都无法合入,尝试将自己的改动reset/revert,然后合入上游后,将自己的patch合入,解决自己patch带来的冲突 但是也需要值得注意的是,我们在运行git rebase之前,请通知团队的管理员。避免给仓库带来损失。