[工具應用] 001 Git 入門指南:給資安新手的完整教學

前言

在資安領域工作,你會經常接觸到各種工具、腳本和專案原始碼。無論是下載滲透測試工具、管理自己的漏洞研究程式碼,還是與團隊協作開發安全工具,Git 都是你必須掌握的基礎技能。這篇文章將帶你從零開始理解 Git 的核心概念與實際操作。

什麼是 Git?

Git 是一套「分散式版本控制系統」(Distributed Version Control System)。這個名詞聽起來很複雜,但概念其實很簡單。

想像你正在撰寫一份滲透測試報告。你可能會這樣命名檔案:報告v1.docx、報告_v2.docx、報告最終版.docx、報告最終版修改.docx⋯⋯這種做法不僅混亂,而且很難追蹤每個版本之間到底改了什麼。

Git 就是用來解決這個問題的。它能夠記錄檔案的每一次變更,讓你可以隨時查看歷史紀錄、比較不同版本的差異、回到過去的任何一個版本,甚至讓多人同時編輯同一份檔案而不會互相覆蓋。

Git 最初是由 Linux 之父 Linus Torvalds 在 2005 年開發的,目的是為了管理 Linux 核心的開發。如今,它已經成為軟體開發界最主流的版本控制工具。

Git 的核心特性

版本追蹤:每次你「提交」(commit)變更,Git 都會建立一個快照,記錄當下所有檔案的狀態。你可以想像成遊戲的存檔點,隨時可以讀取回去。

分支功能:Git 允許你建立「分支」(branch),在不影響主要程式碼的情況下進行實驗或開發新功能。這對資安研究特別有用,例如你可以建立一個分支來測試某個漏洞利用程式的改良版本。

分散式架構:每個使用者的電腦上都有完整的專案歷史紀錄,不需要依賴中央伺服器。即使離線,你也能繼續工作和查看歷史。

Git 與 GitHub 的差異

這是新手最常搞混的概念,讓我用一個簡單的比喻來說明。

Git 就像是一台相機,它是用來拍照(記錄版本)的工具,完全在你的電腦上運作。

GitHub 就像是一個線上相簿平台,讓你可以把照片上傳到雲端、與朋友分享、讓別人也能看到你的作品。

換句話說,Git 是一個軟體工具,而 GitHub 是一個基於 Git 的線上服務平台。你可以只用 Git 而不用 GitHub(檔案都存在本機),但你不能用 GitHub 而不用 Git(因為 GitHub 就是建立在 Git 之上的)。

類似 GitHub 的其他平台

除了 GitHub 之外,還有其他提供類似服務的平台:

GitLab:功能與 GitHub 相似,但提供更多內建的 DevOps 功能,許多企業會自己架設私有的 GitLab 伺服器。

Bitbucket:Atlassian 公司的產品,與 Jira 等專案管理工具整合良好。

Gitea:輕量級的自架方案,適合小型團隊或個人使用。

為什麼資安人員要熟悉 GitHub?

對資安人員來說,GitHub 是一個寶庫。大量的安全工具都託管在 GitHub 上,例如 Nmap、Metasploit、Burp Suite 的擴充套件、各種 POC(概念驗證)程式碼等。熟悉如何從 GitHub 下載和更新這些工具,是資安工作的基本功。

此外,許多漏洞的技術細節和利用程式碼也會發布在 GitHub 上。能夠快速 clone 一個 repository、理解其結構、甚至修改程式碼來適應你的測試環境,這些都是實用的技能。

安裝 Git

在開始使用之前,你需要先安裝 Git。

Windows:前往 https://git-scm.com/download/win 下載安裝程式,按照預設選項安裝即可。安裝完成後,你可以使用「Git Bash」這個終端機來執行 Git 指令。

macOS:開啟終端機,輸入 git --version。如果尚未安裝,系統會提示你安裝 Xcode Command Line Tools,其中包含 Git。

Linux(Debian/Ubuntu):執行 sudo apt update && sudo apt install git

Linux(Fedora/RHEL):執行 sudo dnf install git

安裝完成後,建議先設定你的身份資訊,這會用於記錄每次提交的作者:

git config --global user.name "你的名字"
git config --global user.email "你的電子郵件"

Git 基本概念

在學習指令之前,先理解幾個重要概念。

Repository(儲存庫)

Repository,簡稱 repo,就是一個被 Git 管理的專案資料夾。這個資料夾裡會有一個隱藏的 .git 目錄,裡面存放著所有的版本歷史和設定。

工作區域的三個狀態

Git 將檔案分成三個區域:

工作目錄(Working Directory):就是你實際編輯檔案的地方,也就是你在檔案總管或終端機看到的那些檔案。

暫存區(Staging Area):當你修改了檔案,想要將這些變更納入下一次提交時,需要先把檔案加入暫存區。這讓你可以選擇性地決定哪些變更要一起提交。

儲存庫(Repository):當你執行提交後,暫存區的內容就會被永久記錄到儲存庫的歷史中。

這個流程可以想像成:你在工作桌上修改文件(工作目錄),把要歸檔的文件放到「待歸檔」托盤(暫存區),最後把托盤裡的文件正式存入檔案櫃(儲存庫)。

Commit(提交)

每次提交就是一個版本快照。每個 commit 都有一個唯一的識別碼(一長串十六進位字元),以及提交訊息來說明這次變更的內容。良好的提交訊息對於日後回顧歷史非常重要。

Branch(分支)

分支讓你可以在不影響主線的情況下進行開發。預設的主分支通常叫做 mainmaster。你可以從主分支建立新分支,在新分支上自由實驗,完成後再合併回主分支。

Git 常用指令詳解

初始化與複製

建立新的 Git 儲存庫

如果你想讓現有的資料夾開始使用 Git 管理:

cd 你的專案資料夾
git init

這會在資料夾中建立 .git 目錄,此時這個資料夾就成為一個 Git 儲存庫了。

複製遠端儲存庫

這是資安人員最常用的指令之一。當你想下載 GitHub 上的某個工具時:

git clone https://github.com/使用者名稱/專案名稱.git

例如,要下載知名的目錄掃描工具 dirsearch:

git clone https://github.com/maurosoria/dirsearch.git

執行後,會在當前目錄下建立一個與專案同名的資料夾,包含所有程式碼和完整的版本歷史。

查看狀態與歷史

查看目前狀態

git status

這個指令會告訴你:哪些檔案被修改了、哪些檔案已加入暫存區、哪些檔案尚未被 Git 追蹤。養成經常執行 git status 的習慣,可以幫助你掌握目前的工作狀態。

查看提交歷史

git log

顯示所有提交紀錄,包含 commit ID、作者、日期和提交訊息。如果歷史很長,可以用以下變體:

git log --oneline          # 每個提交只顯示一行
git log -n 5               # 只顯示最近 5 筆提交
git log --graph --oneline  # 以圖形方式顯示分支結構

查看檔案差異

git diff                   # 查看工作目錄與暫存區的差異
git diff --staged          # 查看暫存區與最後一次提交的差異
git diff commit1 commit2   # 比較兩個提交之間的差異

基本工作流程

加入檔案到暫存區

git add 檔案名稱           # 加入特定檔案
git add .                  # 加入所有變更的檔案
git add *.py               # 加入所有 Python 檔案

提交變更

git commit -m "提交訊息"

提交訊息應該簡潔明瞭地說明這次變更做了什麼。好的提交訊息範例:

  • “修復 SQL injection 漏洞”
  • “新增密碼強度檢查功能”
  • “更新相依套件版本”

一次完成加入和提交

如果要提交所有已追蹤檔案的變更:

git commit -am "提交訊息"

注意:這不會包含新建立但尚未追蹤的檔案。

分支操作

查看所有分支

git branch                 # 查看本地分支
git branch -a              # 查看所有分支(包含遠端)

建立新分支

git branch 新分支名稱

切換分支

git checkout 分支名稱
git switch 分支名稱        # Git 2.23 之後的新語法

建立並切換到新分支

git checkout -b 新分支名稱
git switch -c 新分支名稱   # Git 2.23 之後的新語法

合併分支

假設你在 feature 分支完成開發,想合併回 main

git checkout main          # 先切換到目標分支
git merge feature          # 將 feature 合併進來

刪除分支

git branch -d 分支名稱     # 刪除已合併的分支
git branch -D 分支名稱     # 強制刪除分支

遠端操作

查看遠端儲存庫

git remote -v

新增遠端儲存庫

git remote add origin https://github.com/使用者名稱/專案名稱.git

從遠端取得更新

git fetch                  # 下載遠端變更,但不合併
git pull                   # 下載並合併遠端變更(相當於 fetch + merge)

對資安人員來說,定期 git pull 你常用的工具是好習慣,可以確保你使用的是最新版本,包含最新的功能和修復。

推送到遠端

git push                   # 推送當前分支
git push origin main       # 推送 main 分支到 origin
git push -u origin main    # 推送並設定上游分支

復原與回退

取消暫存

如果你不小心把檔案加入暫存區:

git restore --staged 檔案名稱

放棄工作目錄的變更

git restore 檔案名稱       # 放棄特定檔案的變更
git restore .              # 放棄所有變更(危險!)

回到特定的提交

git checkout commit識別碼  # 查看特定版本(會進入 detached HEAD 狀態)
git revert commit識別碼    # 建立一個新提交來撤銷指定提交的變更
git reset --hard commit識別碼  # 強制回到特定版本(危險!會丟失之後的提交)

暫存工作進度

當你正在進行某項工作,但需要臨時切換去處理其他事情:

git stash                  # 暫存目前的變更
git stash list             # 查看所有暫存
git stash pop              # 恢復最近一次暫存並刪除該暫存
git stash apply            # 恢復最近一次暫存但保留該暫存

實戰範例:資安工具的日常操作

情境一:下載並更新安全工具

假設你要使用 sqlmap 這個 SQL injection 測試工具:

# 第一次下載
git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap

# 之後要更新到最新版本
git pull

情境二:建立自己的漏洞研究專案

# 建立專案資料夾
mkdir my-security-research
cd my-security-research

# 初始化 Git
git init

# 建立一些檔案
echo "# My Security Research" > README.md
echo "poc.py" > .gitignore  # 假設你不想追蹤某些檔案

# 加入並提交
git add .
git commit -m "Initial commit"

# 開始研究某個漏洞,建立專門的分支
git checkout -b cve-2024-xxxx

# 進行研究、撰寫程式碼...
# 完成後提交
git add exploit.py
git commit -m "Add POC for CVE-2024-XXXX"

# 合併回主分支
git checkout main
git merge cve-2024-xxxx

情境三:參與開源安全專案

# Fork 專案後,clone 你的 fork
git clone https://github.com/你的帳號/某安全工具.git
cd 某安全工具

# 新增原始專案為上游
git remote add upstream https://github.com/原作者/某安全工具.git

# 保持與上游同步
git fetch upstream
git merge upstream/main

# 建立功能分支進行開發
git checkout -b fix-bug-123

# 開發完成後推送到你的 fork
git push origin fix-bug-123

# 然後到 GitHub 網站上建立 Pull Request

.gitignore 檔案

.gitignore 是一個特殊檔案,用來告訴 Git 哪些檔案或資料夾不需要追蹤。這對資安工作特別重要,因為你可能會有一些敏感檔案不應該被提交,例如:

# 認證相關
*.key
*.pem
credentials.txt
.env

# 測試結果
scan_results/
*.log

# 編譯產物
*.pyc
__pycache__/

# IDE 設定
.vscode/
.idea/

# 系統檔案
.DS_Store
Thumbs.db

安全注意事項

作為資安人員,使用 Git 時有幾點特別需要注意:

不要提交敏感資訊:API 金鑰、密碼、私鑰等絕對不應該出現在 Git 歷史中。一旦提交,即使之後刪除,仍然可以從歷史中找到。

謹慎處理公開儲存庫:如果你的專案是公開的,任何人都能看到所有內容,包括提交歷史。

審查你下載的程式碼:從 GitHub clone 工具前,先檢查專案的星星數、更新頻率、issues 討論等,確保它是可信的。有些惡意專案會偽裝成合法工具。

使用 SSH 金鑰:與其每次都輸入帳號密碼,不如設定 SSH 金鑰來與 GitHub 通訊,更安全也更方便。

進階學習資源

當你熟悉了基本操作後,可以進一步學習:

  • Git 內部原理:理解 Git 如何儲存資料、什麼是 SHA-1 雜湊、物件模型等
  • 進階分支策略:Git Flow、GitHub Flow 等團隊協作模式
  • 互動式 Rebase:整理提交歷史的強大工具
  • Git Hooks:自動化腳本,可在特定操作時觸發

結語

Git 是一個功能強大的工具,剛開始可能會覺得指令很多、概念很抽象,但只要從基本的 clone、add、commit、push、pull 開始練習,很快就能上手。對資安人員來說,熟練使用 Git 不只是為了管理自己的程式碼,更是為了能夠有效地使用和貢獻開源安全社群的各種資源。

記住,學習 Git 最好的方式就是實際使用它。找一個你感興趣的安全工具專案,clone 下來研究它的程式碼,或者開始用 Git 管理你自己的筆記和腳本。實踐出真知,祝你學習順利!

飛飛
飛飛

講師學歷:臺科資工所、逢甲資工系畢業。
技術專長:OSINT、滲透測試、網站開發、專業易懂教育訓練。
證照書籍:OSCP、OSCE³、著《資安這條路:領航新手的 Web Security 指南》。
教學經驗:60+ 企業教學經驗、指導過上百位學員。
教學特色:新手友善、耐心指導、擅長圖解(流程圖、心智圖)引導學習。
社群經驗:目前經營全臺資安社群 CURA,曾任臺科資安社社長、逢甲黑客社社長。
社群交流:LINE 社群《飛飛的資安大圈圈》,即時分享經驗、鼓勵交流。
社群分享:FB 粉專《資安這條路,飛飛來領路》,分享文章與圖卡整理。
個人網站:feifei.tw 分享資安技術文章;pbtw.tw 分享 AI 相關應用;ssdlc.feifei.tw 分享軟體安全開發流程文章。