Git & GitHub 入門
By 小黑

目錄
- Git 介紹
- GitHub 介紹
- Git 基本指令和知識
- GitHub 教學
- GitHub Pages
Git
Version Control
什麼是 Version Control?
- 一種用來紀錄檔案更動紀錄的軟體
- 有點像 Super Mario 的 checkpoint
- 讓你出事時不至於死太慘

為何需要 Version Control?
- 假設你弄完了某科的學習歷程,於是你把它存成 v1.pdf
- 你傳給老師 v1.pdf,但這老師名字可能正著念倒著念一樣
(或者他是一個寫了很多本書的歷史老師)
- 老師不爽這個版本,叫你重做一份
- 於是你又做了 v2.pdf ,傳給老師
- 然後這老師又不爽 v2.pdf ,又要你重改
- 於是你又弄出了 v3.pdf 、final.pdf、v4-final.pdf...
- 最後可能會變成下張簡報這個樣子

有了版本控制,就不用這麼麻煩!
- 你可能還是得被老師搞
- 但至少不用搞得那麼奇怪
- 版控軟體能讓你隨時回朔到之前的版本
- 有了版本控制大概會長這個樣子:

如果你覺得原本的方案很好
- 如果我今天要開發一個軟體,版本可能會到 20 幾版,可以 這樣一個個存嗎?
- 你跟別人一起寫專案,要怎麼確保兩個人合作好?
- 如果有幾百個人一起改這專案,要怎麼確保能合併好?
- 你的朋友智商可能沒有 157,他可能蓋掉你的檔案,怎解?
- 假設好幾個人一起協作,然後有人亂搞,你要怎麼抓出來是 誰?
所以通通給我用版控!
Git
Git
- 一套版本控制軟體
- 由 Linus Torvalds (欸對又是他)開發
- 目前市面上最多人用的版控軟體(94 %)


Git 簡史
- Linux Kernel 開發最初用另一套版控系統 BitKeeper
- 但 BitKeeper 是付費軟體,而維護者不想開免費版給 Linux 開發者
- Linus 他老哥直接不爽開寫 Git (但這版本無限趨近零,後面 講的指令幾乎都還沒有
- 後續由另外一個日本人接手開發,變成現在的 Git
為何用 Git?
- 你沒有別的選擇
- 快
- 佔用空間比較小
- 可以離線使用,不讓開發工作中斷 (分散式版本控制)
集中式版本控制

分散式版本控制

分散式 vs 集中式
分散式(distributed) | 集中式(centralized) | |
---|---|---|
網路 | 不用 | 需要 |
Repo 地點 | 每個使用者電腦 | 中央的伺服器 |
常見軟體 | Git、Mercurial | Perforce, Subversion |
安裝 Git
- 如果你上節課有裝到 Kali,內建就有,開 terminal 就能用
- 如果你用 Mac 或 Windows,去 官網 載安裝檔,然後無腦 安裝就好了
- 如果你用其他 Linux distro,我相信不用教你也會
GitHub
GitHub
- 一個用來存 code 的網站(類似雲端硬碟)
- 使用 Git 作為版本控制的工具
- 對應到剛剛的 Remote repo
- 全球最大同性交友網站(?
- 上面有很多酷酷的東西

註冊 GitHub 帳號
- 去 https://github.com sign up
- email 隨便填(但等等會用到,先記著

註冊好會像下面這樣子

Git Commands
先設定一下 Git
git config --global user.name "你的名字"
git config --global user.email "你的email"
git config --list # 檢查目前的設定
- 一二行指令用來設定你的個人資訊,這些到時候 Git 會紀錄到每筆紀錄中
- email 用你剛剛註冊 GitHub 填的
- 第三行指令會列出你的設定,如果要看到你的名字跟 email 就成功了
還有 GitHub
ssh-keygen -t ed25519 -C "youremail@example.com"
# 把 youremail@example.com 換成你註冊 GitHub 時用的 email
cat ~/.ssh/id_ed25519.pub # 輸出金鑰,然後記得把這串金鑰複製好
- 第一行會生成一串金鑰(這東西之後密碼學會講,但先不用 了解他),生成過程中如果系統要你輸入東西,一律按 Enter
- 第三行指令會印出這串金鑰,把他複製下來 (Ctrl-Shift-C)
- 接著把這串金鑰摳到 GitHub (見下張投影片
把金鑰摳到 GitHub
- 開啟 GitHub 設定金鑰的頁面,按 New SSH Key
- 然後在 Key 那邊貼上你剛剛複製的金鑰
- Title 隨便打,方便你記得是哪台裝置就好
- 按 Add SSH key 就完成了
第一個 Git Repo
- 首先先創一個資料夾(第一行指令,忘了回去翻第一堂簡 報)
- 接著移動到這資料夾(第二行指令)
- 然後初始化 Git (第三行指令)
(這會在這資料夾下建一個 local repo)
mkdir first_git_repo # 創一個新的資料夾
cd first_git_repo # 移動到這資料夾
git init # 在這個資料夾下建立一個 git repo
Git 基本概念
- 一個 repo 分為三個區塊
- Working Directory
- 所有沒被 Git 追蹤的檔案 or 檔案變動
- Staging Area
- 暫存區,準備提交到 Repository 的檔案放這
- Repository
- 倉庫區,
大概長這樣

改動過的檔案
沒被追蹤的檔案或變動
紀錄好的檔案
Git 流程
1. 第一行指令創了個檔案 hello.txt
2. 第二行指令把 hello.txt 加到暫存區內
3. 第三行指令把暫存區內的東西提交 (commit) repo 內
-m "First Commit" 的意思是說明這次 commit 做了啥
盡量寫成看得懂的樣子,不然你之後要回朔時會很想死
(這樣就會有紀錄,之後就可以看這次提交改了啥)
4. 之後如果檔案有更動,也是一樣的流程:
把檔案加到暫存區 -> 提交
touch hello.txt
git add hello.txt
git commit -m "First Commit"
git add
作用:把檔案加到暫存區
- 第一行指令把 hello.txt 加到暫存區
- 第二行指令會把所有有改動的檔案加到暫存區
git add hello.txt
git add .
git commit
作用:把暫存區內的檔案提交到 Repository
- 第一行指令建立一次提交,並設定這次提交的訊息為 First Commit
- 第二行指令也會建立一次提交,但這次 Git 會讓用 Vim 編輯 提交的訊息
- 每次 commit 都有一個獨一無二的 id ,這點等下會用到
git commit -m "First Commit"
git commit
git status
作用:告訴你哪些東西在暫存區、哪些東西沒被 Git 追蹤
git status

(借用一下我自己的 repo 當例子)
git log
作用:列出 commit 的紀錄
- 第一行列出所有 commit 的完整紀錄
- 第二行只列 commit 的提交訊息跟 commit id
git log
git log --oneline --graph

(學長 commit message 都亂寫,不要學學長
git clone
作用:把 Remote Repo 複製到本地
- 上面那行指令會把這個 repo 摳到本地
git clone git@github.com:demonaarwu/nvim.git
Branch
Branch
- 跟字面意思一樣:「分支」
- 一個 repo 可以有很多個 branch
- 不同 branch 的檔案都是獨立的,不會改到彼此
- branch 可以互相合併(但今天不會講,看講師要不要寫講 義)
為什麼需要不同 branch?
- A 計畫跟 B 計畫
- 跟別人合作時,如果都改同一個 branch 很容易衝突
創建 Branch
- 這行指令會以當前的 branch 為基礎創一個新的 branch 叫 main
- 如果你什麼設定都沒改,repo 的預設 branch 會是 master
git branch main
切換 Branch
- 這行指令會把 Branch 切到 main
- 如果 main 這條 Branch 不存在就會報錯,要先創出來
git checkout main
列出所有 Branch
- 這行指令會列出所有 Branch
git branch --list
GitHub 教學
創 Repo

點這
創 Repo

repo 名稱
repo 要不要公開
填完按這個
創 Repo

這樣就創好了 噎
使用 Repo
- 剛剛創的 GitHub Repo 是之前提的 Remote Repo
- 要使用這個 repo 有兩種方法:clone 下來,或把它跟剛剛 創的 Local Repo 連結(以下講第二種方法)
git remote add origin 你倉庫的連結
- 在 repo 首頁按 Code 會看到一串 git@ 開頭的東西,那個就 是倉庫連結
- 這串指令的意思是替 repo 加一個名字叫 origin 的節點
- 節點可以有不只一個
把檔案丟上去 GitHub Repo
- 這串指令會把 master 這個分支推上 origin 這個節點
- 再去看 GitHub Repo 應該就會有東西惹
git push -u origin master
GitHub Pages
這啥
教學
1. 在你剛剛傳上去的 repo 下創一個 index.html,檔案內容隨便打一串字
2. git add index.html ,然後 commit
3. push 到 GitHub
4. 打開你創的 Repo,到 settings 找 pages
5. 把 branch 設成有 index.html 的那個 branch
6. 打開 https://你的帳號名稱.github.io/Repo 名稱/ 就能看到了!
2024 建北電資上學期資安小社[2]——Git & GitHub
By Aaron Wu
2024 建北電資上學期資安小社[2]——Git & GitHub
- 191