---
title: SIRLA Git入門 課程
tags: sirla, class, git
description:
1. title 請改為 [授課名稱]課程
2. tag 請刪去template,加上活動內容類型或名稱
3. 下方會議記錄請使用會議記錄範本
4. 加上"{%hackmd BkVfcTxlQ %}"意為套用黑色模板
---
[TOC]
---
# 參考資源
1. [什麼是 Git?為什麼要學習它?](https://gitbook.tw/chapters/introduction/what-is-git.html)
2. [為你自己學 Git](https://gitbook.tw/)
3. [Git 與 Github 版本控制基本指令與操作入門教學](https://blog.techbridge.cc/2018/01/17/learning-programming-and-coding-with-python-git-and-github-tutorial/)
4. [用Git版本控制【Git的基本介紹】 | 連猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/intro/intro1_1.html)
---
# **_Git 入門_**
## (P) **Git 基本介紹**
### 什麼是 Git?
> Git 是一種版本控制系統,也是目前業界最流行的版本控制系統,沒有之一。
>
* 版本控制系統 (Version Control System)
> 所謂的「版本控制系統」是指除了能幫你記錄檔案所有的狀態變化,還可隨時切換到過去某個「版本」時候的狀態。
> 
>
* 版本 - 每次檔案(目錄)的新增、刪除或修改其內容,都稱為一個「版本」。
* 控制 - 控制該檔案(目錄)的狀態變化。
* 優點:萬一出事,知道該找誰算帳
* 幫你保留這些歷史紀錄跟證據,萬一出事的時候你就能知道是從什麼時候開始就有問題,以及知道該找誰負責!
### 為什麼我們需要學習 Git?
* 情境一:備份不同更新狀態的同一份檔案
* 缺點:
* 無法一眼得知修改過的各版本檔案改了什麼內容。
* 當多人共同編輯時,不知道誰變更的哪個部分,且可能手殘覆蓋到檔案。

### Git 特色
* 免費、開源
* Linus Torvalds為管理Linux核心程式碼,僅花10天開發。
* 免費使用,且開放Git的原始程式碼。
* 速度快、檔案體積小
* 記錄每個版本之間的差異,而不是完整的備份整個目錄。
* 取代 極佔空間的「複製、貼上大法」
* 分散式系統
* 即使在沒有伺服器或是沒有網路的環境,依舊可以使用 Git 來進行版控,待伺服器恢復正常運作或是在有網路的環境後再進行同步,不會受影響。
### Git 缺點
* 易學難精
* 指令非常多且有點複雜,但平常會用到的指令不太多
---
## (P) **Git 的本機操作**
:::danger
* 基本上,我們常見的Git操作模式有兩種
* 第一種:本機的專案完成後,再建立GitHub儲存庫並將local儲存庫推上去
> 首先 介紹
* 第二種:先在GitHub建立儲存庫,再`git clone`複製到本機,接著修改並再次推上GitHub儲存庫
> LAB02 介紹
:::
* 操作流程
> 當自己開發時會在工作資料夾工作,先將檔案加入暫存區,確認沒問題則 commit 到儲存庫中,最後 push 上去 remote 環境。
>
> 在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。
>
> 
>
* Git 可分為 `Local(本地)` 和 `Remote(遠端)` 兩個環境
> 由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。
* Local 中,又分為 `working directory(工作資料夾)`、`staging area(暫存區)` 和 `repositories(儲存庫)`。(本機上)
* Remote 儲存庫,如:GitHub Repositories。
### 前置作業:安裝並且設定 Git (只須設定一次)
* 安裝 Git 到你的電腦上
* [Git官網 - 下載](https://git-scm.com/downloads)
* [Windows - Git 安裝教學影片](https://gitbook.tw/chapters/environment/install-git-in-windows.html)
* [Mac OS - Git 安裝教學影片](https://gitbook.tw/chapters/environment/install-git-in-mac.html)
* 確認Git是否安裝成功:查詢 Git 版本
```
$ git --version
```
* 設定 Git 的使用者名稱和電子信箱
* 設定你的帳戶,讓 Git 知道這台電腦做的修改要連結到哪一個使用者、電子郵件。
> 待會我們要在 Github 上註冊帳號,建議使用一致的帳號和電子信箱
```
git config --global user.name "<Your Name>"
git config --global user.email "<your@gmail.com>"
```
### 1. 建立一個本機的工作資料夾並進行版控的初始化
```
$ mkdir test-2020
$ cd test-2020
$ git init
```
> `git init`:初始化這個目錄,讓 Git 對這個目錄開始進行版本控制
>
### 2. 檢視狀態、新增或修改
* `git status`:檢視目前工作目錄的狀態
```
$ git status
```
* 新增檔案前的 git status

* 新增檔案後的 git status
> Untracked files:
> 是指該檔案還沒進到git追蹤範圍中/暫存區,代表==沒有此檔案的版本控制紀錄==。
>
> 所以,接下來我們要使用 `git add <檔案名稱>` 加入追蹤。

### 3. 加入暫存區
* `git add`:將檔案加入暫存區,以利追蹤
```
$ git add abc.txt
$ git status
```

* `git add --all` / `git add .`:一口氣把全部的檔案加到暫存區。
### 4. 提交(commit)到儲存庫中
* `git commit -m "註記"`:提交註記
> `-m` 為輸入 commit message,也就是說這個 commit 內做了哪些事情
>
```
$ git commit -m "add abc.txt"
[master (root-commit) 90c8ede] add abc.txt
1 file changed, 1 insertion(+)
create mode 100644 abc.txt
$ git status //commit完成
On branch master
nothing to commit, working tree clean
```
### LAB01 - 修改 abc.txt 並提交至 local repository
```
$ git status
$ git add --all
$ git status
$ git commit -m "modify: def"
```
* `git log`:檢視之前 Commit 的紀錄
* `git diff`:比對兩版本間的差異
```
git log
git diff <commit1> <commit2>
```

> `--- a/abc.txt` 比較舊的版本 / `+++ b/abc.txt` 比較新的版本
> `+開頭` 新加的行 / `-開頭` 被刪除的行
---
## (P) **GitHub 又是什麼?**
* Git $\neq$ GitHub
* Git 是一款版本控制軟體。
* GitHub 是一個商業網站。Github 當作遠端托管程式的環境。
* GitHub 的本體是一個 Git 伺服器
* 提供將 Git 控制的程式碼上傳到網路上的空間
### 註冊 GitHub 帳號
* [GitHub 官網](https://github.com)
### 5. 在 GitHub 建立 repository
:::danger
* 第一種Git操作模式:
* 本機的專案完成後,再建立GitHub儲存庫並將local儲存庫推上去
:::
* 建立 GitHub 儲存庫
* 輸入 repository name(專案名稱),跟電腦 local 專案一致。
* 先不勾選初始化 `README`,以及不要選擇 `.gitignore` 和 `License 授權`
> 不然會造成local和remote不一致,會需要額外一些處理

* `.gitignore`:要忽略的檔案清單。
* 用來告訴 Git,當在做版本控制記錄的時候,忽略這些檔案。
* 通常會把機密資料加入,如:資料庫帳號密碼或是 server IP 位置。
> [【狀況題】有些檔案我不想放在 Git 裡面…](https://gitbook.tw/chapters/using-git/ignore.html)
* `README.md`:repository 介紹和使用方式說明,使用 markdown 語法撰寫。
* 另外,通常有 `CONTRIBUTING.md` 額外說明如何參與貢獻。
* `LICENSE`:專案使用何種授權方式,如:MIT、BSD 等。
### 6. 將 repository 做本機和遠端的連結,並 push 上去遠端儲存庫
* 將 repository 做本機和遠端的連結
> 新增一個遠端GitHub儲存庫的連接,其名稱為 origin (名稱自訂)
```
$ git remote add origin https://github.com/bessyhuang/test-2020.git
```
* 將本機端程式 push 到遠端儲存庫
* remote name: `origin`
* branch name: `master`
```
$ git push -u origin master
```

> `-u` 等同於 `--set-upstream`,
> 設定 upstream 可以使分支開始追蹤指定的遠端分支。
>
> 只要做過一次 `$ git push -u <remote name> <branch name>` 且成功 push;本機端的 master 就會被設定去追蹤遠端的 `<remote name>/<branch name>` 分支。
>
> 只要成功設定好 upstream 後,
> 第二次以後要上傳分支時,就只需要透過 `$ git push` 就可以了。
>
---
## LAB02 - 在 GitHub 建立儲存庫,並 clone 到電腦上
:::danger
* 第二種Git操作模式:
* 先在GitHub建立儲存庫,再`git clone`複製到本機,接著修改並再次推上GitHub儲存庫
:::
1. 在 GitHub 建立一個新的儲存庫
2. 複製到 local
```
$ git clone https://github.com/bessyhuang/test000.git
```
> `git pull`:拉回本機更新。
> 到線上抓東西下來(Fetch),並更新本機的進度(Merge)。
3. 進入 `test000` 資料夾中
```
$ cd test000
```
4. 新增、修改、刪除檔案
* 新增 `password.txt` 、 `test.py` 和 `venv` 資料夾
* 新增 `.gitignore`,其內容放置需要被忽略的檔案或資料夾
> 之後,只會看到 `test.py` 檔案
```
password.txt
venv
```
5. 加入暫存區
```
$ git add --all
$ git status
```
6. commit 到本機端儲存庫
```
$ git commit -m "註記"
```
7. push 到 GitHub 遠端儲存庫
```
$ git push
```