🐙 Git 與 GitHub CLI

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

2025年8月31日

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

在所有專案檔案中搜尋 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 中自動壓縮 (squash) 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

預覽將被刪除的內容(安全 dry run)

🏷️ 標籤

指令

範例

說明

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 使用二分搜尋找出引入錯誤的提交
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}

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

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 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 的資料夾

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

僅下載最新一次提交以建立更快更小的複製

gh repo clone cli/cli workspace/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 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

列出所有使用中的工作目錄、其路徑與相關分支

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