🐙 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