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 資料夾裡
恭喜,踏出專案的第一步!
繼之前的環境設置、先備知識後
終於開始建立專案了
下一堂課也會開始進入實際程式碼
敬請期待~