
### Git
1. **分散式版本控制系統**
2. **Git** != **Github**
---
### Install
> 善用Homebrew 進行Mac && Linux 安裝(可以集合式管理套件版本)
> https://brew.sh
1. Mac
```
~ $ brew install git
```
2. Linux
```
$ brew install git
```
---
### SSH 建立
1. 取得ssh key
```
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
> id_rsa.pub:公開金鑰 (可以讓大家都知道)
> id_rsa:私密金鑰 (無論如何不能洩漏)
```
eval "$(ssh-agent -s)"
```
```
ssh-add ~/.ssh/id_rsa
```
```
cat ~/.ssh/id_rsa.pub
```
3. 將publish key -> Github
> 1. https://github.com/settings/keys
> 2. New SSH key
```
ssh -T git@github.com
```
---
### Git config
```
$ git config --global user.name "使用者名稱"
$ git config --global user.email "使用者電子郵件"
```
---
### 指令介紹
1. 初始化當前目錄
```
$ git init
```
> 在當前位置新增 .git 隱藏資料夾,也就是建立 Git Repository(檔案庫)。目的是初始化這個目錄,讓 Git 對這個目錄做版本控管。
2. 檢查當前版本狀態
```
$ git status
```
> 未進入版本控管(Untracked)、新增檔案(New File)、刪除檔案(Deleted)、檔案已修改(Modified)等。是會經常使用的指令。
3. 加入版本控制
```
$ git add
```
> 可以單獨加入git add XXX 或者 git add . 直接全部加入
4. 新建版本控制
```
$ git commit
```
> 可以直接使用git commit -m "新建內容" 用來建立新的版本
5. 查看版本紀錄
```
$ git log
```
> 從新到舊列出,內容分別是版本號碼、提交者、提交時間。
6. 切換分支
```
$ git checkout
```
> 這邊是切換現有的版本 git checkout "分支" or git checkout -b "建立新分之並且切換" b == branch,請習慣性建立Dev
7. 建立並跳到該分支
```
$ git branch -D
```
> 偷懶的話基本上用commit -b 就可以達到了
8. 修改分支名稱
```
$ git branch -m XXX SSS
```
> 基本上很少用到
9. 回到過去版本
```
$ git reset --hard
```
> 1. git reset --hard HEAD #上一個
> 2. git reset --hard HEAD^ #上上個
> 3. git reset --hard HEAD~2 #上上個
> 4. git reset --hard "id number" #回到指定id 的版本
10. 本地端同步遠端分支
```
$ git pull
```
> 這個作法基本上是很重要的,在每一次修改程式碼要習慣性pull,讓本地端跟遠端分支的內容一樣
11. 建立遠端連線
```
$ git remote add upstream github儲存庫位置
```
> 這個部分是為了讓clone 下來的專案能夠與遠端上建立連線
> 若要刪除remote -v 的origin
```
git remote remove XXX
```
12. 上傳本地端至遠端
```
git push
```
> git push -u origin 分支名稱 也可以這麼做確認指定分支
13. 刪除本地分支
```
$ git branch -d branch名稱
```
刪除遠端分支
```
git push origin -d branch名稱
```
> d == delete
* 補充:
> 1. fork == 拷貝一份到自己的除存庫
> 2. clone == 從遠端下載到本地端
### GIT flow
>通常gitflow有以下幾個:master, devlope, release,hotfix,feature
* master: 用來擺放穩定上線的版本
* develope: 用來開發用的
* release: 用來做最後上線前的測試版本, 沒問題後會一併合到master以及develope
* hotfix: 用來處理緊急錯誤 結束後會合併到develope
* feature: 用來開心功能, 測試完會合併到develope
* how to use?
```
brew install git-flow-avh
```
通常開啟功能 再來切換到develop merge進去 再來就是release 再來就是push
初始化git流程
```
git flow init
```
開啟git-flow 一致化
```
git flow XXX[flow-name] start XXX
```
```
git flow XXX[flow-name] start XXX
```
這邊舉例開發一個新功能到部署到main的過程
```
git flow feature start feature-name
```
>這個命令會自動從 develop 分支創建一個新的 feature/feature-name 分支,並且切換到這個分支。
```
git add .
```
```
git commit -m ""
```
```
git push -u origin feature-name
```
> 目的是讓別人能夠看到, 若有嚴格PR需求, 可以這樣使用
```
git flow feature finish feature-name
```
>1. 切換到 develop 分支。
>2. 將 feature/feature-name 分支合併到 develop。
>3. 刪除 feature/feature-name 分支。
```
git push origin develop
```
>如果團隊其他人需要這些修改,你可以將合併後的 develop 分支推送到遠端
```
```bash=
git flow feature start feature-name
git add .
git commit -m "feat: 加入 xxx 功能"
git push -u origin feature/feature-name
去到github PR-->develop
git checkout develop
git pull origin develop
git branch -d feature/feature-name
git push origin --delete feature/feature-name
```
---
```
git flow release start version-number
```
>version-number 是準備發佈的版本號,例如 1.0.0。這個命令會自動從 develop 分支創建一個 release/version-number 分支。
```
git add .
```
```
git commit -m ""
```
```
git flow release finish version-number
```
>1. 將 release/version-number 分支合併到 main 分支。
>2. 在 main 分支上打上一個 v1.0.0 的標籤。
>3. 將 release/version-number 分支合併回 develop,以確保修正同步到開發分支。
>4. 刪除 release/version-number 分支。
```
git push origin main
git push origin develop
git push --tags
```
>將 main 和 develop 分支推送到遠端以便於發佈
---
:accept: 有效建立協作能力
:accept: 增加團隊開發效率
:ghost: 下一章--> **Docker? 容器化技術**
©Copyright © 2023 by CHUNG HONG HAO. All Rights Reserved.