# SCM - Git
---
# 這是蝦米碗糕?

----
## 版本控制系統
- 最初用來管理Linux kernel
- 現在則被大家用來作為各系統或專案間的版本控制選擇
- 正當化抄作業的最佳理由(O
---
# 講版本控制這回事

----
## 你怎麼做得?

----
## 安ㄋㄟ?

---
# 進入 Git

----
## Git File status
- untracked -- 未追蹤的
- unmodified -- 未修改的
- modifued -- 經過修改的
- statged -- 等待被commit的檔案
----
## 經過講解 我相信有人會覺得...

----
## 記憶法則說要看七次

---
## 建個測試用資料夾吧
- 新增一個測試資料夾
- 右鍵Git Bash here

----
## Git init
- 在bash上打上
```markdown
git init
```
- 成功的話資料夾裡會多一個.git資料夾
- 操作任何git指令前的必備步驟
----
## 先來設定咚咚
```
git config --global user.name "patrickstar"
git config --global user.email patrickstar@pmail.com
```
- name是指你推的時候用的名子(別人也會看到)
----
## 增加一個檔案
- 看你想放甚麼進去
----
## Git add .
- 將modified, untracked的檔案由工作區丟到暫存區
```markdown
git add .
```

----
## .gitignore
- 用來放不需要提交的檔案
- ex : 你的酷密碼、Library
----
## First commit
```markdown
git commit -m 'init: Oh my first sweet commit'
```
- -m的參數是為這個commit增加註解
- 盡量按照[Conventional Commit](https://www.conventionalcommits.org/en/v1.0.0/)
----
## 為甚麼要好好寫Commit


----
## Wow

----
## 把鏡頭拉回Github棚內
- 登入泥的guthub到repositories

- 右上綠綠的New給他按下去
----
## 新建一個repo
- 按create repo

----
## 阿剛剛三個選項?
- Add a readme file-增加使用說明
- Add .gitigore-裡面是你不想git的檔案
- choose a licence-保護你code的權益
----
## 回到Git現場
```markdown
git remote add origin 剛剛拿到的URL
```
----
### ㄊㄊㄊ
```markdown
git push origin master(main)
```
- 把在staged的檔案丟到遠端同時狀態變成unmodified
----
## 完成一套流程了a
- 然後ㄋ?
----
## 先讓我看看時間
----
## Branch

----
## branch
```markdown
git branch
```
- 查看目前所有分支

----
## 創一個檔案
- 以index.html為例
- add之後 commit
- git status

----
## 為你的分支命名
```markdown
git branch hotfix
```

----
## check it out
- 切換到剛剛的分支
```markdown
git checkout hotfix
```
----
## Then? What happen?
- 看起來一樣實際上不一樣(~~我知道聽起來很幹話~~)
----
## 置換一下文字或圖片
- 再次add之後 commit上去吧
- 現在你的網頁等於是一個新的"版本"
----
## 讓我們再切換一次
```markdown
git checkout master
```
- 把網頁reload 你會發現又變成原本的樣子
----
## 有沒有覺得...
- 這就是版本控制嗎

---
## Merge?

----
## 頭也不回地向前開
- 非常地無情

----
## 施主 放下屠刀 立地...

----
## 切到你欲合併的分支(被合併的
- 有些人可能不明白 讓我娓娓道來
- 假如你想要把hotfix這隻的進度合併到master,那你就切到master
```markdown
git merge hotfix(要合併進來的branch)
```
----
## 你會發現 你會訝異
- 嘿 老兄 那超cool的
- 他並在一起了
----
## 事事並未如此順遂
- what happend?

----
## 騷年 Golden or Silver axe?
- ~~勞贖?~~ 開始刪一刪

----
## 一樣的操作再來一次
- add之後commit
- add之後merge --continue
- 差異??
----
## 先在這邊緩一下

---
## 啊我都自己操作 別人ㄋ
----
## 先來了解一下目前的情況

- 遠端就是你剛剛remote的地方
----
## 現在你的朋友想要一起開發

----
## Crtl + C?
```markdown
git clone 你之前的那串URL
```
- 把遠端的資料抓下來 並自動設定remote
----
## 現在你們擁有一樣的Code了

- John就可以在他本地端做到剛才同樣的操作
----
## 關於我朋友是個工作狂人那檔事
- 一個晚上趕了兩個工作天的進度

----
## 現在你想看看John寫的Code...
```markdown
git pull origin master
```

----
## 出conflict了 阿伯
- John的Code跟你改動的code有不一樣的地方

- 你的就是Current change
- John的是Incoming change
----
## 你超勇的啦
- 在你保留你的更動之後(Accept current change)
- 記得add之後commit在push
->commit前狀態
->commit後

----
## 這大概就是基本的Git
----
## 一切都結束了嘛?

---
## 才沒有勒
**(σˋ▽ˊ)σ**
----
## bonus
```markdown
git stash
git stash drop
git stash list
git stash pop stash@{number}
git stash drop stash@{number}
git stash apply stash@{number}
```
----
## Dont put binaries in your git

- exe是最後result的東西 只要有東西更改 exe也要跟著更改
- 每次算出來的hash值都不一樣
- git tree越來越大
{"metaMigratedAt":"2023-06-16T08:11:42.872Z","metaMigratedFrom":"Content","title":"SCM - Git","breaks":true,"contributors":"[{\"id\":\"11c710ab-a997-41f1-bfcc-1bd8000af1a7\",\"add\":5292,\"del\":550}]"}