【Git#6】多人协作 企业级开发模型

一、多人协作

1. 同一分支下的协作

目前,我们所完成的工作如下:

  • 基本完成 Git 的所有本地库的相关操作,git基本操作,分支理解,版本回退,冲突解决等等
  • 申请码云账号,将远端信息clone到本地,以及推送和拉取。

是时候干最重要的一件事情了,实现多人协作开发!为了做这件事情,我们需要先做一些准备工作

我们之前已经将项目 clone 到了指定目录,如下:

lighthouse@VM-8-10-ubuntu:git_learning$ pwd
/home/lighthouse/code/gitcode/git_learning

然后我们在 windows 环境下,再 clone 同一个项目仓库,来模拟和你一起协作开发的另一名小伙伴,如下:

image-20250410192900460

注意:上面我们是模拟了两个用户, 但是在实际开发中,每个用户都需要有自己的 gitee/github 账号,如果要多人进行协同开发,必须将用户添加进开发者,用户才有权限进行代码提交

image-20250410193112254

然后进行对用户邀请即可

到此,相当于有了两个用户,分别在 linuxwindows 上针对于同项目进行协作开发,我们的准备工作到此结束

目前,我们的仓库中只有一个 master 主分支,但在实际的项目开发中,在任何情况下其实都是不允许直接在 master 分支上修改代码的,这是为了保证主分支的稳定。所以在开发新功能时,常常会新建其他分支,供开发时进行迭代使用。

那么接下来,就让我们在 gitee 上新建 dev 远程分支供我们使用:

image-20250410193347532

创建成功,结果如下:

image-20250410193419749

🔥 创建成功的远程分支是可以通过 Git 拉取到本地来,以实现完成本地开发工作。

接下来让我们和另一名开发的小伙伴都将远程仓库进行一次拉取操作,并观察结果:

Linux 下进行操作:

lighthouse@VM-8-10-ubuntu:git_learning$ git pull
From gitee.com:island0920/git_learning* [new branch]      dev        -> origin/dev
Already up to date.lighthouse@VM-8-10-ubuntu:git_learning$ git branch -rorigin/HEAD -> origin/masterorigin/devorigin/masterlighthouse@VM-8-10-ubuntu:git_learning$ git checkout -b dev origin/dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.   # 把远程 dev 分支和本地建立联系
Switched to a new branch 'dev'# 查看连接
lighthouse@VM-8-10-ubuntu:git_learning$ git branch -vv 
* dev    61120f2 [origin/dev] first functionmaster d80980f [origin/master] gitignore 配置
  • 注意:之前我们用的 git branch 只能查看本地分支,如果要查看本地分支的话需要加上 -r 选项
  • 但是前提是需要 pull 拉取最新的远端仓库才可以看到最新的内容

拉取后便可以看到远程的 dev 分支,接着切换到 dev 分支供我们进行本地开发

要说明的是,我们切换到的是本地的 dev 分支,根据示例中的操作,会将本地分支和远程分支的进行关系链接。

Windows 下进行操作:

PS D:\笔记\git_learning> git pull
From https://gitee.com/island0920/git_learning* [new branch]      dev        -> origin/dev
Already up to date.PS D:\笔记\git_learning> git branch -a
* masterremotes/origin/HEAD -> origin/masterremotes/origin/devremotes/origin/master# 或者可以用 git branch --set-upstream-to=origin/dev dev 远程链接
PS D:\笔记\git_learning> git checkout -b dev 
Switched to a new branch 'dev'
branch 'dev' set up to track 'origin/dev'.

欧克,现在让我们来正式在 dev 进入开发中,如下:

lighthouse@VM-8-10-ubuntu:git_learning$ cat file.txt
hello git
complete the first function!lighthouse@VM-8-10-ubuntu:git_learning$ git add file.txt
lighthouse@VM-8-10-ubuntu:git_learning$ git commit -m "first function"
[dev 61120f2] first function1 file changed, 2 insertions(+), 1 deletion(-)
lighthouse@VM-8-10-ubuntu:git_learning$ git push origin dev # 把 dev 分支推送到远端

让我们此时来看看码云的状态,如下:

image-20250410205809561

至此,我们已经将代码成功推送至码云,接下来假如你的小伙伴要和你协同开发,碰巧也要对file.txt文件作修改,并试图推送,例如

# 打开对应文件, 在记事本下进行修改(Windows 无 vim 指令)
PS D:\笔记\git_learning> cat .\file.txt
hello git
complete the secone function!
PS D:\笔记\git_learning> git add .\file.txt
PS D:\笔记\git_learning> git commit -m "secone function"
[dev 5eac3b0] secone function1 file changed, 1 insertion(+), 2 deletions(-)# 推送失败
PS D:\笔记\git_learning> git push
To https://gitee.com/island0920/git_learning.git! [rejected]        dev -> dev (fetch first)
error: failed to push some refs to 'https://gitee.com/island0920/git_learning.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这时推送失败,因为你的小伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用 git pull 把最新的提交从 origin/dev 抓下来,然后,在本地进行合并,并解决冲突,再推送。

操作如下:

# 1. 重新拉取
PS D:\笔记\git_learning> git pull# 2. 修改冲突情况
PS D:\笔记\git_learning> cat .\file.txt
hello git
<<<<<<< HEAD
complete the secone function!
=======
complete the first function!
>>>>>>> 1ebc3e7d698207bf142649e1fd7ec97385316ae4
PS D:\笔记\git_learning> cat .\file.txt
hello git
complete the secone function!
complete the first function!# 3. 再次提交
PS D:\笔记\git_learning> git add .\file.txt
PS D:\笔记\git_learning> git commit -m "merge dev"
[dev 961a8e1] merge dev
PS D:\笔记\git_learning> git push

此时,在 码云的 dev 分支下就可以看到当前的新提交了

因此此时我们就可以进行协同开发了,只要不断的进行 git pull/add/commit/push,遇到了冲突,按照之前所学解决即可

  • 对于Linux 端来说,要想看到Windows的代码,只需要 pull一下即可

最后不要忘记,虽然我们是在分支上进行多人协作开发,但最终的目的是要将开发后的代码合并到master上去,让我们的项目运行最新的代码。

接下来我们就需要做这件事情了:

  • 在去 master 分支去合并的时候,我们可以养成一个好习惯:就是先在 dev 分支下合并 master 分支
  • 这么做是因为如果有冲突,可以在 dev 分支上进行处理,而不是在在 master 上解决冲突
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout dev
Already on 'dev'
Your branch is up to date with 'origin/dev'.
lighthouse@VM-8-10-ubuntu:git_learning$ git merge master
Already up to date.

在 dev 分支上合并发现无误之后,再切换到 master 分支进行操作,如下:

lighthouse@VM-8-10-ubuntu:git_learning$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lighthouse@VM-8-10-ubuntu:git_learning$ git merge dev
Updating d80980f..961a8e1
Fast-forwardfile.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)lighthouse@VM-8-10-ubuntu:git_learning$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.(use "git push" to publish your local commits)nothing to commit, working tree clean# 推送 master 分支到远端
lighthouse@VM-8-10-ubuntu:git_learning$ git pushlighthouse@VM-8-10-ubuntu:git_learning$ git status
On branch master
Your branch is up to date with 'origin/master'.nothing to commit, working tree clean

此时在远端仓库的 master 分支下,master 已经是最新的了,如下:

image-20250410212301276

此时,dev分支对于我们来说就没用了,那么dev分支就可以被删除掉。我们可以直接在远程仓库中将 dev 分支删除掉,如下

image-20250410212437426

小结,在同一分支下进行多人协作的工作模式通常是这样:

  1. 首先,可以试图用 git push origin branch-name 推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交(但是解决冲突比较麻烦,一般都是在不同分支下进行的操作)
  4. 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!
  5. 功能开发完毕,将分支 mergemaster,最后删除分支。

2. 不同分支下的协作

🔥 一般情况下,如果有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个 feature 分支。

  • 现在同时有两个需求需要你和你的小伙伴进行开发,那么你们俩便可以各自创建一个分支来完成自己的工作。在上个部分我们已经了解了可以从码云上直接创建远程分支,其实在本地创建的分支也可以通过推送的方式发送到远端。在这个部分我们就来用一下这种方式。

对于你来说,可以进行以下操作:

lighthouse@VM-8-10-ubuntu:git_learning$ git branchdev
* master
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout -b feature-1
Switched to a new branch 'feature-1'
lighthouse@VM-8-10-ubuntu:git_learning$ cat function1
Done!# 提交
lighthouse@VM-8-10-ubuntu:git_learning$ git add function1
lighthouse@VM-8-10-ubuntu:git_learning$ git commit -m "add function1"# 直接推送 -- 失败
lighthouse@VM-8-10-ubuntu:git_learning$ git push
fatal: The current branch feature-1 has no upstream branch.
To push the current branch and set the remote as upstream, usegit push --set-upstream origin feature-1# 本地创建分支推送到远端 
lighthouse@VM-8-10-ubuntu:git_learning$ git push origin feature-1
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 268 bytes | 268.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag fe457285
remote: Create a pull request for 'feature-1' on Gitee by visiting:
remote: https://gitee.com/island0920/git_learning/pull/new/island0920:feature-1...island0920:master
To gitee.com:island0920/git_learning.git* [new branch]      feature-1 -> feature-1# 分支推送成功
lighthouse@VM-8-10-ubuntu:git_learning$ git branchdev
* feature-1master

然后再切换到 Windows 上,相当于另一个人可以进行如下操作:

# 操作之前, 需要保证最新的 git pull
PS D:\笔记\git_learning> git checkout -b feature-2
Switched to a new branch 'feature-2'# 去对应目录创建并编写文件
PS D:\笔记\git_learning> cat .\function2.txt
I am coding...PS D:\笔记\git_learning> git add .
PS D:\笔记\git_learning> git commit -m "add function2"
[feature-2 d25c5b3] add function21 file changed, 1 insertion(+)create mode 100644 function2.txt# 直接推送失败
PS D:\笔记\git_learning> git push
fatal: The current branch feature-2 has no upstream branch.
To push the current branch and set the remote as upstream, usegit push --set-upstream origin feature-2To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.# 推送成功
PS D:\笔记\git_learning> git push origin feature-2
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 279 bytes | 279.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 4d424297
remote: Create a pull request for 'feature-2' on Gitee by visiting:
remote: https://gitee.com/island0920/git_learning/pull/new/island0920:feature-2...island0920:master
To https://gitee.com/island0920/git_learning.git* [new branch]      feature-2 -> feature-2

此时,在本地,你看不见他新建的文档,他看不见你新建的文档。并且推送各自的分支时,并没有任何冲突,你俩互不影响,用起来很舒服!!

此时远端码云的状态如下:

image-20250410214500453

两个人协作开发的状态图也如下:

image-20250410214546223

正常情况下,你俩就可以在自己的分支上进行专业的开发了!

但天有不测风云,另一个人突然生病了,但需求还没开发完,需要你帮他继续开发,于是他便把 feature-2分支名告诉你了。这时你就需要在自己的机器上切换到 feature-2 分支帮忙继续开发

  • 其实现在的操作就和之前在同一分支类似了,要做的操作如下:
# 操作之前, 必须先拉取远端仓库
lighthouse@VM-8-10-ubuntu:git_learning$ git pull# 可以看到远程已经有了 feature-2
lighthouse@VM-8-10-ubuntu:git_learning$ git branch -adev
* feature-1masterremotes/origin/HEAD -> origin/masterremotes/origin/devremotes/origin/feature-1remotes/origin/feature-2remotes/origin/master# 切换到feature-2分⽀上,可以和远程的feature-2分⽀关联起来,
# 否则将来只使⽤ git push 推送内容会失败
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout -b feature-2 origin/feature-2
Branch 'feature-2' set up to track remote branch 'feature-2' from 'origin'.
Switched to a new branch 'feature-2'
lighthouse@VM-8-10-ubuntu:git_learning$ ls
a.so  b.ini  file.txt  function2.txt  README.en.md  README.md

切换成功后,便可以看见 feature-2 分支中的 function2 文件了,接着就可以帮小伙伴进行开发:

lighthouse@VM-8-10-ubuntu:git_learning$ cat function2.txt
I am coding...
I am coding...# 推送内容
lighthouse@VM-8-10-ubuntu:git_learning$ git add .
lighthouse@VM-8-10-ubuntu:git_learning$ git commit -m "md function2"
[feature-2 d026c28] md function21 file changed, 2 insertions(+), 1 deletion(-)
lighthouse@VM-8-10-ubuntu:git_learning$ git push origin feature-2

这时,另一个人已经修养的差不多,可以继续进行自己的开发工作,那么他首先要获取到你帮他开发的内容,然后接着你的代码继续开发。或者你已经帮他开发完了,那他也需要在自己的电脑上看看你帮他写的代码:

PS D:\笔记\git_learning> git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 244 bytes | 8.00 KiB/s, done.
From https://gitee.com/island0920/git_learningd25c5b3..d026c28  feature-2  -> origin/feature-2
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.git pull <remote> <branch>If you wish to set tracking information for this branch you can do so with:git branch --set-upstream-to=origin/<branch> feature-2 # 需要远端再次链接# 发现之前 push 失败, 内容不变
PS D:\笔记\git_learning> cat .\function2.txt
I am coding...
  • Pull 无效的原因是小伙伴没有指定本地 feature-2 分支与远程 origin/feature-2 分支的链接
  • 根据提示,设置 feature-2origin/feature-2 的链接即可
PS D:\笔记\git_learning> git branch --set-upstream-to=origin/feature-2 feature-2
branch 'feature-2' set up to track 'origin/feature-2'.
PS D:\笔记\git_learning> git pull
Updating d25c5b3..d026c28
Fast-forwardfunction2.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)# 拉取成功
PS D:\笔记\git_learning> cat .\function2.txt
I am coding...
I am coding...

目前,小伙伴的本地代码和远端保持严格一致。你和你的小伙伴可以继续在不同的分支下进行协同开发了。

  • 注意:各自功能开发完毕后,不要忘记我们需要将代码合并到 master 中才算真正意义上的开发完毕。

由于你的小伙伴率先开发完毕,于是开始 merge

# 1. 切换至 master. pull 保证本地是最新内容
PS D:\笔记\git_learning> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS D:\笔记\git_learning> git pull
Already up to date.# 2. 切换分支, 合并 master 分支
PS D:\笔记\git_learning> git checkout feature-2
Switched to branch 'feature-2'
Your branch is up to date with 'origin/feature-2'.
PS D:\笔记\git_learning> git merge master
Already up to date.# 3. 切换至 master 分支, 合并分支
PS D:\笔记\git_learning> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS D:\笔记\git_learning> git merge feature-2
Updating 961a8e1..d026c28
Fast-forwardfunction2.txt | 2 ++1 file changed, 2 insertions(+)create mode 100644 function2.txt# 4. 推送 master 分支
PS D:\笔记\git_learning> git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.(use "git push" to publish your local commits)nothing to commit, working tree cleanPS D:\笔记\git_learning> git push origin master

同样地,我们开发完之后,也要进行如上操作,如下:

# 切换⾄ master分⽀, pull ⼀下,保证本地的master是最新内容。
# 合并前这么做是⼀个好习惯
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lighthouse@VM-8-10-ubuntu:git_learning$ git pull
From gitee.com:island0920/git_learning961a8e1..d026c28  master     -> origin/master
Updating 961a8e1..d026c28
Fast-forwardfunction2.txt | 2 ++1 file changed, 2 insertions(+)create mode 100644 function2.txt# 切换⾄ feature-1 分⽀, 合并 master 分⽀
# 这么做是因为如果有冲突,可以在feature-1分⽀上进⾏处理,⽽不是在在master上解决冲突。
# 这么做是⼀个好习惯
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout feature-1
Switched to branch 'feature-1'
lighthouse@VM-8-10-ubuntu:git_learning$ git merge master
Merge made by the 'ort' strategy.function2.txt | 2 ++1 file changed, 2 insertions(+)create mode 100644 function2.txt
lighthouse@VM-8-10-ubuntu:git_learning$ ls
a.so  b.ini  file.txt  function1  function2.txt  README.en.md  README.md# 1、由于feature-1分⽀已经merge进来了新内容,为了保证远程分⽀最新,所以最好push⼀下。
# 2、要 push 的另⼀个原因是因为在实际的开发中,master的merge操作⼀般不是由我们⾃⼰在本地
# 进⾏操作,其他⼈员或某些平台merge时,操作的肯定是远程分⽀,所以就要保证远程分⽀的最新。
# 3、如果 merge 出现冲突,不要忘记需要commit才可以push!!
lighthouse@VM-8-10-ubuntu:git_learning$ git push origin feature-1
Enumerating objects: 4, done.
...# 切换至 master 分支, 合并 feature-1 分支
lighthouse@VM-8-10-ubuntu:git_learning$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lighthouse@VM-8-10-ubuntu:git_learning$ git merge feature-1
Updating d026c28..cff72ed
Fast-forwardfunction1 | 1 +1 file changed, 1 insertion(+)create mode 100644 function1# 推送 Master 到远端
lighthouse@VM-8-10-ubuntu:git_learning$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.(use "git push" to publish your local commits)nothing to commit, working tree clean
lighthouse@VM-8-10-ubuntu:git_learning$ git push origin master

此时远程仓库状态如下:

image-20250410223318216

此时, feature-1feature-2 分支对于我们来说就没用了,那么我们可以直接在远程仓库中将dev分支删除掉:

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

3. 思考

为啥远程分支删除后,本地 git branch-a 依然能看到,该怎么解决?

  • 当前我们已经删除了远程的几个分支,使用 git branch-a 命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。

例如

lighthouse@VM-8-10-ubuntu:git_learning$ git pull
Already up to date.
lighthouse@VM-8-10-ubuntu:git_learning$ git branch -adevfeature-1feature-2
* masterremotes/origin/HEAD -> origin/masterremotes/origin/devremotes/origin/feature-1remotes/origin/feature-2remotes/origin/master

使用命令 git remote show origin,可以査看remote地址,远程分支,还有本地分支与之相对应关系等信息。

lighthouse@VM-8-10-ubuntu:git_learning$ git remote show origin
* remote originFetch URL: git@gitee.com:island0920/git_learning.gitPush  URL: git@gitee.com:island0920/git_learning.gitHEAD branch: masterRemote branches:master                        trackedrefs/remotes/origin/dev       stale (use 'git remote prune' to remove)refs/remotes/origin/feature-1 stale (use 'git remote prune' to remove)refs/remotes/origin/feature-2 stale (use 'git remote prune' to remove)Local branches configured for 'git pull':dev       merges with remote devfeature-2 merges with remote feature-2master    merges with remote masterLocal ref configured for 'git push':master pushes to master (up to date)

此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用 git remote prune origin 命令:

lighthouse@VM-8-10-ubuntu:git_learning$ git branch -adevfeature-1feature-2
* masterremotes/origin/HEAD -> origin/masterremotes/origin/master

这样就删除了那些远程仓库不存在的分支,而对于本地仓库的分支删除之前已经说过了,就不提了(git branch -d 分支

二、企业级开发模型

1. 背景

我们知道,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。

最初,程序比较简单,工作量不大,程序员一个人可以完成所有阶段的工作。但随着软件产业的日益发展壮大,软件的规模也在逐渐变得庞大。软件的复杂度不断攀升,一个人已经hold不住了,就开始出现了精细化分工

如下图所示:

image-20250412192050596

但在传统的 IT组织下,开发团队(Dev)和运维团队(0ps)之间诉求不同:

  • 开发团队(尤其是敏捷团队)追求变化。
  • 运维团队追求稳定

双方往往存在利益的冲突。比如,精益和敏捷的团队把持续交付作为目标,而运维团队则为了线上的稳定而强调变更控制。部门墙由此建立起来,这当然不利于IT 价值的最大化。

为了弥合开发和运维之间的鸿沟,需要在文化、工具和实践方面的系列变革 – DevOps 正式登上舞台。

  • DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。
  • 透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。在DevOps的软件开发过程包含计划、编码、构建、测试、预发布、发布、运维、监控,由此可见DevOps的强大。

讲了这么多,这个故事到底和我们课程的主题 Git 有什么关系呢?举一个很简单的例子就能说明这个问题。一个软件的迭代,在我们开发人员看来,说白了就是对代码进行迭代,那么就需要对代码进行管理。如何管理我们的代码呢,那不就是 Git(分布式版本控制系统)!所以 Git 对于我们开发人员来说其重要性就不言而喻了。

2. 系统开发环境

言归正传,对于开发人员来说,在系统开发过程中最常用的几个环境必须要了解一下:

  1. 开发环境: 开发环境是程序猿们专门用于日常开发的服务器。为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。

  2. 测试环境:一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。该环境是开发环境到生产环境的过渡环境。

  3. 预发布环境:该环境是为避免因测试环境和线上环境的差异等带来的缺陷漏测而设立的一套环境。吃其配置等基本和生产环境一致,目的是能让我们发正式环境时更有把握!所以预发布环境是你的产品质量最后一道防线,因为下一步你的项目就要上线了。要注意预发布环境服务器不在线上集成服务器范围之内,为单独的一些机器。

  4. 生产环境:是指正式提供对外服务的线上环境,例如我们目前在移动端或PC端能访问到的APP都是
    生产环境。

这几个环境也可以说是系统开发的三个重要阶段:开发->测试->上线。一张图总结:

image-20250412192752683

对于规模稍微大点的公司来说,可不止这么几个环境,比如项目正式上线前还存在仿真/灰度环境,再比如还存在多套测试环境,以满足不同版本上线前测试的需要。

一个项目的开始从设计开始,而一个项目的成功则从测试开始。一套良好的测试体系可以将系统中绝大部分的致命Bug解决在系统上线之前。测试系统的完善和成熟也是衡量一个软件企业整体水平的重要指标之一,测试往往被忽视,因为它对可以的隐性、对软件开发企业不产生直接的效益,但是它却是软件质量的最终保障,乃至项目能否成功的重要因素!

3. Git 分支设计规范

环境有了概念后,那么对于开发人员来说,一般会针对不同的环境来设计分支,例如:

分支名称适用环境
master主分支生产环境
release预发布分支预发布/测试环境
develop开发分支开发环境
feature需求开发分支本地
hotfix紧急修复分支本地

① master分支

  • master 为主分支,该分支为只读且唯一分支。用于部署到正式发布环境,一般由合并 release 分支得到。
  • 主分支作为稳定的唯一代码库,任何情况下不允许直接在 master 分支上修改代码。
  • 产品的功能全部实现后,最终在master分支对外发布,另外所有在master分支的推送应该打标签(tag)做记录,方便追溯。
  • master 分支不可删除。

② release 分支

  • release 为预发布分支,基于本次上线所有的 feature 分支合并到 develop 分支之后,基于 develop 分支创建。可以部署到测试或预发布集群。
  • 命名以 release/开头,建议的命名规则:release/version_publishtime
  • release 分支主要用于提交给测试人员进行功能测试。发布提测阶段,会以 release 分支代码为基准进行提测。
  • 如果在 release 分支测试出问题,需要回归验证 develop 分支看否存在此问题。
  • release 分支属于临时分支,产品上线后可选删除。

③ develop 分支

develop 为开发分支,基于 master 分支创建的只读且唯一分支,始终保持最新完成以及bug修复后的代码。可部署到开发环境对应集群。
可根据需求大小程度确定是由 feature 分支合并,还是直接在上面开发(非常不建议)

⑤ feature 分支

  • feature 分支通常为新功能或新特性开发分支,以 develop 分支为基础创建 feature 分支
  • 命名以 feature/ 开头,建议的命名规则:feature/user_createtime_feature
  • 新特性或新功能开发完成后,开发人员需合到 develop 分支。
  • 一旦该需求发布上线,便将其删除。

⑥ hotfix 分支

  • hotfix 分支为线上 bug 修复分支或叫补丁分支,主要用于对线上的版本进行 bug修复。当线上
    出现紧急问题需要马上修复时,需要基于 master 分支创建 hotfix 分支。
  • 命名以 hotfix/ 开头,建议的命名规则:hotfix/user_createtime_hotfix
  • 当问题修复完成后,需要合并到 master 分支和 develop 分支并推送远程。一旦修复上线,便

image-20250412193222906

其实,以上跟大家讲解的是企业级常用的一种 Git 分支设计规范:Git Flow 模型

但要说的是,该模型并不是适用于所有的团队、所有的环境和所有的文化。如果你采用了持续交付,你会想要一些能够尽可能简化交付过程的东西。有些人喜欢基于主干的开发模式,喜欢使用特性标志。然而,从测试的角度来看,这些反而会把他吓一跳。

关键在于站在你的团队或项目的角度思考:这种分支模型可以帮助你们解决哪些问题?它会带来哪些问题?这种模式为哪种开发提供更好的支持?你们想要鼓励这种行为吗?你选择的分支模型最终都是

为了让人们更容易地进行软件协作开发。因此,分支模型需要考虑到使用者的需求,而不是盲目听信某些所谓的“成功的分支模型”

所以对于不同公司,规范是会有些许差异,但万变不离其宗,是为了效率与稳定。

三、企业级管理实战

1. 具体流程

1.1 DevOps 研发平台

Gitee 企业版免费版

image-20250412194103118

  • 这里企业名称可随意填写一个测试名称,只要能通过即可
  • 注意:多人协作开发,需要将多人账号拉入一个企业下才行
1.2 创建项目

image-20250412194402154

image-20250412194432187

image-20250412194552545

1.3 创建仓库

image-20250412194641571

image-20250412194808938

image-20250412200154535

image-20250412194941227

注意:创建的仓库可以关联到某个项目中被管理起来

1.4 添加成员

① 添加企业成员

  • 注意:申请后需要负责人进行审批才可以通过

image-20250412195738455

image-20250412195200773

② 添加项目成员

image-20250412195406625

③ 添加仓库开发人员

image-20250412195829729

1.5 添加仓库开发人员

image-20250412200242402

2. 开发场景 – 基于 git flow 模型的实践

现有⼀个订单管理的新需求需要开发,首先可以基于 develop分支创建⼀个 feature/hyb_order_20250412 分支

image-20250412201231662

image-20250412201319709

① 需求在 feature/hyb_order_20250412 分支开发完毕,这时研发人员可以将代码合并到 develop 分支,将其部署在开发环境的服务器中,方便开发人员进行测试和调试。

a. 开发者在 feature 分支下发起a请求评审

image-20250412202106864

image-20250412202205257

b. 审查员审查代码

image-20250412202305668

c. 审查通过,合并分支

image-20250412202339469

d. 合并成功,查看结果

image-20250412202450110

② 在 develop 下开发人员自测通过后,先确定下 develop 不存在未测试完毕的需求,然后研发人员可基于 develop 分支创建一个 release/xxx 分支出来,可交由测试人员进行测试。

image-20250412202722681

③ 测试人员测试 release 通过后(包含测试环境和预发布环境的测试),就可将代码合并入 master

image-20250412203035275

image-20250412203138569

④ 测试人员在 master(正式环境) 测试通过后,便可删除 feature/xxx 分支

image-20250412203235535

3. bug 修复

  1. 修复测试环境 Bug

    • develop 测试出现了Bug,建议大家直接在 feature 分支上进行修复。
      修复后的提测上线流程 与 新需求加入的流程一致。
  2. 修改预发布环境 Bug

    • release 测试出现了 Bug,首先要回归下 develop 分支是否同样存在这个问题。
    • 如果存在,修复流程 与 修复测试环境 Bug流程一致。
    • 如果不存在,这种可能性比较少,大部分是数据兼容问题,环境配置问题等。
  3. 修改正式环境 Bug

    1. 在 master 测试出现了Bug,首先要回归下 release 和 develop 分支是否同样存在这个问题
    2. 如果存在,修复流程 与 修复测试环境 Bug流程一致
    3. 如果不存在,这种可能性也比较少,大部分是数据兼容问题,环境配置问题等
  4. 紧急修复正式环境 Bug

    • 需求在测试环节未测试出 Bug,上线运行一段时候后出现了 Bug,需要紧急修复的
    • 有的企业面对紧急修复时,支持不进行测试环境的验证,但还是建议验证下预发布环境
    • 可基于 master 创建 hotfix/xxx 分支,修复完毕后发布到 master验证,验证完毕后,master 代码合并到 develop 分支,同时删掉 hotfix/xxx 分支。

4. 扩展阅读

其他 DevOp 研发平台

  • 腾讯 coding
  • 阿里云效

扩展实践

  • 阿里飞流flow分⽀模型,及项目版本管理实践

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89879.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 中的强大运算符

C# 中鲜为人知的强大运算符 C# 还提供了一些"冷门"但功能强大的运算符&#xff0c;这些运算符在特定场景下能极大简化代码并提高效率。 1. 空合并赋值运算符 ?? // 传统写法 if (variable null) {variable defaultValue; }// 使用 ?? variable ?? defaultVal…

用window字体替换zabbix 默认的字体

我们先需要在windows系统下的C:\Windows\Fonts目录&#xff0c;找到一个喜欢的字体&#xff0c;我选择的是微软雅黑。复制到其它路径下&#xff0c;选取一个msyh.ttc。到服务器上。要把msyh.ttc改为msyh.ttf才可以。不然最后中英文都不显示[roothadoop105.yinzhengjie.com ~]# …

MySQL 17 如何正确地显示随机消息?

假设有一个场景&#xff0c;一个英语学习APP首页有一个随机显示单词的功能&#xff0c;用户每次访问首页的时候&#xff0c;都会随机滚动显示三个单词。 已知表里有10000条记录&#xff0c;来看看随机选择3个单词有什么方法&#xff0c;又存在什么问题。 建表语句&#xff1a…

7-Zip 曝出两个可导致拒绝服务的中危漏洞

研究人员在全球使用最广泛的开源文件压缩软件7-Zip中新发现两个漏洞&#xff08;CVE-2025-53816和CVE-2025-53817&#xff09;。这两个漏洞影响7-Zip 25.0.0之前的所有版本&#xff0c;虽然不能实现远程代码执行&#xff0c;但可能引发内存损坏和拒绝服务&#xff08;Denial of…

史上最简单Conda+Ollama+Open-Webui安装方法!

史上最简单CondaOllamaOpen-Webui安装方法 一、安装Anaconda 1、到Anaconda官网下载conda_24.10.1 链接&#xff1a;https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Windows-x86_64.exe 2.双击安装包&#xff0c;开始安装 选择All Users 切记安装路径不要选C盘&am…

Python-数据库概念-pymysql-元编程-SQLAlchemy-学习笔记

序 欠4前年的一份笔记 &#xff0c;献给今后的自己。 数据库 概念 数据库&#xff1a;按照数据结构来组织、存储、管理数据的仓库。 诞生 计算机的发明是为了做科学计算的&#xff0c;而科学计算需要大量的数据输入和输出。 早期&#xff0c;可以使用打孔卡片的孔、灯泡的亮灭来…

Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上

借助 U 盘或 TF 卡拷贝程序到开发板上我们已经学习了怎么在 ubuntu 和 windows 上互传文件&#xff0c;那么怎么把 ubuntu 或 win 上的程序拷贝到开发板呢&#xff0c;这里给大家介绍第一种方法&#xff0c;使用 U 盘或者 TF 卡来完成&#xff0c;如果大家使用的是 U 盘&#x…

【亲测有效】防检测插件playwright_stealth 2.X版本快速使用

这里写自定义目录标题核心方法apply_stealth_syncuse_sync和use_async一. playwright_stealth 2.0以上版本1.同步方法2.异步方法3.实例二.playwright_stealth 2.0以下版本playwright-stealth 是一个用于 Playwright 的库&#xff0c;旨在帮助自动化脚本避开一些检测机制&#x…

docker安装与简单项目上手

1.docker安装 系统版本为almalinux9.6 首先添加一下docker的软件安装源&#xff08;源选择的阿里云&#xff0c;只要是rhel的系统都适用&#xff0c;无论是rockylinux还是almalinux还是红帽企业版&#xff09; dnf config-manager --add-repo https://mirrors.aliyun.com/doc…

计算机网络基础:从协议到通信全解析(大致框架)

本节重点&#xff1a;1.了解网络发展背景&#xff0c;对局域网/广域网的概念有基本认识2.了解网络协议的意义&#xff0c;重点理解TCP/IP五层结构模型3.学习网络传输的基本流程&#xff0c;理解封装和解包分用一、计算机网络发展背景&#xff1a;人与人之间是需要协同工作的&am…

PDF 编辑器:多文件合并 拆分 旋转 顺序随便调 加水印 密码锁 页码背景

各位打工人、学生党们&#xff0c;你们是不是也遇到过这种情况&#xff0c;领导甩来一个PDF让你改&#xff0c;结果你捣鼓半天&#xff0c;发现这玩意儿根本动不了&#xff0c;简直想原地爆炸&#xff01;别急别急&#xff0c;今天就给你们安利一个办公软件——PDF编辑器&#…

【软件基础学习配置那些事 4-3】3ds Max2026 菜单栏常用命令-----文件、视图、编辑、工具、组

3ds Max学习的笔记小知识&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;后续都会补充添加&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;个人的一些学习笔记&#xff0c;如有不对&#xff0c;欢迎订正&am…

网络爬虫的介绍

网络爬虫库网络爬虫通俗来讲就是使用代码将HTML网页的内容下载到本地的过程。爬取网页主要是为了获取网中的关键信息&#xff0c;例如网页中的数据、图片、视频等。Python语言中提供了多个具有爬虫功能的库&#xff0c;下面将具的介绍。urlib库:是Python自带的标准库&#xff0…

C# 编程实战进阶:字符串与字符串数组 (3)

目录 1、给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 2、无重复字符的最长字符串 &#xff0c;给定一个字符串 s 请你找出其中不含有重复字符的最长字符串的长度。 3、给定两个字符串 s 和 t &#xff0c;它们只包含小…

Python趣味算法:百钱百鸡问题——双重循环优化与算法效率分析

如何用Python解决中国古代数学难题?本文从暴力枚举到高效优化,带你领略算法之美,效率提升100倍! 看在每天坚持分享有趣知识的份上,点个关注吧(づ ̄ 3 ̄)づ 关注是我更新的动力 ̄︶ ̄∗ ̄︶ ̄∗) 作者会分享更多涉及到各种编程语言的有趣知识!(^∀^●)ノシ 目录 …

JAVA_TWO-初识Java2

1.IDEA管理Java程序的结构2.idea编译后的class文件在哪在工程out文件夹下。3.idea一些快捷键4.导入模块File→New→Module from Existing Sources → 添加后缀.iml文件5.注释单行注释 //多行注释 /* 注释内容1注释内容2 */文档注释 /** 注释内容 */ &#xff08;文档注释内容可…

二、Dify 版本升级教程(LInux-openeuler)

首先&#xff0c;你需要先按照好dify&#xff0c;然后才能升级&#xff0c;本文教程是基与Docker Compose 如果你还没有安装&#xff0c;可以看看这个教程。 一、Dify 私有部署、本地安装教程&#xff08;LInux-openeuler&#xff09;_dify1.5版本部署-CSDN博客 安装完成后&a…

Java 大视界 -- Java 大数据在智能安防门禁系统中的多生物特征融合识别与权限管理(280)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 本博…

【Tools】Ubuntu24.04安装详细教程

00. 目录 文章目录00. 目录01. Ubuntu 24.04简介02. Ubuntu 24.04下载03. Ubuntu 24.04虚拟机创建04. Ubuntu 24.04安装步骤05. Ubuntu 24.04常用软件06. 附录01. Ubuntu 24.04简介 Ubuntu 24.04 LTS&#xff08;代号“Noble Numbat”&#xff09;是Canonical于2024年4月25日发…

linux基础入门Ubuntu 22.04 系统中添加、删除和授予用户 sudo权限

在 Ubuntu 中&#xff0c;sudo 允许授权用户以 root 级别权限执行任务&#xff0c;即使他们不知道 root 用户密码。这对于执行管理任务非常重要&#xff0c;因为它可以避免直接使用 root 用户&#xff0c;从而减少系统被误操作的风险&#xff0c;同时在企业生产中由于ubuntu系统…