---
# System prepended metadata

title: Git & Github

---

---
slideOptions:
  transition: slide
---

# Git & Github
##### Steve Jian

---

### 課程開始之前有些東西要先準備😃

----

WSL的使用者還記得使用apt update速度很慢嗎
試試把鏡像來源替換

``` bash
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bk
$ sudo sed -i 's/archive.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list
$ sudo sed -i 's/security.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list 
```
然後再試試  
``` bash
$ sudo apt update
```

----

來源都更換為國網中心了 😎
![](https://i.imgur.com/WujODbJ.png)

----

還記得在Ubuntu內建的python要用  
``` bash 
$ python3
```
呼叫嗎

----

更改python3的别名
``` bash
$ cp ~/.bashrc ~/.bashrc.bk
$ echo "alias python='/usr/bin/python3'" >> ~/.bashrc
```

---

## What Git?
![](https://i.imgur.com/6F4d27z.png)

----

是一個分散式版本控制軟體，最初由林納斯·托瓦茲創作目的是為更好地管理Linux核心開發而設計。

----

隨著專案持續的開發一定會有新增檔案或是刪除檔案而Git就是在你下的那刻記錄整個專案所有變動，就像玩RPG需要儲存遊戲進度一樣，開發者也透過Git保存開發紀錄。
![](https://i.imgur.com/k8iddJq.png)

----

Git 的優點

1. 免費、開源
2. 速度快、檔案體積小
3. 分散式系統

----

Git 的缺點

功能多到有點複雜 😂  
但是20% 的指令就足以應付平日 80% 的工作

---

## Git Install

----

Ubuntu:  

###### install(其實已經內建了):
``` bash
$ sudo apt update && sudo apt install git
```
###### check:
``` bash
$ git --version
```

---

修改編輯器

``` bash
$　git config --global core.editor nano
```

----

使用者設定

``` bash
$ git config --global user.name "your username"
$ git config --global user.email "your email"
```

---

###### 新增工作目錄
``` bash
$ mkdir ~/test
```
######  進入目錄
``` bash
$ cd ~/test
```
###### 讓Git對這個目錄開始進行版控
``` bash
$ git init
```

----

``` bash
$ ls -al
```
![](https://i.imgur.com/vlZGDVf.png)
目錄內有一個.git資料夾

---

查看git狀態
``` bash
$ git status
```
![](https://i.imgur.com/FbOxZyH.png)

---

在目錄內新增檔案
``` bash
$ echo "print('hello world')" > test.py
```
![](https://i.imgur.com/l3iCzi8.png)

---

``` git add ```追蹤檔案並安置到暫存區，等待稍後跟其它檔案一起提交(commit)
``` bash
$ git add <file>
```

----

追蹤```test.py```
``` bash
$ git add test.py
```
![](https://i.imgur.com/xJkqBlq.png)

----

###### 追蹤單一檔案
``` bash
$ git add <file>
```
###### 追蹤所有檔案
``` bash
$ git add .
```
###### 將所有.py副檔名檔案加入追蹤
``` bash
$ git add *.py
```

----

情境模擬 新增檔案及編輯已追蹤的檔案
###### 新增```2.py```
``` bash
$ echo "print(2)" > 2.py
````
###### 編輯```test.py```
``` bash
$ echo "print('add something')" >> test.py
```

----

已追蹤的檔案仍然要再次加入追蹤
![](https://i.imgur.com/J38p1GE.png)

----

情境模擬 取消已追蹤的檔案
``` bash
$ git rm --cached <file>
```
![](https://i.imgur.com/JWTh7a9.png)

---

把暫存區的內容提交
``` bash
$ git commit
```

----

新增commit message
![](https://i.imgur.com/DlulYkt.png)

----

commit message 是指說明  
「你在這次的 Commit 做了什麼事」  
只要使用簡單、清楚的文字說明就好  

----

1. 第一行為 commit message 的標題  
    （僅限一行）
3. 第二行保留空白
4. 第三行以後是 commit message 的內容  
    （可略過不寫）

----

寫完commit訊息後```ctrl + X```再按```Y```存檔
![](https://i.imgur.com/1EGNKn1.png)

----

也可以用
``` bash
$ git commit -m "commit message title"
```
快速commit只有標題的message

----

Git 每次的 Commit 都只會處理暫存區裡的內容，也就是說如果在執行 git commit 指令的時候，那些還沒被加到暫存區裡的檔案，就不會被 Commit 到儲存庫裡。

----

什麼時候要 Commit？  

1. 完成一個「任務」的時候
2. 下班的時候
3. 你想要Commit的時候就可以Commit

---

Git使用流程
![](https://i.imgur.com/gP6sARx.png)

----

查看所有commit
``` bash
$ git log
```
![](https://i.imgur.com/nDtkRey.png)

該指令會顯示log看完可按q離開

---

.gitignore  

只要在專案目錄裡放一個 .gitignore 檔案，並且設定想要忽略的規則，git就會無視符合規則的檔案

----

```
# 忽略 secret.yml 檔案
secret.yml

# 忽略 config 目錄下的 database.yml 檔案
config/database.yml

# 忽略所有 db 目錄下附檔名是 .sqlite3 的檔案
/db/*.sqlite3

# 忽略所有附檔名是 .tmp 的檔案
*.tmp

# 當然你要忽略自己也可以，只是通常不會這麼做
# .gitignore
```

----

.gitignore 檔案設定的規則，只對在規則設定之後的有效，那些已經存在的檔案就像既得利益者一樣，這些規則是對他們沒有效果的。

---

Branch  
分支是為了將修改記錄的整體流程分開儲存，讓分開的分支不受其他分支的影響，所以在同一個數據庫裡可以同時進行多個不同的修改

----

![](https://i.imgur.com/jCxsQYi.png)

----

查看git中所有的分支
``` bash
$ git branch
```
星號 * 表示現在正在這個分支上
```
* master
  dev
```
按q離開

----

新增分支
``` bash
$ git branch <name>
```
刪除分支
``` bash
$ git branch -d <name>
```
切換分支
``` bash
$ git checkout <name>
```
新增然後切換分支
``` bash
$ git checkout -b <name>
```

---

### 合併分支

----

新增然後切換dev分支
``` bash
$ git checkout -b dev
```
在dev分支新增一個檔案
``` bash
$ echo "print('add dev branch')" > dev.py
```
add 然後 commit
``` bash
$ git add .
$ git commit -m "add dev.py on dev"
```

----

![](https://i.imgur.com/S1dAdw6.png)

----

![](https://i.imgur.com/w2KIh4U.png)

----

## 將dev併入master  
切換回master branch  
``` bash
$ git checkout master
```
合併dev  
``` bash
$ git merge dev
```

----

![](https://i.imgur.com/0hYgldq.png)

----

![](https://i.imgur.com/7DHshkQ.png)

---

# 練習時間~

----

請在master branch任意修改```test.py```  
然後add -> commit

----

切 dev branch 修改```test.py```  
(不要和master加入一樣的內容)
add -> commit

----

請嘗試將dev併入master
![](https://i.imgur.com/6UWVNAn.png)

----

```bash 
$ git merge dev
```
![](https://i.imgur.com/d8GERyU.png)
Oops! 有衝突

----

請保留兩邊新增的內容並解決衝突
Hint: VS code很好用

---

## GitHub
![](https://i.imgur.com/aFpuAgX.png)

----

全球最大的 Git Server  
全球最大男性交友平台  
~~PornHub === DreamHub~~

----

還沒註冊的還不註冊嗎😂
https://github.com/

---

在GitHub新增專案
![](https://i.imgur.com/7xMZYQ2.png)

----

![](https://i.imgur.com/8NVWSk4.png)

----

![](https://i.imgur.com/zko2NrG.png)

----

克隆GitHub上的repo到local  
``` bash
$ git clone <remote>
```

在local新增remote節點
``` bash
$ git remote add origin <remote>
```

---

將local推到remote上
``` bash
$ git push <remote name> <branch> #git push origin master
```
然後輸入帳號密碼

----

GitHub上就有剛剛push上的code了!
![](https://i.imgur.com/3cT9cU5.png)

---

將remote拉到local上
``` bash
$ git pull
```

---

### 情境題 如果push失敗怎麼辦?

----

這常在多人開發時發生  
因線上版本的內容比你電腦裡這份還要新

----

## 第一招：先拉再推

pull下來解決衝突然後  
add->commit->push

----

## 第二招：強制覆蓋

``` bash
$ git push -f
```
-f表示force  
將local複寫remote

---

GitHub上有很多有趣的專案，學會git後可以clone下來協助開發也可以參考別人的code!

---

### 最後將今天的test推上GitHub上吧!

---

# *fin*
![](https://i.imgur.com/oWJiQzN.png)




