🐙 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