【Git工具實戰】實用真實 Git 開發工作流程

前言

  • 最近工作中發現,很多開發人員連最基本的Git怎么使用都不知道,比如什么時候切分支,什么時候合并代碼,代碼遇到沖突怎么辦,經常出現掉代碼,代碼合并后丟失的情況。
  • 以下為個人總結的常規Git開發工作流程的使用,每個公司使用不一致,僅供參考
    在這里插入圖片描述

分支分類

  • dev(開發)
  • test(測試)
  • uat (預發布)
  • master (生產)
    在這里插入圖片描述

研發流程

  1. 需求評審
  2. 開發排期
  3. 編碼開發
  4. 冒煙測試(單元測試)
  5. 冒煙通過,提交測試,合并代碼到測試分支,部署測試環境
  6. 測試環境測試,開發修 BUG
  7. 測試完成,提交預發,合并代碼到預發分支,部署預發環境
  8. 預發環境測試,開發修 bug
  9. 測試完成,產品驗收
  10. 驗收完成后,基于生產分支進行TAG
  11. 提交生產,合并代碼到生產分支,部署生產環境
  12. 生產運營(客戶)驗收
  13. 驗收完成,結項

實際操作

代碼拉取

git clone https://code.xxx.com/xxx/xxx.git
  • 查看本地分支:git branch
  • 查看遠程分支:git branch -a

創建版本分支

  • 本地創建版本分支:git branch fix-20240223-order
  • 本地切換版本分支:git checkout fix-20240223-order
  • 本地推送版本至遠程倉庫:git push origin fix-20240223-order:fix-20240223-order

分支名稱是有規范和含義的,不能亂取
推薦格式:分支責任-需求日期/需求號-業務類型,一般按部門規范來,常見的有以下幾種:

  • feat:新功能
  • fix:修補bug
  • doc:文檔
  • refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
  • test:測試
  • chore:構建過程或輔助工具的變動
  • 為啥拉取的是生產/預發分支

之所以要拉取 master 分支而不是拉取 dev/test,是因為后者可能包含著一些其他成員還未上線或者可能有 BUG的需求代碼,這些代碼沒有通過驗證,如果被你給拉取了,然后又基于此進行新的需求開發,那當你需求開發完成,而其他成員的需求還沒上線,你將會把這些未驗證的代碼一起發送到 uat/master上,導致一系列問題。

在這里插入圖片描述

需求完成,提交代碼

  • 提交代碼:
  • 首先先在本地把新的改動提交,提交描述的格式可以參考著分支名的格式

如果是新需求的提交,可以寫成 “feat: 需求20240111-新增導出”
如果是 bug 修復,可以寫成 “fix: 禪道3387-重復請求處理”

  • 提交本地代碼至遠程倉庫
git add .
git commit -m "提交描述"
git push origin fix-20240223-order:fix-20240223-order
  • 提交之前可能需要更新,因為該分支是一個版本分支,可能開發人員有幾個人同時在這個版本分支進行開發,這個時候可能同一種業務就可能存在代碼沖突,需要解決。

版本需求完成,合并代碼

  • 首先,我們需要認知到的是,每一個分支應該只對應一個版本,例如當我們開發01版本時,那么就創建一個 feat-01-order 分支進行開發;開發版本 02 時,就另外創建一個 feat-02-member 分支進行開發;修改生產環境的某個 bug 時,就創建 fix-bug-3378 進行開發,等等。

這樣做的目的是,能夠把不同的功能/需求/修改分離開來。想象一下這樣一個場景,如果有某些緊急的需求是需要提前上線的,而此時你的分支里既包含了這些緊急的需求,又包含了其他未開發好的需求,那么這兩種需求就不能拆開來分別進行提測和上線了。

  • 其次,在合并代碼時,我們要將四種分支模型(dev、test、uat、master)作為參照物,而不是把關注點放在自己的分支上。比如我們要在 dev 上調試,那就需要把自己的分支合并到 dev 分支上;如果我們需要提測,則把自己的分支合并到 test 分支上,以此類推。

我們要關注到,這四個環境的分支上,會有什么內容,會新增什么內容。「切記不能反過來將除了 master 之外的三個分支合并到自己的代碼上!!」 如果其他成員將自己的代碼也提交到 dev 分支上,但是這個代碼是沒有通過驗證的,此時你將 dev 往自己的分支上合,那之后的提測、上預發、生產則很大概率會出問題。「所以一定要保持自己的分支是干凈的!」 而 master 分支對應的是生產環境,一般是最新的穩定版本,所以合并到自己的分支以獲取最新的更改也是沒什么問題的。

  • 前面我們已經把本地的版本分支推送至遠程倉庫后,在本地進行分支合并至 dev或者test
  • 把 本地版本分支 fix-20240223-order 更新至最新的代碼,如合并至dev分支,更新dev分支至最新代碼
  • 切換至 dev 分支:git checkout dev
  • 版本分支合并至dev分支(沖突解決):git merge fix-20240223-order
  • 環境分支推送至遠程倉庫:git push origin dev

常見問題

預發環境修完的 bug 要重新走測試再走預發,為什么呢?

預發布環境是介于測試和生產環境之間的一個環境,它的目的是模擬生產環境并進行更真實的測試。它是一個重要的測試環境,需要保持穩定和可靠。通過對修復的BUG再次提交到測試環境測試,可以確保預發布環境中的軟件版本是經過驗證的,并且沒有明顯的問題。

當然,也不是非要這么做不可,緊急情況下,也可以選擇直接發到預生產重新測試

代碼合并錯誤,并且已經推送到遠程分支,如何解決?

  • 假設是在本地合并,本來要把特性分支合并到 uat 分支,結果不小心合到了 master分支
  • 切換到特性分支合并到的錯誤分支,比如是 master:git checkout master
  • 查看最近的合并信息(按 q 退出查看):git log --merges
  • 撤銷合并:git revert -m 1 <merge commit ID>
    【這里的 merge commit ID 就是上一步查詢出來的 ID 或者 ID 的前幾個字符】
  • 撤銷遠程倉庫的推送:git push -f origin master
    【這個命令會強制推送本地撤銷合并后的 release 分支到遠程倉庫,覆蓋掉遠程倉庫上的內容。(即,得通過一個新的提交來“撤銷”上一次的提交,本質上是覆蓋)】

cherry-pick 指令

  • 作用:選擇某些提交的變更并將其應用到當前分支
  • 與 merge 的區別:如果你需要另一個分支的所有代碼變動。那么就采用 merge;如果你只需要部分代碼變動(某幾個提交),那么就采用 cherry-pick

場景:有時候分支不一定是完全按照需求號來開發的,可能按照周期來進行開發,那當前版本內的分支上,可能就會包含著很多需求的提交,這時候,如果產品要求你只上某一個需求,但是其他的暫時還不能上,那就需要使用到 cherry pick 的操作,將該需求囊括的所有提交應用到對應環境分支上。「一定要注意梳理清楚被拆分需求是由多少 commit 組成的,不要有遺漏和多選。」
【更多參考:https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html】

在這里插入圖片描述

寫在最后

  • 在團隊內部使用規范的 Git 工作流程,可以幫助我們提高協作效率,減少混亂和沖突。比如規定好分支結構和命名規范,將使得代碼庫的分支結構更加清晰明了,更易于管理。反之,開發者可能會按照自己的喜好隨意創建分支,導致代碼庫分支結構混亂。

  • 除此之外還有很多好處,降低錯誤風險、增加代碼可追溯性、簡化發布流程、促進持續集成與持續交付等等。

  • 參考資料:https://blog.csdn.net/u010800804/article/details/109594867

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java架構師之路五、微服務:微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。

目錄 微服務架構&#xff1a; 服務注冊與發現&#xff1a; 服務治理&#xff1a; 服務監控&#xff1a; 容器化&#xff1a; 上篇&#xff1a;Java架構師之路四、分布式系統&#xff1a;分布式架構、分布式數據存儲、分布式事務、分布式鎖、分布式緩存、分布式消息中間件、…

C語言系列15——C語言的安全性與防御性編程

目錄 寫在開頭1 緩沖區溢出&#xff1a;如何防范與處理1.1 緩沖區溢出的原因1.2 預防與處理策略 2. 安全的字符串處理函數與使用技巧2.1 strncpy函數2.2 snprintf函數2.3 strlcpy函數2.4 使用技巧 3 防御性編程的基本原則與實際方法3.1 基本原則3.2 實際方法 寫在最后 寫在開頭…

思騰合力攜京東打造服務器采購解決方案,助企業高校提升算力

隨著云計算、大數據、人工智能的快速發展&#xff0c;服務器需求不斷擴大&#xff0c;市場規模持續保持增長。IDC數據顯示&#xff0c;預計2023年我國服務器市場規模將增至308億美元。基于對服務器市場的趨勢洞察&#xff0c;思騰合力攜手京東品牌持續深化合作&#xff0c;在保…

深入淺出JVM(六)之前端編譯過程與語法糖原理

本篇文章將圍繞Java中的編譯器&#xff0c;深入淺出的解析前端編譯的流程、泛型、條件編譯、增強for循環、可變長參數、lambda表達式等語法糖原理 編譯器與執行引擎 編譯器 Java中的編譯器不止一種&#xff0c;Java編譯器可以分為&#xff1a;前端編譯器、即時編譯器和提前編…

(提供數據集下載)基于大語言模型LangChain與ChatGLM3-6B本地知識庫調優:數據集優化、參數調整、Prompt提示詞優化實戰

文章目錄 &#xff08;提供數據集下載&#xff09;基于大語言模型LangChain與ChatGLM3-6B本地知識庫調優&#xff1a;數據集優化、參數調整、提示詞Prompt優化本地知識庫目標操作步驟問答測試的預設問題原始數據情況數據集優化&#xff1a;預處理&#xff0c;先后準備了三份數據…

mac下C、C++項目出現‘stdio.h’ file not found的解決方法

【轉載】https://www.cnblogs.com/yongfengnice/p/14260997.html 有時候更新mac系統或者項目配置之后&#xff0c;打開之前的項目&#xff0c;發現出現莫名其妙的‘stdio.h’ file not found等頭文件找不到。 解決這個問題之前&#xff0c;我們要弄清楚開發工具是引用了系統哪…

C++:STL簡介

1. 什么是STL STL(standard template libaray- 標準模板庫 ) &#xff1a; 是 C 標準庫的重要組成部分 &#xff0c;不僅是一個可復用的組件庫&#xff0c;而且 是一個包羅數據結構與算法的軟件框架 。 2. STL的版本 3. STL的六大組件 4.STL的缺陷 1. STL庫的更新太慢了。這…

用于將Grafana默認數據庫sqlite3遷移到MySQL數據庫

以下是一個方案&#xff0c;用于將Grafana數據遷移到MySQL數據庫。 背景: grafana 默認采用的是sqlite3&#xff0c;當我們要以集群形式部署的時使用mysql較為方便&#xff0c;試了很多sqlite轉mysql的方法要么收費,最后放棄。選擇自己動手風衣足食。 目標: 遷移sqlite3切換…

速評谷歌開源大模型Gemma 7B

大家好,我是herosunly。985院校碩士畢業,現擔任算法研究員一職,熱衷于機器學習算法研究與應用。曾獲得阿里云天池比賽第一名,CCF比賽第二名,科大訊飛比賽第三名。擁有多項發明專利。對機器學習和深度學習擁有自己獨到的見解。曾經輔導過若干個非計算機專業的學生進入到算法…

day16_ListSet課后練習題 - 參考答案

文章目錄 day16_課后練習題第1題第2題第3題第4題第5題第6題第7題第8題 day16_課后練習題 第1題 案例&#xff1a; ? 1、用一個String[]數組存點數 ? 2、用一個String[]數組存花色 ? 3、用一個String[]數組存大王、小王 ? 4、用上面的數組&#xff0c;生成一副撲克牌 …

C++ 文件操作-文本文件-讀取和打開文件方法詳解

讀文件步驟 #include <iostream> using namespace std; #include <fstream> #include <string> //文本文件 讀文件void test(){// 1 包含頭文件// 2 創建流對象ifstream ifs;// 3 打開文件 并且判斷是否打開成功ifs.open("table.txt",ios::in); //…

VS 2015 發布 WebService

本文介紹了使用VS2015發布WebService的步驟 右鍵項目點擊發布 選擇文件系統和目標位置 配置選擇Debug-Any CPU&#xff08;選其他也可以&#xff09; 4. 點擊發布&#xff0c;在對應文件夾中可以看到發布出來的內容。 記錄遇到的問題&#xff0c; 發布前要選擇刪除所有現有文…

【PostgreSQL】PostgreSQL詳細介紹

PostgreSQL詳細介紹 一、什么是PostgreSQL&#xff1f;二、為什么要使用PostgreSQL&#xff1f;三、PostgreSQL功能列表3.1 數據類型3.2 數據完整性3.3 并發&#xff0c;性能3.4 可靠性、災難恢復3.5 安全3.6 可擴展性3.7 國際化&#xff0c;文本搜索 四、參考資料 關于Postgre…

使用MongoDB數據庫和Mongoose庫在Node.js中進行數據存儲

在Node.js中使用MongoDB數據庫和Mongoose庫進行數據存儲是前端開發中常用的技術之一。MongoDB是一種非關系型數據庫&#xff0c;具有高性能、易擴展等優點&#xff1b;而Mongoose是在Node.js中對MongoDB進行操作的框架&#xff0c;簡化了數據庫操作&#xff0c;并提供了豐富的功…

音視頻技術-雙聲道立體聲與卡儂平衡線的“糾葛”

目錄 一、新問題 二、問題排查 三、故障總結 四、原理分析 五、解決方案 1、救急 2、轉接線1 3、轉接線2

Js的 Promise的 then catch 筆記240222

Js的 Promise的 then catch 筆記240222 基本用法 new Promise(f>{setTimeout(ev>{f("一秒后輸出控制臺");},1000); }).then(f的參數>{console.log(f的參數); }); // 控制臺輸出: 一秒后輸出控制臺上面代碼中, f 的標準名叫做 resolve , 所以應該寫成 new …

知識圖譜數據處理流程是什么

在當今信息時代&#xff0c;數據已經成為企業決策和業務發展的重要驅動力。然而&#xff0c;隨著數據量的不斷增加&#xff0c;傳統的數據處理方法已經難以滿足需求。知識圖譜作為一種新興的技術&#xff0c;正逐漸成為處理大規模數據的關鍵工具。本文將深入探討知識圖譜的數據…

寫代碼中的一些“小技巧”

目錄 前言 1.不注重代碼格式 1.1 空格 1.2 換行 2.隨意的命名 2.1 有意義的參數名 2.2 見名知意 2.3 參數名風格一致 3.出現大量重復代碼 4.從不寫注釋 5.方法過長 6.參數過多 7.代碼層級太深 8.判斷條件太多 9.硬編碼 10.事務過大 11.在循環中遠程調用 11.1 …

CSS 面試題匯總

CSS 面試題匯總 1. 介紹下 BFC 及其應 參考答案&#xff1a; 參考答案&#xff1a; 所謂 BFC&#xff0c;指的是一個獨立的布局環境&#xff0c;BFC 內部的元素布局與外部互不影響。 觸發 BFC 的方式有很多&#xff0c;常見的有&#xff1a; 設置浮動overflow 設置為 auto、scr…

Swift基礎知識:20.Swift方法

在 Swift 中&#xff0c;方法是與特定類型相關聯的函數。方法可以用于實例類型&#xff08;實例方法&#xff09;或類型本身&#xff08;類型方法&#xff09;。方法允許類型的實例執行特定的任務&#xff0c;也可以修改實例本身或實例的屬性。 實例方法&#xff08;Instance …