【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
英文地址,請注明出處:http://en.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系統…