# Git Workflow This document provides a guide to Git workflow, including branch naming, commit messages, and common commands. ###### tags: `Git` `Technology` > **Date**:2023/06/01 > **Taker**:Sin > **Version**: 0.0.3 ## Branches ### Naming > 五種分支: `master(main)`, `develop(dev)`, `hotfix`, `release(test)`, and `feature`. ### Usage 1. **master(main)**: Product Version 2. **develop(dev)**: 開發 3. **hotfix**: 從 `master(main)` 切出來的分支,緊急修復完後,合併到 `master(main)` 和 `develop(dev)`。 4. **release(test)**: 發布前的測試版 5. **feature**: 開發功能的分支 6. 補充: 參照Github flow - 常用 feature/* , feature-* 的形式命名 - 常用 hotfix-* , hotfix/* 的形式命名,在 test 建議不要建立hotfix直接 進版/重壓版 ## Commit Messages ### Prefixes 1. **Feat**:新增或修改功能(feature) 2. **Fix**:修補 bug(bug fix) 3. **Docs**:文件(documentation) 4. **Style**:格式,不影響程式碼運行的變動,例如:white-space, formatting, missing semi colons 5. **Refactor**:重構,不是新增功能,也非修補 bug 的程式碼變動 6. **Perf**:改善效能(improves performance) 7. **Test**:增加測試(when adding missing tests) 8. **Chore**:maintain,不影響程式碼運行,建構程序或輔助工具的變動,例如修改 config、Grunt Task 任務管理工具 ### What should the Commit content be? 一個好的 Git Commit Message 必須兼具 What & Why & How,能幫助開發者瞭解這個提交版本: 1. 做了什麼事情(What) 2. 為什麼要做這件事情(Why) 3. 用什麼方法做到的(How) ### Commit with Release #### Test: `develop(dev) -> release(test)` ``` Feat: Version upgrade from x.x.x to x.x.x 1. Something feature ``` #### Release: `release(test) -> master(main)` ``` Merge: Version upgrade from release(test) into master(main) for version x.x.x to x.x.x 1. Something feature ``` ### Commit with Work Order #### Single line completion ``` Feat: Modified something feature by monday xxxxxxxxxx Feat: Modified something feature by mantis xxxxxx ``` #### Multi-line completion ``` Feat: Modified something feature Monday ID: xxxxxxxxxx Feat: Modified something feature Mantis ID: xxxxxx ``` ## Settings ### Disable Case Ignorance ```bash # For a single project git config --local core.ignorecase false # For global settings git config --global core.ignorecase false ``` ## Common Commands ### Merge Branch and Create New Commit ```bash git merge --no-ff branch ``` ### Delete Branch ```bash git branch -d dev ``` ### Set Tag (Only for Master) ```bash git tag -a x.x.xx ``` ### Push Tag to Remote ```bash git push origin --tags ``` ### Hard Reset to Previous Commit ```bash git reset --hard HEAD~1 ``` ### Git Pull with Rebase ```bash git pull --rebase ``` ### Modify Git Remote ```bash git remote set-url remote-name url ``` ## Repository Naming #### Example: `lowercase-with-hyphens ` 1. Use lower case. 2. Use dashes. 3. Be specific. 4. "_" is harder to type than "-". 5. Avoid using camel case because camel case usually have different word interpretations, for example, checkinService vs. checkInService. ### Readme and ChangeLog Naming Use `README.md` and `CHANGELOG.md`. ## Project File ### Adding a New Line to the End of a File Some C compilers cannot parse the last line if it does not end with a newline. The C standard specifies that a C file should end with a newline. A file that does not end with a newline is not considered a text file. ## References 1. [Git Commit Message Guide](https://hackmd.io/@Heidi-Liu/git-commit-message) 2. [Naming Convention for Git Branches and Commits](https://dev.to/varbsan/a-simplified-convention-for-naming-branches-and-commits-in-git-il4) 3. [Git Branching Name Convention](https://dev.to/couchcamote/git-branching-name-convention-cch) 4. [Naming Convention for Git Repositories](https://stackoverflow.com/questions/11947587/is-there-a-naming-convention-for-git-repositories) 5. [Git Branching Model](https://git-tutorial.readthedocs.io/zh/latest/branchingmodel.html) 6. [Why Add a New Line at the End of a File](https://unix.stackexchange.com/questions/18743/whats-the-point-in-adding-a-new-line-to-the-end-of-a-file)