前言
在資安領域工作,你會經常接觸到各種工具、腳本和專案原始碼。無論是下載滲透測試工具、管理自己的漏洞研究程式碼,還是與團隊協作開發安全工具,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(分支)
分支讓你可以在不影響主線的情況下進行開發。預設的主分支通常叫做 main 或 master。你可以從主分支建立新分支,在新分支上自由實驗,完成後再合併回主分支。
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 管理你自己的筆記和腳本。實踐出真知,祝你學習順利!
