Git 教學 2019/07/06
===
## Git 介紹
---
## Resource
* [練習REPO](https://gitlab.com/freefolk/git-practice)
---
## demo
```shell=zsh
cd ~/.ssh && vim id_rsa.pub
```
---
#### 版本控制
* 當我存好一個 "置入 hero_image 的版本" 推上去且合併後,我會有一筆此版本的...
- 本地端紀錄 (hero_image)
- 雲端備份紀錄 (origin/hero_image)
- 大家共同擁有的廣納百 川紀;///;'錄大家共同擁有的廣納百川紀錄的雲端備份紀錄 (master)
- (origin/master)
* 本地端 & 遠端?
- 想像成兩條平行線
- 而且是像鏡子般的存在
#### 分散式系統
* 可以讓協作者各自擁有不同的版本
* 等到要合併時 `merge` 進共用的 `大版本` 裡
* 情境
* 當 A, B, C 都要編輯同一份文件時
* A 加在第 5-7 行
* B 修改第 6-10 行
* B 刪除第 7 行
* A: 阿乾.. 我剛剛做的東西咧?
---
#### 擬人化
* 有點像 貼紙 or 旅行者 的概念
* 自己所在的版本可以想像是一個旅行者
* 而長出來的分支即為旅行者的 "足跡"
* 旅遊路徑的概念
---
## 環境建置
* [Git](https://git-scm.com/download/win)
* [SourceTree](https://www.sourcetreeapp.com/)
---
## 名詞介紹
* branch
- `git branch`: 看目前有哪些分支
- `git checkout branch remote_toby`: 切到 `remote_toby` 這個分支上
-
* clone
- `git clone`: 把人家的東西抓下來
* pull
- `git pull`: 把遠端的拉下來後合併
- `git pull = git fetch + git merge`
* add
- `git add`: 快照起來 (狀態改變成 staging)
* commit
- `git commit`: 真正存起來,有一筆紀錄
* reset
- `git reset --hard HEAD~n`: 請旅行者往回退 n 步 (時光倒流)
- 如果沒有另一個旅行者幫你記錄現在的版本 (中間的路途會不見,要小心!)
- --hard: 退至 tracked 狀態
---
## 舉個栗子

---
## 初始化專案
```shell=zsh
git init
git remote add origin git@gitlab.com:freefolk/git-practice.git
git add .
git commit -m "Initial commit"
git push -u origin master
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
#
# -u: upstream 指定以後推到誰那邊
```
---
## SSH key 狀況如果遇到
- 打開GitLab專案 > profile > setting > 左欄ssh key
- [連到這邊的指令](##demo)
- [SSH wiki解釋](https://www.wikiwand.com/zh-tw/Secure_Shell)
---
## 資料狀態改變
untracked
|
| `從git ignore 拿開`
↓
tracked
|
| `git add `
↓
staging
|
| `git commit`
↓
commit

---
## 常見使用情境
> 當在 `remote_toby` 做東西做到一半時...
1. 快照起來(此時資料會變成綠色的)
- `git add <檔案>`
- `git add .`
- 全部都加
2. 存檔
- `git commit -m 'feat(package): add some packages to the list'`
- -m: 簡短的描述
- 存完檔確認一下
3. 切到 master 進行 merge
- `git checkout master`
- `git merge remote_xxx`
3. 先更新本地端版本 (同步遠端的版本下來)
- `git pull --rebase`
- --rebase: 把足跡合併起來
- 如果是 `旅行者 A` rebase `旅行者 B`,則 A 會合併 B 的路進走在最前面
4. 可能狀況
- conflict
- 手動排除並再 add 跟 commit 起來
- 順利
- `git push origin <遠端分支>`
5. 合回去 master 主幹道並上傳
- `git checkout master`
- `git pull --rebase`
- `git merge remote_toby`
- `git push`

---
## 額外延伸
* 發 PR (pull request)
- 我想要對社群有所貢獻
- 即我開了一個 branch 再做一些優化
- 拜託把我合進去
---
## 參考連結
* [環境建置 fot WIN](https://progressbar.tw/posts/1)
* [Git Rebase](https://gitbook.tw/chapters/branch/merge-with-rebase.html)
* [為什麼我的分支都沒有「小耳朵」](https://gitbook.tw/chapters/branch/merge-commit.html)
{"metaMigratedAt":"2023-06-14T22:40:53.558Z","metaMigratedFrom":"Content","title":"Git 教學 2019/07/06","breaks":true,"contributors":"[{\"id\":\"a13b7b1d-ac79-4ec7-94d9-bff8e975a6a8\",\"add\":3524,\"del\":736},{\"id\":\"f3728d6c-1a3a-4c71-8cd8-eafda6741402\",\"add\":152,\"del\":3},{\"id\":\"d8369d99-f7af-408a-af1e-f82005245fa6\",\"add\":93,\"del\":0}]"}