---
# System prepended metadata

title: git work flow
tags: [git]

---

# git work flow

## 分支定義

- 請先閱讀 [[branch_usage]]
- 分支策略
  - master(主要分支)
  - uat(測試、驗收分支)
  - release(正式發佈分支)
  - feature branch
  - hotfix

1. master、uat、release為長期維護分支，每個版本為獨立。
2. hotfix只在release進行作業，除非必要性再使用cherry pick回master。
3. 開發人員分配至工作時，按照討論的分支名稱建立feature branch，完成後push 至remote branch，通知審查，驗證無誤後併回master。
    1.開發人員新增branch=>完成修改。
    2.開發人員push remote，並通知審核人員。
    3.審核人員pull remote，進行審查。
    4.完成審查後，merge commit to master。
    5.移除遠端開發分支。
4. 每星期固定將master併入uat發佈至測試叢集進行驗收，uat驗收完成後併入release並發佈至正式環境。

## 進行push repo

`請先進行pull，確認分支已是最新版再push`

## 工作流程

1. 每週會議討論欲進行工作項目並定義工作類型、分支名稱，每次僅變更一個項目並新增分支。
   - 簽入訊息格式說明-[[message_format]]

```bash
# @type
# ci、docs、feat、fix、perf、refactor、style、test
# @branch name
# 分支名稱，簡單描述工作項目，過長則使用縮寫

git branch issue/{@type}/{@branch name}
```

---

2-1. 開發人員本地功能開發歷程簽入
    - 按照進行事項分類加入tracking
    - 按照分類使用快捷指令
    - 填寫訊息簽入

```bash
# 確認目前分支位置
git branch
# 移動至正確分支，若上述確認無誤則跳過此步驟
git checkout {@local branch name}
# 加入追踨路徑下所有檔案或單個檔案
# @path 例如 . 為本路徑下所有檔案，或@file ./docs/training/git_work_flow.md 單個檔案
git add {@path or @file}
# 確認檔案狀態
git status
# 使用指令簽入訊息
# @type 按照message format分類
git add{@type}
```

2-2. 功能完成後，推送至git server，並通知審查人員分支名稱。

````bash
# @branch name
# 遠端分支名稱，預設local branch name相同
git push --up-stream {@branch name}

````
---

3. 測試環境部署
    - 單元測試
    - 功能測試
    - 探索測試

```bash
# 目前僅提供一覽表.net6版本可使用deploy-ulist.sh
# 預設環境為debug
# 詳細參數說明 deploy-ulist.sh -h
./deploy/docker/deploy-ulist.sh --image-build --run
## 清除容器
./deploy/docker/deploy-ulist.sh --down
```

---

4. 發現錯誤、問題通知開發人員修正，完成後push更新後再次進行上述流程。
    - 將本支名稱複製至skype貼上，並通知審查人員進行工作。

---

5. 通過審查後， 開發人員移至主要分支，並同步至最新，準備進行合併。

```bash
 git checkout master
 git pull
```

---

6. 合併分支使用merge --squash,保持主要分支整潔，該功能會將工作項目分支的所有commit進行整併並壓縮成一個commit簽入，開發人員請將本次工作項目歷程重要訊息按照[[message_format]]整理再簽入。

```bash
# 確認目前分支為master
git branch
# 與工作項目分支進行合併
# branch name為第一個步驟中討論的工作分支名稱
git merge --squash {@branch name}
# 若有衝突，請解決版本差異，無衝突則進行commit
# 確認本次異動檔案已加入tracking, 若無請使用git add加入
git status
# 使用預設快捷指令進行簽入
# # @type 按照工作類型使用相對應的指令
# ci、docs、feat、fix、perf、refactor、style、test
git add{@type}
```

---

7. 合併完成後，推送至remote repo，確認工作項目結束
    - 移除遠端工作分支
    - 移除本地工作分支
```bash
# 推送至git server
git push
# 移除遠端工作分支
# @remote branch name
# 遠端分支名稱，預設local branch name相同
git push origin --delete {@remote branch name}
#  移除本地端工作分支
# @local branch name
# 本地分支名稱，為第一個步驟商議的工作分支名稱
git branch -D {@local branch name}

```

---

8. 恭喜，完成本次工作項目，通知維運部署人員進行發佈後請接續下一個工作或是休息片刻。



[//begin]: # "Autogenerated link references for markdown compatibility"
[branch_usage]: branch_usage.md "分支的應用"
[message_format]: ../ci/message_format.md "簽入訊息格式"
[//end]: # "Autogenerated link references"