Q:
如果目前开发有如下情况,基础版本A,已经上线,现在同时开发功能B,C,D,其中B开发完了,部署到测试环境等待测试进行测试,C功能正在开发,D功能也开发完了,现在测试要测试B,D功能,但是上线的话,B,C上线,D的话后续版本才会上线 。所以使用git的话,如何在基础A版本上,进行分支合并等操作,使得满足我这个情况?
A:
- 创建分支
-
- 从主分支(假设主分支叫
main,对应基础版本 A)为每个新功能创建独立分支:
- 从主分支(假设主分支叫
-
-
- 为功能 B 创建分支
feature/B:git checkout -b feature/B main,开发人员在这个分支上完成功能 B 的开发,完成后推送到远程仓库。 - 为功能 C 创建分支
feature/C:git checkout -b feature/C main,开发人员持续在该分支进行功能 C 的开发。 - 为功能 D 创建分支
feature/D:git checkout -b feature/D main,开发人员完成功能 D 开发后,推送到远程仓库。
- 为功能 B 创建分支
-
- 测试功能 B 和 D
-
- 测试人员要测试 B 和 D 时,在测试环境拉取对应的分支代码:
-
-
- 拉取
feature/B分支到测试环境部署,测试人员进行测试。 - 拉取
feature/D分支到测试环境部署,测试人员进行测试。
- 拉取
-
- 准备上线 B 和 C
-
- 当测试 B 没问题后,将
feature/B分支合并到main分支:
- 当测试 B 没问题后,将
-
-
- 首先切回主分支
git checkout main - 然后合并
feature/B:git merge --no-ff feature/B,--no-ff选项可以保留功能分支的提交历史,方便后续追溯。
- 首先切回主分支
-
-
- 由于 C 还在开发中,等 C 开发完成测试通过后,同样切回主分支,再合并
feature/C:
- 由于 C 还在开发中,等 C 开发完成测试通过后,同样切回主分支,再合并
-
-
git checkout maingit merge --no-ff feature/C
-
- 处理后续版本的 D
-
- 功能 D 不在本次上线范围,它的分支
feature/D可以保留在远程仓库,后续需要上线 D 时,再按上述合并流程,将feature/D合并到main分支。如果后续开发过程中,还需要基于feature/D继续开发,可以继续在该分支提交代码。同时,为了避免代码冲突,在合并feature/D到main分支前,建议先拉取最新的main分支代码到feature/D分支,解决潜在冲突 ,操作如下:
- 功能 D 不在本次上线范围,它的分支
-
-
git checkout feature/Dgit pull origin main- 解决冲突后,推送
feature/D分支到远程仓库,再按合并流程操作。
-
Q:
只有一台测试服务器,有没有一种情况,可以把B和D的代码合并,部署到测试环境,这样测试同事可以同时测试B和D的功能,但是如何处理后续,只上线B功能,不上线D功能,D功能后面版本迭代才上线
A:
可以通过创建一个临时合并分支来解决这个问题:
- 创建临时合并分支
-
- 首先,切换到主分支:
git checkout main - 然后创建一个临时分支,用于合并 B 和 D 功能的代码:
git checkout -b temp_bd - 接着把
feature/B和feature/D分支分别合并进来:
- 首先,切换到主分支:
-
-
git merge --no-ff feature/Bgit merge --no-ff feature/D
-
-
- 将这个临时分支
temp_bd部署到唯一的测试服务器上,这样测试人员就可以同时测试 B 和 D 功能了。
- 将这个临时分支
- 上线 B 功能
-
- 当测试完成且 B 功能准备上线时,切换回主分支:
git checkout main - 把
feature/B分支合并到主分支:git merge --no-ff feature/B,此时 B 功能就进入了正式上线流程。
- 当测试完成且 B 功能准备上线时,切换回主分支:
- 清理临时分支
-
- 切换到临时分支
temp_bd:git checkout temp_bd - 撤销
feature/D分支合并进来的操作,恢复到只包含 B 功能代码的状态。如果还没有提交feature/D的合并,直接使用git reset --hard HEAD^(^表示撤销上一步操作)。要是已经提交了,可以使用git revert -m 1 <commit-ID>,其中<commit-ID>是合并feature/D的提交 ID,-m 1表示选择合并进来的第一个父提交,也就是保留主分支的状态,撤销分支的合并。 - 清理临时分支:
git branch -d temp_bd
- 切换到临时分支
- 后续 D 功能上线
-
- 当 D 功能在后续版本需要上线时,切换回主分支:
git checkout main - 把经过后续迭代完善的
feature/D分支合并到主分支:git merge --no-ff feature/D。这样就可以把 D 功能上线到正式产品中。
- 当 D 功能在后续版本需要上线时,切换回主分支: