🐙 Git 與 GitHub CLI
基本與進階 Git 指令,用於版本控制、分支、遠端倉庫、暫存、標籤與 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 | 建立修正提交,稍後於互動式 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 時自動壓縮 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 | 預覽將被刪除的內容(安全模式) | 
🏷️ 標籤
| 指令 | 範例 | 說明 | 
|---|---|---|
| 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 | 使用二分搜尋找出引入 bug 的提交 | |
| git bisect start | 在已知正常與錯誤提交之間開始二分搜尋 | |
| git bisect bad | 標記當前提交為 “bad”(包含 bug) | |
| git bisect good <commit> | 標記已知 “good” 的提交(bug 不存在) | |
| 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 天前的引用日誌條目可清理(不實際刪除) | |
| git reflog delete HEAD@{2} | 刪除指定引用日誌條目(小心使用,可能影響恢復) | |
| 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 倉庫中的 Issue,可依多種條件過濾 | |
| gh issue list --assignee "@me" | 列出指派給你的 Issue | |
| gh issue list --state all | 列出所有 Issue,不論開啟或關閉 | |
| gh issue list --search "error no:assignee sort:created-asc" | 列出匹配 “error” 的 Issue,未分配,並按建立時間升序排序 | |
| 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 | 列出所有有效的 worktree、其路徑與對應分支 | |
| git worktree remove ../feature | 移除不再需要的 worktree,安全清理工作目錄 | |
| 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 | 二分搜尋工具,高效定位引入 bug 的提交,逐步縮小錯誤範圍 | |
| git bisect run | 自動在每個提交上執行測試腳本,快速識別引入 bug 的提交 | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | 透過測試腳本自動進行 bisect,加速找出問題提交 | |
| git bisect visualize | 開啟圖形化工具以視覺化 bisection 過程 | |
| git bisect reset | 退出 bisect 模式並返回原始 HEAD | |
| git commit | 以詳細選項記錄變更:修訂、簽名、修正與訊息自訂,保持高品質歷史 | |
| 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} | 將當前分支重置到 reflog 中的先前狀態,以恢復或撤銷變更 | |
| git reflog expire --expire=now --all | 立即過期所有 reflog 條目以清理歷史(謹慎使用) | 
🧰 專業工作流程技巧與自動化
| 主題 | 指令 / 範例 | 解釋與專業技巧 | 
|---|---|---|
| 強力倉庫清理 | git gc --aggressive --prune=now | 執行深度垃圾回收並立即刪除不可達物件以最佳化倉庫。建議在維護時間使用 | 
| 平行分支工作目錄 | git worktree add ../feature-branch feature | 保持多個工作目錄以同時開發功能,避免重複克隆的負擔 | 
| 乾淨線性歷史 | git rebase -i --autosquash | 推送前互動式 rebase 並自動壓縮提交,保持歷史清晰易讀 | 
| 安全提交 | git commit -S | 使用 GPG 簽署提交以提升可信度,在企業環境中常為強制要求 | 
| 自動化 Bisect | git bisect run ./test-script.sh | 在 bisect 過程中對每個候選提交執行測試腳本,自動化尋找 bug | 
| 衝突解決快取 | git config --global rerere.enabled true | 啟用衝突解決重用,加快重複 rebase 或合併時的處理速度 | 
| 共享別名與 Hook | 將常用 Git 別名與提交 hook 儲存在共享倉庫或 CI pipeline 中,以強制團隊標準並提升效率 | 
額外資源
🧠 小技巧
不要嘗試死記所有內容。使用 --help、探索並定期練習:
git help <command>
git status🌐 有用連結
📘 官方 Git 文件 — 詳細手冊,涵蓋所有 Git 指令:
https://git-scm.com/docs
📙 學習 Git 分支 — 互動式視覺化教學,掌握分支概念:
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