【Git】程式碼許可權&分支管理

2023-03-06 18:02:10

以Gitlab程式碼託管平臺說明,也是目前應用最為廣泛的企業搭建私服的選擇。

1.  許可權管理

[專案] 存取許可權有3種::Private、Internal、Public
    Private:只有組成員才能看到
    Internal:只要登入的使用者就能看到
    Public:所有人都能看到

[專案成員] 有五種許可權及其適用物件:Guest、Reporter、Developer、Maintainer、Owner
    Guest:可以建立issue、發表評論,不能讀寫專案 【遊客】
    Reporter:可以克隆程式碼,不能提交 【QA,PM】
    Developer:開發者可以克隆程式碼,開發,提交,push 【RD】
    Maintainer:管理員可以建立專案,新增tag,保護分支,新增專案成員 【RD組長】
    Owner:最高許可權,管理組成員,刪除專案,遷移專案 【研發負責人】


2.  分支管理

   2.1 基礎概念:

版本衝突:合併分支時,當Git發現同一個檔案中的同一塊資料在兩邊的提交歷史中都有變更,它將無法自動對其進行合併,產生衝突,需要人為介入修改,再合併。

# On branch master
一條合併命令:git merge featureA
兩種合併方式:當執行merge命令時,git合併演演算法會根據當前分支(master)的最後一次commit與「特性分支」(featureA)的最後一次commit的情況,來決定合併方式是 「快進式合併」 還是 「遞迴三路合併」。

快進式合併:程式碼分支情況如下,預設合併方式為快進式合併,只是將master分支的HEAD指標右移,不會建立新的merge記錄。

        

      缺點:若版本直接回滾,只會回退到featureA的上一次commit節點,原master分支上可能仍遺留featureA的程式碼,回退不乾淨。

遞迴三路合併:程式碼分支情況如下,合併方式為三路合併,此時merge演演算法會遞迴向前找到兩個分支的共同「祖先」節點,判斷各自檔案修改點作為合併內容,若無程式碼衝突均會自動合併完成, 產生新的merge記錄。

        

 

[所以推薦] 使用引數 「--no -ff」
git merge featureA --no -ff  #禁止快進式合併稱為普通合併,各種請款下總會建立一個merge記錄,方便追溯
               若版本直接回退,直接回退到原始master指標節點。

 

     2.2 研發分支過程管理

    • 主幹分支為master,dev-test為開發分支,test為測試分支,pre為預發分支, release為上線分支

    • 每個一個需求為一個特性分支,命名為feature-XXX

    • 特性分支開發過程中外部聯調需要時合併至dev-test

    • 特性分支開發完成後合併至test,提交測試

    • 測試完成後合併至pre,進行預發測試

    • 預發測試完成後合併至上線分支release-{date}, release-{date}由最新master派生

    • 如果在測試期間出現BUG需要在feature分支修復,併合並至整合分支(dev-test, test, pre).

      • dev-test期間合併dev-test

      • test期間合併至dev-test, test

      • pre期間合併至dev-test, test, pre

      • release期間合併至dev-test, test, pre, release

    • 線上出現Bug需要修復時等同一個需求走feature分支開發流程

  2.3 常見分支問題

    • 團隊中新人可能是對Git不熟悉也可能是合併到整合分支 dev-test, test時衝突比較多想把dev-test,test程式碼合併到本地來解決,從而把別人開發功能的程式碼合併到自己的分支,上線時就把別人分支(不是本次上線的功能)上到正式環境了,導致線上事故。

      git checkout feature-xxx
      git merge test
    • 在開發過程中Bug修復時一般需要在自己的特性分支修改程式碼,修改完成後再依次合併到dev-test, test, pre讓測試驗證是否修復完成,但有時圖方便或是時間問題就直接合併到pre讓測試驗證, 這樣測試環境上就帶有bug。然後就有一種常見的情況,在測試環境迴歸功能又發現了此Bug,開發就納悶修復過了為何還有,其實就程式碼沒有合併。

      git checkout feature-xxx
      # fix bug ..
      git checkout pre && git pull
      git merge feature-xxx
      # 沒有合併至dev-test, test