🐙 Git 與 GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
發佈

2025年8月31日

基本與進階 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"

尋找專案檔案中所有 functionName 的出現位置

git grep -n "TODO"

尋找包含 TODO 的行並顯示行號(適用於代碼註解搜尋)

git grep -i "login"

不區分大小寫搜尋 login(匹配 LoginLOGINlogin 等)

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

建立新分支 new-feature

git branch -d old-feature

刪除本地分支 old-feature

git checkout 切換分支或從另一提交還原檔案
git checkout main

切換到 main 分支

git checkout -b new-branch

建立並切換到新分支 new-branch

git switch 切換分支(checkout 的簡化替代方案)
git switch main

切換到 main 分支

git switch -c feature-x

建立並切換到新分支 feature-x

git switch new-feature

切換到現有分支 new-feature

git merge 將另一分支的變更合併到當前分支
git merge new-feature

合併 new-feature 分支到當前分支

git merge --no-ff new-feature

總是建立合併提交(即使可快轉)

git merge --abort

若發生衝突,取消合併並還原變更

git rebase 將提交移動或重新套用到新基底提交
git rebase main

將分支提交套用到 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

套用從 A(不含)到 B(含)的提交範圍

📡 遠端倉庫

指令

範例

說明

git remote 管理遠端倉庫的連結(如 GitHub)
git remote -v

顯示遠端名稱與其 URL

git remote add origin URL

新增名為 origin 的遠端倉庫

git pull 下載並自動合併遠端分支的變更
git pull origin main

從遠端 main 分支抓取並合併到當前分支

git pull --rebase origin main

抓取並將當前分支 rebase 到遠端分支之上,而不是合併

git push 將本地變更上傳到遠端倉庫
git push origin main

推送本地 main 分支到遠端 origin

git fetch 下載遠端變更但不合併
git fetch origin

從遠端 origin 抓取所有更新,但不應用

git fetch origin main

僅抓取遠端 main 分支

git fetch --all

抓取所有遠端的更新

git fetch --prune

清理已刪除分支 —— 移除本地對應的遠端分支引用

git fetch --dry-run

僅顯示將要抓取的內容,不實際下載

git fetch origin +main

強制更新本地追蹤分支 (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"

建立帶訊息的註解標籤 v1.0(保存為完整 Git 物件,適用於版本發佈)

git tag -d v1.0

刪除本地標籤 v1.0(不影響遠端)

git push 將提交、分支與標籤從本地推送到遠端倉庫
git push origin --tags

推送所有本地標籤到遠端(適用於標記多個版本後)

git push origin v1.0

推送指定標籤(如 v1.0)到遠端

git push origin :refs/tags/v1.0

刪除遠端標籤 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}

查看 main 分支一週前的指向位置

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 pull 更新至最新提交

git submodule sync --recursive

.gitmodules 檔案變更後同步子模組 URL

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 的壓縮 .tar.gz

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

建立一個 .tar.gz 包,並將所有檔案放在 project/ 資料夾內

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

使用儲存在檔案 (mytoken.txt) 中的個人存取權杖進行驗證

gh auth login --hostname enterprise.internal

驗證到 GitHub Enterprise 伺服器(而非 github.com)

gh repo clone 將 GitHub 倉庫複製到本機
gh repo clone user/repo

user 擁有的 repo 倉庫克隆到名為 repo 的資料夾

gh repo clone cli/cli -- --depth=1

僅下載最新提交以加快速度並縮小克隆體積

gh repo clone cli/cli workspace/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 monalisafeature 分支建立 PR,合併到 develop 分支

gh repo create 透過 CLI 建立新的 GitHub 倉庫
gh repo create my-project

在 GitHub 上建立名為 my-project 的新倉庫(隨後互動提示)

gh repo create my-project --public --clone

建立公開倉庫並克隆到本機

gh repo create my-project --private --source=. --remote=upstream

從當前資料夾建立私人遠端倉庫,並新增名為 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-branch 的效能問題。請謹慎使用

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