Git & GitHub

專案建置[3]

講師:溫室蔡

你的第一個專案

1. 打開終端機

2. 建一個新資料夾

3. 建一個 C++ 檔案

4. 寫一個 Hello world

5. 編譯並執行

# 創資料夾、檔案
$ mkdir myproject
$ cd myproject
$ touch hello.cpp

# 在編輯器寫一個 Hello world
$ code . # 用 VS Code 開
$ vim hello.cpp # 用 vim 開

# 編譯並執行
$ g++ hello.cpp
$ ./a.out

# 如果它跟你說沒裝 g++
$ sudo apt install g++

你的第一個專案

隨著你的專案越來越大

檔案也會越來越多

甚至會有其他人一起協作

這時候就需要一個管理工具

也就是今天的主角 — Git

為何需要版本控制

當你寫程式的時候

你可能會想幫程式增加新功能

但是又怕寫失敗整組爛掉

所以會複製一整個資料夾當備份

但對於大型專案、多人協作來說

這樣的備份是不切實際的

版本控制系統:Git

Linus Torvalds(寫 Linux 的那個人)

為了管理 Linux 的 code 而寫了 Git

它可以對你的程式碼

進行記錄、分支

或上傳至遠端伺服器

或從伺服器下載程式碼

Git 圖解

開了一個新專案

實作了XX功能

修復了XX Bug

...

第一次使用 Git

1. 確定你有沒有裝 Git

$ git --version
# 如果沒裝:
$ sudo apt install git

2. 設定你的名字和 Email

$ git config --global user.name "Justin"
$ git config --global user.email "justin@gmail.com"

在專案中使用 Git

1. 回到你的專案資料夾底下

2. 初始化 Repository

$ git init
Initialized empty Git repository in /home/justin/myproject/.git/

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.c

nothing added to commit but untracked files present (use "git add" to track)

3. 看一下現在的狀況

用 Git 記錄檔案更動

Git 記錄分成兩步驟

# 選擇所有檔案
$ git add .

# 記錄更動
$ git commit -m 'Initial commit'

1. 選擇要記錄的檔案

2. 記錄更動並留下訊息

Add & Commit 圖解

Stage

已修改的檔案

a.cpp

b.cpp

c.cpp

Add & Commit 圖解

Stage

已修改的檔案

a.cpp

b.cpp

c.cpp

git add

Add & Commit 圖解

Stage

已修改的檔案

a.cpp

b.cpp

c.cpp

git commit

Add & Commit 圖解

Stage

已修改的檔案

a.cpp

b.cpp

c.cpp

git add

Add & Commit 圖解

Stage

已修改的檔案

a.cpp

b.cpp

c.cpp

git commit

如果有不想記錄的檔案怎麼辦

在專案目錄底下放一個

a.out        # 忽略 a.out 這個檔案
*.o          # 忽略所有副檔名為 .o 的檔案
res/test.jpg # 忽略 res 資料夾底下的 test.jpg 這個檔案
my_tests/    # 忽略 my_tests 這個資料夾

名為 .gitignore 的檔案

在裡面放你不想記錄的檔名

查看 Git 紀錄

$ git log

不好讀?

$ git log --oneline --graph

我 commit 了,我後悔了

$ git reset HEAD^

回復到上一個 commit

$ git reset 6b5d135

回復到特定 commit

追加技:穢土轉生

之前教指令的時候有講過

用 rm 刪除的檔案是救不回來的

但在 Git 管理的專案底下

每個檔案都是耶穌

$ rm hello.cpp # 阿幹刪掉了
$ git checkout hello.cpp # 復活啦!

GitHub:開源專案平台

存放「用 Git 管理的專案」的平台

做為專案的「遠端伺服器」

先去創 GitHub 帳號

https://github.com

設定個人存取 Token

想當然爾,上傳程式碼會需要帳密

以前都是打 GitHub 帳號的密碼

但自 2021 年 8 月 13 起

基於資安考量

改用 token 做身分驗證

設定個人存取 Token

1. 去 GitHub 帳號設定

設定個人存取 Token

1. 去 GitHub 帳號設定

2. 點 Developer Settings

設定個人存取 Token

1. 去 GitHub 帳號設定

2. 點 Developer Settings

3. 點 Tokens (classic)

設定個人存取 Token

1. 去 GitHub 帳號設定

2. 點 Developer Settings

3. 點 Tokens (classic)

4. Generate new token

設定個人存取 Token

1. 去 GitHub 帳號設定

2. 點 Developer Settings

3. 點 Tokens (classic)

4. Generate new token

5. 期限選「不過期」

    底下 Scope 全勾

設定個人存取 Token

把這東西複製下來

存在一個檔案裡

沒用的,這是範例,不是我的 token

實際使用 GitHub

開一個新的 Repository

取個名字,剩下的都不用管

在本地新增遠端 Repo

要上傳專案當然得先知道上傳到哪

所以先去 GitHub 找 Repo 的網址

在本地新增遠端 Repo

要上傳專案當然得先知道上傳到哪

所以先去 GitHub 找 Repo 的網址

再回到終端機,你的專案目錄底下

用下面的指令新增其為遠端伺服器

$ git remote add origin 網址

來上傳囉!

接著它會問你帳密

$ git push -u origin master

帳號打 GitHub 帳號名稱

密碼打之前弄的那個 token

就成功推上去了~

下載怎麼做?

本地沒檔案,想從 GitHub 抓

$ git clone 網址

有檔案,想跟 GitHub 同步

$ git pull

大圖解

Git 分支

當你想幫程式增加新功能

又怕自己搞爛到本來能用的變不能用

就開分支吧!

新增、刪除分支

要新增分支,用下面的指令

$ git branch 分支名稱

要刪除則是加 -d

$ git branch -d 分支名稱

一開始你只有一個 master 分支

查看、切換分支

有標星號的是你目前所在的分支

用下面的指令查看現有的分支

$ git branch

要切換用下面的指令

$ git checkout 分支名稱

落葉歸根

切換到一條分支後

$ git checkout master # 先回到 master 分支
$ git merge 分支名稱   # 把指定的分支合併回 master

所有 commit 都是長在這條分支上

但最後還是要合併回原本的分支

屆時需如下操作:

其他專案的重要檔案

README.md

讓人一看就知道這啥的說明文件

在 GitHub 上相當於專案的首頁

LICENSE

軟體就是要給別人用的

當然也要有授權條款

開源授權條款

軟體界自己發展出了一套授權體系

其中有五個最常見的:

GNU 通用公眾授權條款(GPL)

GNU 較寬鬆公共授權條款(LGPL)

BSD 授權條款

MIT 授權條款

Apache 授權條款

GPL 授權條款與四大自由

[0] 使用該軟體的自由

[1] 查看軟體原始碼並研究的自由

[2] 散布軟體的自由

[3] 修改軟體並發布的自由

GPL 授權條款與四大自由

[0] 使用該軟體的自由

[1] 查看軟體原始碼並研究的自由

[2] 散布軟體的自由

[3] 修改軟體並發布的自由

只要其中一個部份

用到 GPL 軟體

整個專案就得

用 GPL 釋出

LGPL 授權條款

比 GPL 寬鬆

如果只是拿 LGPL 的軟體來用

而沒有修改其原始碼

就不會強迫開源

BSD 授權條款

又比 GPL 或 LGPL 寬鬆

用到 BSD 的軟體時

來自加州大學柏克萊分校

要包含原本的授權條款

MIT 授權條款

跟 BSD 差不多

來自麻省理工學院

都要包含原軟體的授權條款

Apache 授權條款

也跟 BSD 差不多

但除了得包含原軟體的授權條款外

如果有修改軟體的原始碼

要說明改了哪裡

專案資料夾結構

啊… 現在檔案有點多了

設定檔、文件、程式碼、執行檔

全部都混在一起

所以得來分類一下!

之後還會更多

文件與設定檔

.gitignore 一定要放在第一層

因為 Git 只會去第一層找

README、LICENSE 也是

原因是要讓人第一眼就看到

┬─ .gitignore
├─ README.md
└─ LICENSE

程式碼與執行檔

C++ 的程式碼

分成 .cpp 檔和 .h 檔

┬─ include/
│  └ hello.h
├─ src/
│  └ hello.cpp
├─ build/
│  └ a.out
├─ .gitignore
├─ README.md
└─ LICENSE

.h 檔是拿來 #include 的

所以放在 include 資料夾裡

.cpp 檔是原始碼(source)

所以放在 src 資料夾裡

執行檔則放在 build 資料夾裡

範例、測試程式

當然也可以再加入

┬─ include/
│  └ hello.h
├─ src/
│  └ hello.cpp
├─ build/
│  └ a.out
├─ examples/
│  ├ ex1.cpp
│  └ ex2.cpp
├─ .gitignore
├─ README.md
└─ LICENSE

「把專案實際拿來用」

的範例程式

順便當成測試

放在 examples 資料夾裡

恭喜,踏出專案的第一步!

繼之前的環境設置、先備知識後

終於開始建立專案了

下一堂課也會開始進入實際程式碼

敬請期待~