目的:1.統一團隊的Git工作流 2.統一團隊Git Commit日志標準,可通過日志快速了解改動模塊
作者:高斌
## 一、Git工作流
* * *
### 1.Git分支創建規范:
`dev`為日常開發分支
`preview`為測試版分支
`master`為主分支,禁止直接在此分支進行代碼修改和提交
`feature`新功能開發分支,完成后合并到dev分支進行測試
`fix`線上緊急漏洞修復分支,從master分支拉取創建,修復完bug后合并到dev和master分支(需在dev完成測試后才能合并master分支)
`feature`和`fix`分支可在使用后刪除,具體視個人情況而定
### 2.分支使用規范
日常開發在dev分支上進行
有測試環境時,上線前需要先將代碼合并到preview分支上進行提測,測試無誤后將preview分支合并到master分支進行正式版提交
理論上master分支不能做任何改動,只能合并其他分支。
禁止在master分支上直接修改文件進行提交,很容易與其他分支及團隊成員產生沖突,破壞分支之間的關聯關系
## 二、Git提交規范
每次提交必須按照規范,寫明本次提交的類型(方便快速了解本次改動內容),并對修改內容做出明確描述
* 提交格式
* 提交類型:1.提交描述 ?2.提交描述2
* 提交類型
* `fix`:問題的修復
* `feat`:有新功能的增加
* `update`:現有功能模塊的代碼改動
* `improve`:優化某個模塊
* `debug`:提交某個功能模塊的調試代碼
* `refactor`:重構某個模塊
~~~
示例:
(單種修改類型) feat: 1.新增xxx功能 2.新增yyy功能
(多種修改類型) feat + update: 1.新增xxx功能 2.更改xx模塊樣式
~~~
示例:
簡明扼要闡述本次改動,達到看提交記錄就能明確了解本次改動的程度。

## 三、Git Stash貯藏功能
* * *
使用場景:線上有緊急bug要修復,必須切到master分支上創建fix分支進行修復。但是你目前在dev分支功能開發了一半,又不想將開發一半的代碼提交,那么就可以用Git stash 命令把你目前未提交的代碼先貯藏起來,等修好bug,從master分支上切回dev分支之后,再把改動從貯藏中恢復到dev分支,然后繼續開發。
官方文檔:→[鏈接](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E8%B4%AE%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86)
~~~
git stash save "當前存儲的變動描述" : 執行存儲時,添加備注 (執行存儲后,會把改動文件從當前分支中還原)
git stash list : 查看stash列表
git stash apply : 應用某個存儲,但不會把存儲從存儲列表中刪除,默認使用第一個存儲,即stash@{0},如果要使用其他個,git stash apply stash@{$num} , 比如第二個:git stash apply stash@{1}
git stash pop : 恢復之前緩存的stash,將緩存堆棧中的對應stash刪除,并將對應修改應用到當前的工作目錄下,默認為第一個stash,即stash@{0},如果要應用并刪除其他stash,命令:git stash pop stash@{$num} ,比如應用并刪除第二個:git stash pop stash@{1}
git stash drop stash@{$num} : 丟棄stash@{$num}存儲,從列表中刪除這個存儲
git stash clear : 刪除所有緩存的stash
~~~
**Sourtree快捷使用:**
1.點擊頂部貯藏按鈕,在彈出框中輸入此次貯藏內容概要
2.左側會已貯藏列表可以進行貯藏應用或刪除貯藏代碼

## 四、Git Tag標簽功能
* * *
基本所有成體系的項目都會在項目發版時進行標簽標記
例如下圖:

* 分支代表的是一條時間軸,匯聚了一系列的提交歷史操作,并可進行回溯,而標簽標記的是一個時間點,標識了一個特定時刻,類似版本庫的一個快照。
* 通過獲取某個標簽的版本,就可以把當時的歷史版本取出來
官方文檔:→[鏈接](https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE)
**Sourtree快捷使用:**
1.在對應的commit上右鍵點擊標簽選項,然后輸入標簽的名稱
2.在左側列表將剛創建的標簽推送到遠程倉庫

## 五、查看commit合并時間
* * *
在 Git 配置文件 `~/.Gitconfig` 中追加以下別名:
~~~
[alias]
find-merge = "!sh -c 'commit=$0 && branch=${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 -s | uniq -f1 -d | sort -n | tail -1 | cut -f2'"
show-merge = "!sh -c 'merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge'"
~~~
之后就可以下面這樣使用了:
~~~
# 當前分支
git find-merge <SHA-1>
# 指定分支
git find-merge <SHA-1> master
~~~
示例:
~~~
on master ? git find-merge 0c205019ac75f1fc09a7fdd6079461328abc3137 23:02:37
6cbd92e271de540e98f4157132ba47973e3cb07b(通過這次提交合并進入)
on master ? git show-merge 0c205019ac75f1fc09a7fdd6079461328abc3137 23:06:06
commit 6cbd92e271de540e98f4157132ba47973e3cb07b
Merge: 9ab0014 e22126f
Author: 亮 <liang.huang>
Date: Fri Apr 28 21:04:33 2017 +0800
Merge branch '20170413-v4.5.0-share' into '20170428-v5.1.0'
分享頁面、首頁彈屏、banner修改、push和消息頁面跳轉
See merge request !125
~~~
## 六、Git常用操作
* * *
### 1.將本地項目添加到遠程倉庫
~~~
在本地項目中執行以下命令
git init (初始化git項目,已經初始化過的無需執行)
git remote add origin 遠程倉庫地址
git add . (添加項目所有文件)
git commit -m '項目初始化'
git pull origin master
(pull如果報錯可嘗試此命令解決 git pull origin master --allow-unrelated-histories)
git push origin master
~~~
### 2.版本回滾
~~~
1.回退到當前版本(放棄所有修改)
git reset --hard
2.撤銷某個文件的修改
git checkout demo.js
3.回退到某一版本但保存自該版本起的修改
git reset 版本號
4.回退到和遠程版本一樣
有時候,當發生錯誤修改需要放棄全部修改時,可以以遠程分支作為回退點退回到與遠程分支一樣的位置,執行的命令如下
git reset --hard origin/master // origin代表你遠程倉庫的名字,master代表分支名
5.回退遠程倉庫的版本
先在本地切換到遠程倉庫要回退的分支對應的本地分支,然后本地回退至你需要的版本,然后執行:
git push <倉庫名> <分支名> -f
6.本地強制與遠程倉庫同步
git reset --hard origin/分支名
~~~
### 3.解決代碼沖突
合并代碼后,因多人修改同一模塊,可能會產生代碼沖突,此時需要手動解決。
~~~
示例:以下是沖突代碼提示
<<<<<< HEAD
const demo = 111;
======
const demo = 222;
>>>>>> 865sdf7612b3u23h4234
說明:
<<<<<< HEAD
此區間的代碼指,當前分支下你所改動的代碼
======
此區間代表你合并代碼后,他人改動的代碼
>>>>>> 865sdf7612b3u23h4234
需要對比兩個區間的代碼,根據實際情況修改代碼,修改完成后,刪除所有沖突標記。
然后執行以下操作:
git add .
git commit -m "fix:解決代碼沖突"
git push origin 分支名`
~~~
### 4.查看合并操作記錄
你可以使用以下命令來查看Git分支的合并操作記錄:
~~~
git reflog show <branch-name>
~~~
這將顯示指定分支的所有合并操作記錄,包括合并后的提交和回滾操作。如果省略`<branch-name>`參數,則將顯示當前分支的所有合并操作記錄m 增加`--oneline`可查看簡易信息.
### 5.查看分支merge記錄
你可以使用以下命令來查看Git分支的合并記錄:
~~~
git log --merges <branch-name>
~~~
這將顯示指定分支的所有合并記錄,包括其它分支合并到該分支的記錄。如果省略`<branch-name>`參數,則將顯示當前分支的所有合并記錄。
### 6.切換倉庫遠程地址
~~~
# 查看當前遠程代碼庫信息
git remote show origin
# 可將現有代碼庫切換到其他遠程倉庫
git remote set-url origin 新倉庫地址
~~~