---
# System prepended metadata

title: SIRLA Git入門 課程
tags: [' class', ' git', sirla]

---

---
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)

    > 所謂的「版本控制系統」是指除了能幫你記錄檔案所有的狀態變化，還可隨時切換到過去某個「版本」時候的狀態。
    > ![](https://i.imgur.com/bLB2ZSD.png)
    > 
    * 版本 - 每次檔案(目錄)的新增、刪除或修改其內容，都稱為一個「版本」。
    * 控制 - 控制該檔案(目錄)的狀態變化。
    * 優點：萬一出事，知道該找誰算帳
        * 幫你保留這些歷史紀錄跟證據，萬一出事的時候你就能知道是從什麼時候開始就有問題，以及知道該找誰負責！
        
### 為什麼我們需要學習 Git？
* 情境一：備份不同更新狀態的同一份檔案
    * 缺點：
        * 無法一眼得知修改過的各版本檔案改了什麼內容。
        * 當多人共同編輯時，不知道誰變更的哪個部分，且可能手殘覆蓋到檔案。
           ![](https://i.imgur.com/g183jp2.png =300x400)
### 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 的問題。
    > 
    > ![](https://i.imgur.com/3ouYAvM.png =500x450)
    > 

    * 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
        
        ![](https://i.imgur.com/rQRfsHx.png)

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

    
### 3. 加入暫存區
* `git add`：將檔案加入暫存區，以利追蹤
    
    ```
    $ git add abc.txt
    $ git status
    ```
    ![](https://i.imgur.com/AKuDYeS.png)

    * `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>
    ```
    ![](https://i.imgur.com/WyDwufb.png)
    > `--- 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不一致，會需要額外一些處理
        
        ![](https://i.imgur.com/ype5P2P.png)

        * `.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
        ```
        ![](https://i.imgur.com/AruXtPT.png)
        
        > `-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
    ```