🐙 Git 與 GitHub CLI
基礎與進階的 Git 指令:版本控制、分支、遠端倉庫、暫存 (stash)、標籤 (tags) 以及 GitHub CLI。
🔹 基礎指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| git add | 將檔案加入暫存區 | |
| git add file.txt | 將特定檔案加入下一次提交 | |
| git add . | 將當前目錄及子目錄中的所有變更加入暫存區 | |
| git add -p | 互動式選擇檔案的部分區塊進行暫存(適合部分提交) | |
| git clone | 將倉庫複製到新目錄 | |
| git clone -b branch_name URL | 僅克隆指定分支(而不是預設分支) | |
| git clone --depth 1 URL | 僅克隆最新提交,建立淺層副本以節省時間與空間 | |
| git commit | 將變更記錄到倉庫 | |
| git commit -m "Initial commit" | 直接附加訊息提交,不開啟編輯器 | |
| git commit -a -m "Fix bugs" | 暫存並提交所有已修改的追蹤檔案,附加訊息 | |
| git commit --amend | 更新上一次提交(修改訊息或包含更多變更) | |
| git commit --fixup abc1234 | 建立修正提交 (fixup),方便在互動式 rebase 時自動合併 | |
| git config | 取得或設定倉庫或全域選項 | |
| git config --global user.name "Name" | 設定全域 Git 使用者名稱 | |
| git config --global user.email "email@example.com" | 設定全域 Git 電子郵件 | |
| git config --list | 列出所有 Git 設定(名稱、郵件、編輯器等) | |
| git diff | 顯示提交之間、提交與工作目錄之間的變更 | |
| git diff HEAD | 顯示自上次提交後的變更(未暫存) | |
| git diff --staged | 顯示將被加入下一次提交的變更 | |
| git diff --word-diff HEAD~1 | 顯示逐字差異的變更 | |
| git grep | 在倉庫檔案內搜尋 | |
| git grep "functionName" | 在所有專案檔案中搜尋  | |
| git grep -n "TODO" | 搜尋包含  | |
| git grep -i "login" | 不分大小寫搜尋  | |
| git init | 建立空的 Git 倉庫或重新初始化現有倉庫 | |
| git init my-project | 在目錄 my-project 初始化新倉庫 | |
| git init --bare | 初始化裸倉庫 | |
| git log | 顯示提交紀錄 | |
| git log --oneline | 以簡潔單行格式顯示提交歷史 | |
| git log --graph --all | 以圖形化方式顯示所有分支的提交 | |
| git log -p --stat | 顯示提交的檔案差異與統計 | |
| git reset | 取消暫存檔案,但保留工作目錄中的變更 | |
| git reset HEAD file.txt | 從暫存區移除檔案(保留修改) | |
| git reset --hard HEAD~1 | 回到前一個提交並刪除所有變更(不可逆!) | |
| git reset --soft HEAD~1 | 撤銷上次提交,但保留變更以便再次提交 | |
| git reset --mixed HEAD~1 | 撤銷提交,但將變更保留在工作目錄中(未暫存) | |
| git show | 顯示各種物件資訊 | |
| git show <commit_hash> | 顯示特定提交的變更與訊息 | |
| git show HEAD~1 | 顯示當前提交之前的一個提交 | |
| git show --stat | 顯示最新提交的檔案變更摘要 | |
| git status | 顯示工作目錄狀態 | |
| git status -s | 以簡短格式顯示狀態 | |
| git status -b | 顯示當前分支與檔案狀態 | 
🌿 分支與合併
| 指令 | 範例 | 說明 | 
|---|---|---|
| git branch | 建立、列出或刪除分支 | |
| git branch new-feature | 建立名為  | |
| git branch -d old-feature | 刪除名為  | |
| git checkout | 切換分支或從其他提交還原檔案 | |
| git checkout main | 切換到  | |
| git checkout -b new-branch | 建立並切換到名為  | |
| git switch | 切換分支( checkout的簡化替代方案) | |
| git switch main | 切換到  | |
| git switch -c feature-x | 建立並切換到名為  | |
| git switch new-feature | 切換到現有的  | |
| git merge | 將其他分支的變更合併到當前分支 | |
| git merge new-feature | 將  | |
| git merge --no-ff new-feature | 總是建立合併提交(即使可快轉合併) | |
| git merge --abort | 若發生衝突,取消合併並還原變更 | |
| git rebase | 將提交移動或重新套用到新的基礎提交 | |
| git rebase main | 將你的分支提交重新套用到  | |
| git rebase -i HEAD~3 | 互動式編輯最近的 3 個提交 | |
| git rebase --abort | 停止並撤銷進行中的 rebase | |
| git rebase -i --autosquash HEAD~5 | 在互動式 rebase 中自動壓縮 (squash) fixup 或 squash 提交 | |
| git cherry-pick | 從其他分支套用特定提交 | |
| git cherry-pick <hash> | 將特定提交(依哈希值)套用到當前分支 | |
| git cherry-pick --continue | 解決衝突後繼續 cherry-pick | |
| git cherry-pick A^..B | 套用從  | 
📡 遠端倉庫
| 指令 | 範例 | 說明 | 
|---|---|---|
| git remote | 管理遠端倉庫的連結(如 GitHub) | |
| git remote -v | 顯示遠端名稱及其 URL | |
| git remote add origin URL | 新增名為  | |
| git pull | 從遠端分支下載並自動合併變更 | |
| git pull origin main | 從遠端  | |
| git pull --rebase origin main | 抓取後將當前分支 rebase 到遠端分支(而不是合併) | |
| git push | 將本地變更推送到遠端倉庫 | |
| git push origin main | 將本地  | |
| git fetch | 從遠端下載變更,但不合併 | |
| git fetch origin | 抓取遠端  | |
| git fetch origin main | 僅抓取遠端的  | |
| git fetch --all | 從所有遠端抓取更新 | |
| git fetch --prune | 清理已刪除的分支 — 移除本地對遠端已刪除分支的引用 | |
| git fetch --dry-run | 僅顯示將要抓取的內容,而不實際下載 | |
| git fetch origin +main | 強制更新本地追蹤分支(如  | 
📦 暫存與清理
| 指令 | 範例 | 說明 | 
|---|---|---|
| git stash | 暫存尚未提交的變更(進行中的工作) | |
| git stash | 暫存修改與已暫存檔案,並將工作目錄還原到最後一次提交 | |
| git stash apply | 重新套用最近一次的暫存(暫存仍保留) | |
| git stash pop | 重新套用並刪除最近一次的暫存 | |
| git stash list | 顯示所有暫存紀錄清單 | |
| git stash branch feature-fix | 建立新分支並套用最近一次的暫存 | |
| git clean | 永久刪除未被 Git 追蹤的檔案 | |
| git clean -f | 刪除當前目錄中的未追蹤檔案 | |
| git clean -fd | 刪除未追蹤的檔案與資料夾 | |
| git clean -n | 預覽將被刪除的內容(安全 dry run) | 
🏷️ 標籤
| 指令 | 範例 | 說明 | 
|---|---|---|
| git tag | 建立、列出或刪除標籤,用於標記歷史中特定點(如發佈版本) | |
| git tag -a v1.0 -m "Version 1.0" | 建立名為  | |
| git tag -d v1.0 | 刪除名為  | |
| git push | 將提交、分支與標籤從本地推送到遠端倉庫 | |
| git push origin --tags | 推送所有本地標籤到遠端(適合一次標記多個版本後) | |
| git push origin v1.0 | 推送特定標籤(如  | |
| git push origin :refs/tags/v1.0 | 刪除遠端的  | 
🛠️ 衝突解決
| 指令 | 範例 | 說明 | 
|---|---|---|
| git mergetool | 開啟視覺化工具以協助解決合併衝突 | |
| git mergetool --tool=meld | 使用特定合併工具(如 Meld)解決衝突 | |
| git rerere | 讓 Git 記住你之前如何解決衝突 | |
| git config --global rerere.enabled true | 啟用自動重用先前的衝突解決方式 | |
| git rerere status | 顯示哪些檔案已保存衝突解決紀錄 | |
| git rerere diff | 顯示 Git 為未來重用所保存的變更 | 
⚙️ 進階指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| git bisect | 使用二分搜尋找出引入錯誤的提交 | |
| git bisect start | 在已知正常與錯誤的提交之間開始二分搜尋 | |
| git bisect bad | 標記當前提交為「壞的」(包含錯誤) | |
| git bisect good <commit> | 標記一個已知「好的」提交(錯誤不存在) | |
| git blame | 顯示檔案中每一行最後修改者及提交資訊 | |
| git blame file.txt | 顯示檔案每行的作者與提交資訊 | |
| git blame -L 10,20 file.txt | 僅顯示第 10 至 20 行的責任資訊 | |
| git blame --show-email file.txt | 顯示作者的電子郵件與變更紀錄 | |
| git reflog | 檢視與管理分支與 HEAD 的參考日誌 (reflog) | |
| git reflog show main@{1.week.ago} | 查看  | |
| git reflog expire --expire=30.days --dry-run | 預覽哪些超過 30 天的 reflog 條目可以清理(不做變更) | |
| git reflog delete HEAD@{2} | 刪除特定的 reflog 條目(謹慎操作,可能影響恢復) | |
| git submodule | 新增、初始化、更新或檢視子模組(倉庫中的倉庫) | |
| git submodule add URL path | 將外部倉庫新增為子模組到指定路徑 | |
| git submodule update --init | 初始化並下載倉庫中列出的所有子模組 | |
| git submodule foreach git pull | 在每個子模組內執行  | |
| git submodule sync --recursive | 在  | |
| git submodule update --remote --merge | 將子模組更新至遠端分支的最新提交 | |
| git archive | 從特定提交或分支建立檔案封存(zip、tar 等) | |
| git archive --format=zip HEAD > archive.zip | 將 HEAD 的專案檔案建立為 ZIP 封存 | |
| git archive -o release.tar.gz HEAD | 從當前 HEAD 建立壓縮  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | 建立  | |
| git gc | 清理不必要的檔案並優化倉庫效能 | |
| git gc --aggressive | 執行完整清理與最佳化(可能較慢但效果好) | |
| git gc --prune=now | 立即移除所有不可達物件(若不確定,操作有風險) | |
| git shortlog | 快速總結作者與其提交數量 | |
| git shortlog -e | 列出作者與其電子郵件(分析貢獻者與貢獻量) | |
| git shortlog -s -n | 顯示每位作者的提交數量,並依提交數排序 | |
| git shortlog -sne | 同上,但包含姓名與電子郵件 — 適合詳細追蹤活動 | |
| git revert | 建立新提交以撤銷先前提交的變更,而不重寫歷史 | |
| git revert HEAD | 建立新提交以撤銷上一次提交的變更 | |
| git revert <commit_hash> | 依哈希值撤銷特定提交,安全地新增一個反向提交 | 
🐙 GitHub CLI
gh讓你能從終端機管理 GitHub。
| 指令 | 範例 | 說明 | 
|---|---|---|
| gh auth login | 在 GitHub 主機上進行身份驗證,以允許 CLI 指令與你的帳號互動 | |
| gh auth login --with-token < mytoken.txt | 使用存放於檔案 ( | |
| gh auth login --hostname enterprise.internal | 驗證到 GitHub Enterprise 伺服器(不是 github.com) | |
| gh repo clone | 將 GitHub 儲存庫複製到本機 | |
| gh repo clone user/repo | 將使用者  | |
| gh repo clone cli/cli -- --depth=1 | 僅下載最新一次提交以建立更快更小的複製 | |
| gh repo clone cli/cli workspace/cli | 將儲存庫複製到自訂資料夾  | |
| gh issue list | 列出 GitHub 儲存庫中的問題 (issues),可依多種條件過濾 | |
| gh issue list --assignee "@me" | 列出分配給你的問題 | |
| gh issue list --state all | 列出所有問題,無論開啟或關閉 | |
| gh issue list --search "error no:assignee sort:created-asc" | 列出符合 “error” 的問題,未分配,並依建立時間升冪排序 | |
| gh pr create | 透過 CLI 在 GitHub 建立 Pull Request | |
| gh pr create --title "..." | 以指定標題建立 Pull Request | |
| gh pr create --project "Roadmap" | 將 Pull Request 連結到名為 “Roadmap” 的 GitHub 專案 | |
| gh pr create --base develop --head monalisa:feature | 從 fork  | |
| gh repo create | 透過 CLI 建立新的 GitHub 儲存庫 | |
| gh repo create my-project | 在 GitHub 上建立名為  | |
| gh repo create my-project --public --clone | 建立公開儲存庫並在本地複製 | |
| gh repo create my-project --private --source=. --remote=upstream | 從目前資料夾建立私有遠端儲存庫,並新增名為  | 
💡 Git 別名(實用捷徑)
設定方便的別名以加快常用 Git 指令:
git config --global alias.br branch                                       # 快捷方式:git branch
git config --global alias.ci commit                                       # 快捷方式:git commit
git config --global alias.co checkout                                     # 快捷方式:git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # 美觀的歷史圖表
git config --global alias.last "log -1 HEAD"                              # 顯示最後一次提交
git config --global alias.st status                                       # 快捷方式:git status🚀 專業進階 Git 指令
| 指令 | 範例 | 說明 | 
|---|---|---|
| git filter-repo | 一個強大且高效的工具,用於重寫 Git 歷史以移除或修改檔案、作者或路徑;取代 git filter-branch,具更佳效能與安全性 | |
| git filter-repo --path secret.txt --invert-paths | 高效地重寫儲存庫歷史以移除敏感檔案或目錄,而不會遇到  | |
| git filter-repo --replace-text replacements.txt | 批次替換整個歷史中的字串或模式(例如清理憑證) | |
| git filter-repo --subdirectory-filter src | 將子目錄歷史提取為新的儲存庫,並保留提交中繼資料 | |
| git worktree | 管理多個連結到同一儲存庫的工作目錄,允許在不同分支上同時工作而不需額外複製 | |
| git worktree add ../feature feature-branch | 建立一個附加到相同儲存庫的額外工作目錄,允許平行檢出分支 | |
| git worktree list | 列出所有使用中的工作目錄、其路徑與相關分支 | |
| git worktree remove ../feature | 移除不再需要的工作目錄並安全清理 | |
| git replace | 建立暫時性引用以取代現有物件,允許非破壞性的本地歷史操作與測試 | |
| git replace <old_commit> <new_commit> | 在本地儲存庫中暫時交換提交,適合測試或修補歷史而不重寫 | |
| git replace --list | 顯示所有作用中的替代引用 | |
| git replace -d <replace_ref> | 刪除特定替代引用以恢復原狀 | |
| git stash | 暫存未提交的變更至堆疊,允許在未完成工作時切換上下文 | |
| git stash push -p | 互動式選擇要暫存的變更區塊,提供細緻控制 | |
| git stash push -m "WIP selective stash" | 建立帶有自訂訊息的 stash,方便識別 | |
| git stash apply stash@{2} | 套用 stash 清單中的特定暫存,但不刪除它 | |
| git rebase | 將提交重新套用到新的基底上,使專案歷史更清晰、線性,並支援互動式編輯 | |
| git rebase --interactive --autosquash | 啟動互動式 rebase,自動重新排序與壓縮 fixup/squash 提交,清理歷史 | |
| git rebase -i --autosquash HEAD~10 | 自動重新排序並壓縮 fixup/squash 提交,在推送前整理提交歷史 | |
| git commit --fixup <commit> | 建立 fixup 提交,在互動式 rebase 時會自動合併 | |
| git commit --squash <commit> | 建立 squash 提交,在 rebase 時合併到指定提交 | |
| git bisect | 使用二分搜尋高效識別引入錯誤的提交,透過測試逐步縮小範圍 | |
| git bisect run | 自動化二分搜尋流程,於每個提交執行測試腳本,以快速找出問題提交 | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | 自動於每個提交執行測試腳本,大幅加快錯誤定位 | |
| git bisect visualize | 開啟圖形化工具以視覺化二分搜尋過程 | |
| git bisect reset | 退出二分搜尋模式並回到原本的 HEAD | |
| git commit | 以詳細選項記錄變更:修正、簽署、fixup 與訊息自訂,維持高品質歷史 | |
| git commit --gpg-sign | 建立使用 GPG 金鑰簽署的提交,以確保加密驗證提交的真實性與作者 | |
| git commit -S -m "Signed commit" | 以 GPG 金鑰加密簽署提交,確保完整性與作者驗證 | |
| git config --global user.signingkey <key_id> | 全域設定用於簽署提交的 GPG 金鑰 | |
| git log --show-signature | 驗證並顯示提交的 GPG 簽署資訊 | |
| git reflog | 保存 HEAD 與分支更新的日誌,對恢復遺失提交與理解本地歷史變更至關重要 | |
| git reset --hard HEAD@{3} | 將目前分支重設到之前的狀態,以恢復或撤銷變更 | |
| git reflog expire --expire=now --all | 立即清除所有 reflog 紀錄,清理歷史(請謹慎使用) | 
🧰 專業工作流程技巧與自動化
| 主題 | 指令 / 範例 | 解釋與專業提示 | 
|---|---|---|
| 強力倉庫清理 | git gc --aggressive --prune=now | 進行深度垃圾回收並立即修剪不可達物件以最佳化儲存庫。適合維護時段使用 | 
| 平行分支工作目錄 | git worktree add ../feature-branch feature | 保留多個工作目錄以同時開發功能,避免額外複製成本 | 
| 乾淨線性歷史 | git rebase -i --autosquash | 在推送前使用互動式 rebase 與 autosquash 來保持歷史清晰易讀 | 
| 安全提交 | git commit -S | 使用 GPG 簽署提交以增強共享儲存庫的可信度,許多企業環境中為必須 | 
| 自動化二分搜尋 | git bisect run ./test-script.sh | 在二分搜尋過程中,自動對候選提交執行測試腳本以定位錯誤 | 
| 衝突解決快取 | git config --global rerere.enabled true | 啟用重用衝突解決,加速跨 rebase 或合併時重複衝突的處理 | 
| 共享別名與掛鉤 | 將常用的 Git 別名與提交掛鉤儲存在共享倉庫或 CI pipeline 中,以強制團隊標準並提升效率 | 
額外資源
🧠 提示
不必死記所有內容。使用 --help、多加探索並經常練習:
git help <command>
git status🌐 實用連結
📘 Git 官方文件 — 所有 Git 指令的詳細手冊:
https://git-scm.com/docs
📙 Learn Git Branching — 互動式視覺教學,掌握分支概念:
https://learngitbranching.js.org
📕 Pro Git 書籍(免費,由 Scott Chacon 與 Ben Straub 撰寫):
https://git-scm.com/book
📗 Git 小抄(官方簡明參考):
https://education.github.com/git-cheat-sheet-education.pdf