作为程序员,我们每天都在和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
我们留意两方面的信息
# 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
第一次看到这些信息先不要害怕,我们接下来介绍
我们首先看下面这个图
这里我标注了1,2,3。也就是说,任意的冲突,我们都可以拆分为1,2,3三个框架
<<<<<<< local branch
=======
>>>>>>> upstream branch
至此,我们知道了冲突的格式,接下来是解决
涉及到冲突的解决,我们需要根据上下文代码来分析, 这里我们举例的是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
至此我们应该修改如下:
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和理解,这同样对于代码的提交者和审核者都具备此要求。
但是我们在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的冲突拆解为这四笔提交的冲突,相当于将问题一分为四。
如果我们发现上游更新太多了,理解代码太困难了,我们可以先合上游,再提交自己的补丁,如下:
此时我们在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强推。
本文描述了我们通常情况下在合入补丁时的解决方法,我们提供了三种思路,处理问题的优先级按照描述的优先级