一、反合master代码的坑及如何解决避免
情景回顾
-
分支A:包含功能1、2。
-
分支B:包含功能3,且功能3基于功能1。
-
小Y的操作:
- 将分支A合进分支B。
- 删除功能2,保留功能1和功能3。
- 测试后,合并到master分支并上线。
-
小Q的操作:
- 分支A对应版本该上线了。
- 反合master没有冲突以为没问题,但自测时发现功能2丢失。
问题分析
- 小Y的操作:将分支A合进分支B并删除功能2,这会导致Git认为功能2已经被删除。
- 小Q的操作:当小Q在分支A反合master时,Git会认为功能2已经被删除,因此不会重新引入功能2------导致功能2丢失。
解决探索
1、如果基于分支A新建分支A2,将A2中的功能1保留,功能2删除,然后将A2合并入分支B, 并上线合入master。那这个时候分支A再反合master,会保留功能2吗?
不会,这种做法仍然是错误的。
编辑
解释
- 合并操作:合并操作会将目标分支(在这里是master分支)的更改应用到当前分支(在这里是分支A)。如果目标分支中已经删除了某个功能,那么这个删除操作也会被应用到当前分支。
- 比对机制:Git在合并时会比对两个分支的差异,然后将差异应用到目标分支。因此,如果master分支中已经删除了功能2,这些删除操作会被合并到分支A中。
- 无论小Y是在分支A还是A2删除功能2,只要这些更改最终被合并到master分支,小Q反合master时都会丢失功能2 ------ ****即git底层比较与哪个分支删除无关,与代码差异有关。
2、小Y在开发过程中应该手动复制分支A里的功能1
总结: 永远基于线上代码开发 不要基于开发代码开发 就没问题------手动复制代码
同时,提交代码也应该原子性,尽量避免避免同一功能多次提交,减轻手动复制代码工作
二、提交代码注意事项
- 先git pull拉取最新代码
- 再git add .
- git commit -m "xxxx"
- git push
- 如果有冲突没有push成功,则解决冲突后重新执行2-4步------注意:修改/删除冲突代码的时候一定要问一下写这个代码的同事,确定是否能够这样修改/删除,避免误删/修改出错
- 成功提交并推送代码
三、git常用命令总结
- 首次要配置user.name和user.email
- git clone
- git checkout 分支名 (失败的话通过这个git fetch获取最新分支,git branch -a 获取所有分支(带*的是本地分支),git checkout -b xxx 新建xxx分支)
- git status (查看修改文件)
- git pull(避免和别人代码冲突)
- git add .
- git commit -m ""
- git push 或 git push <远程仓库名称> <本地分支名称>:<远程分支名称> ---将本地分支推送到不同远程分支(建本地分支时就已经基于某分支便不需要再写远程分支名,远程仓库:origin)
- 反合mster代码(如果待上线过程中master有其他版本上线更新的话)
markdown
1. 切换到你的工作分支
git checkout feature-branch
2. 拉取最新的 master 分支代码
git fetch origin (会从远程仓库 origin 获取所有分支的最新数据,但不会自动合并或修改当前工作目录中的文件)
3. 合并 master 分支到你的工作分支
git merge origin/master
4. 解决冲突(如果有)
git add <conflicted-file>
完成合并
git commit
5. 推送合并后的代码到远程仓库
git push origin feature-branch
(通过以上步骤,你可以将 master 分支的最新代码合并到你的工作分支,并提交到远程仓库。)