【经验】项目开发中的Git解决冲突操作
置顶补充:
本文原先是word文档采用批注,现md改用括号进行补充
Git Version 2.39源码编译
Git版本过旧不支持switch restore等系列指令
请自行编译源码更新
tig是辅助工具,请自行安装(用git log可以实现相同效果)
操作经过项目实践,有误请指出~
推荐 cherry-pick
操作, rebase
使用较少如有纰漏请谅解~
个人开发分支图与文有差异,认准一个即可~
注意:本文档采用批注进行补充
总体概述:简单介绍了新人在项目开发中,使用Git操作解决冲突的两种常规处理
基础部分
线上分支(基本不会接触到)、开发分支(trunk
为例)、个人开发分支(xfz_xxx_20230308
为例)
三者关系:开发分支领先线上分支,个人开发分支领先开发分支
弄清楚两个概念:本地分支、远程分支
(注意区分未涉及push
操作的一律是针对本地分支的操作)
本文本在每次分支改动时都会提示(不提示默认为上一次所处的分支)
实际操作
首先,从远程克隆(这个操作会自动产生一个同名的本地分支)最新的主干开发分支
git clone -b trunk xxx.git
(此时位于trunk
分支)
然后,根据功能需求进行代码改动(不要提交和推送!!)
等到功能完成(可能一个功能、可能多个功能、可能部分完成)之后,有如下两种方案可以使用:
方案一:使用cherry-pick
- 创建一个临时本地分支并进行切换
git switch -c tmp
(此时位于tmp
分支)
- 将完成功能部分提交(记为A),
git add xxx && git commit -m xxx
这个操作根据你完成功能的个数x重复执行x次,不同功能的代码改动要进行不同的提交 - 将剩余未完成的代码改动统一提交(记为B),
git add . && git commit -m xxx
- 切回
trunk
分支并且同步拉取最新的远程分支:git pull
(此时位于trunk
分支)
- 使用
tig tmp
查看tmp
分支的提交记录,记下刚刚几次提交的commit id
- 使用
cherry-pick -n commit id
对当前分支打补丁(逐个commit id
使用,完成功能的提交先用,这里以A的提交为例)并解决冲突
- 切到一个新的个人开发分支
xfz_xxx_20230308
并推送到与对应的远程分支
git switch -c xfz_xxx_20230308
git add .
git commit -m xxx
git push origin -u xfz_xxx_20230308
(当前位于xfz_xxx_20230308
分支)
- 在
gitlab
上提交xfz_xxx_20230308
分支合并到主干分支trunk
的请求
(记得勾选删除源远程分支)
- 合并完成后切回主干分支
git switch trunk
,使用git pull
拉取最新的变动
(当前位于trunk
分支)
- 使用
git cherry-pick -n commit id
将剩余的代码改动重新复原(这里以B提交为例),恢复原先的工作进度
- 删除本地的临时分支和个人开发分支
git branch -D tmp xfz_xxx_20230308
如果临时需要拉取到最新的代码,则进行如上的1-6步操作即可
方案二:使用rebase
- 切换到一个新的个人开发分支
git switch -c xfz_xxx_20230308
(当前位于xfz_xxx_20230308
分支)
- 针对需要提交的功能,分别进行多次提交,并推送到远程个人开发分支
- 对当前分支进行变基操作
git rebase origin/trunk -i
- 变基解决冲突后,会将之前的个人开发分支提交重新生成并提交,推送到个人开发分支
- 在
gitlab
上提交xfz_xxx_20230308
分支合并到主干分支trunk
的请求
(记得勾选删除源分支)
- 切回开发分支
trunk
,并拉取最新的代码
(当前位于trunk
分支)
- 删除本地个人开发分支
git branch -D xfz_xxx_20230308
其他
git stash
、git reset
指令的使用