ToolAct工具行動

Git 命令速查

最全 Git 命令參考手冊,按分類整理,快速查找

全部: 65 个命令

基礎命令(13)

git init

在當前目錄建立新的 Git 存放庫

git clone <url>

複製遠端存放庫到本地

git clone --depth=1 <url>

淺複製,只獲取最近一次提交

git add <file>

將檔案加入到暫存區

git add .

加入所有修改到暫存區

git commit -m "message"

提交暫存區的更改

git commit --amend

修改上一次提交

git status

查看存放庫當前狀態

git diff

查看未暫存的更改

git diff --staged

查看已暫存的更改

git config --list

查看所有配置

git config --global user.name "name"

設定全域使用者名稱

git config --global user.email "email"

設定全域郵箱

分支管理(14)

git branch

列出所有本地分支

git branch -a

列出所有分支(含遠端)

git branch <name>

建立新分支

git branch -d <name>

刪除分支

git branch -m <old> <new>

重命名分支

git checkout <branch>

切換分支

git checkout -b <branch>

建立並切換到新分支

git switch <branch>

切換分支(Git 2.23+)

git switch -c <branch>

建立並切換到新分支(Git 2.23+)

git merge <branch>

合併指定分支到當前分支

git merge --no-ff <branch>

合併分支並建立合併提交

git rebase <branch>

變基當前分支到指定分支

git rebase --continue

解決衝突後繼續變基

git cherry-pick <commit>

選擇特定提交合併到當前分支

遠端操作(10)

git remote -v

查看遠端存放庫資訊

git remote add <name> <url>

加入遠端存放庫

git fetch <remote>

獲取遠端存放庫最新內容

git fetch --all

獲取所有遠端存放庫更新

git pull <remote> <branch>

拉取併合並遠端分支

git pull --rebase

拉取並變基

git push <remote> <branch>

推送到遠端存放庫

git push -f

強制推送(謹慎使用)

git push -u origin <branch>

推送並設定上游分支

git push origin --delete <branch>

刪除遠端分支

撤銷修改(8)

git reset <file>

取消暫存檔案

git reset --soft HEAD~1

撤銷最近一次提交,保留更改

git reset --mixed HEAD~1

撤銷提交和暫存,保留工作區

git reset --hard HEAD~1

撤銷提交併丟棄所有更改

git revert <commit>

撤銷指定提交(建立新提交)

git restore <file>

恢復工作區檔案(Git 2.23+)

git restore --staged <file>

取消暫存檔案(Git 2.23+)

git clean -fd

刪除未追蹤的檔案和目錄

標籤管理(6)

git tag

列出所有標籤

git tag <name>

建立輕量標籤

git tag -a <name> -m "msg"

建立附註標籤

git tag -d <name>

刪除本地標籤

git push origin <tag>

推送標籤到遠端

git push --tags

推送所有標籤到遠端

歷史查看(7)

git log

查看提交歷史

git log --oneline

簡潔顯示提交歷史

git log --oneline --graph --all

圖形化顯示所有分支歷史

git show <commit>

顯示提交詳情

git blame <file>

查看檔案每行的修改歷史

git reflog

查看所有操作歷史

git bisect start

開始二分查找問題提交

儲藏(7)

git stash

儲藏當前更改

git stash save "message"

帶消息儲藏更改

git stash list

查看所有儲藏

git stash pop

應用並刪除最近的儲藏

git stash apply

應用最近的儲藏但不刪除

git stash drop

刪除最近的儲藏

git stash clear

刪除所有儲藏

什麼是 Git?

Git 速查表是依任務情境整理的版本控制命令參考,用來在忘記具體寫法時快速查找。Git 本身是分散式版本控制系統:每個 clone 都包含專案歷史,分支是輕量指標,commit 記錄了程式碼庫隨時間發生的變化。速查表適合在你記得要做什麼、但想不起完整命令時使用,例如查看暫存差異、建立分支、撤銷提交、暫存工作、打標籤發布、同步遠端存放庫等。它是參考資料,不取代對存放庫狀態的判斷。reset --hard、clean -fd、rebase、force push 等破壞性或高風險命令,複製前必須確認未提交改動、目前分支與對遠端協作的影響。

使用說明

快速上手

  1. 點選任一指令卡即可複製指令
  2. 使用搜尋框快速找到特定指令
  3. 點選分類標籤依類型篩選
  4. 將滑鼠移至指令上可查看詳細說明

功能特色

依情境分類指令依基本、分支、遠端、復原、標籤、歷史與暫存分類,無須捲動整份清單即可快速查找。
搜尋與篩選結合搜尋框與分類按鈕快速縮小範圍,只記得部分指令或說明時特別實用。
點選複製點選指令卡即可複製,再依需求替換分支名稱、檔案路徑或 commit hash。
風險提醒執行 undo、reset、force push 等指令前,請先確認影響範圍,避免誤刪本機修改或覆蓋共用歷史。

進階技巧

  • 使用 git restore --staged 將檔案取消暫存
  • 使用 git commit --amend 修改最近一次 commit
  • 使用 git stash 暫存目前的工作進度
  • 使用 git revert 還原已推送的 commit

使用場景

在工作中快速找到需要的命令分類透過搜尋或篩選,按基本操作、分支、遠端、撤銷、標籤、歷史和儲藏分類查找 Git 命令,讓正確的語法一目了然,無需掃讀長篇文章或重新開啟教學分頁。每張卡片已附帶命令旁的簡短說明,適合在你記得要做什麼但想不起具體選項時使用,例如 --force-with-lease 和 --force 的差異,或 git restore 和 git reset 之間的 diff。
複製帶有佔位符的命令對 git checkout -b <branch>、git push -u origin <branch>、git log --oneline --graph --all 或 git restore --staged <file> 等命令使用一鍵複製,然後在終端機中替換佔位符。由於參考資料在瀏覽器中運行,不會將任何提交資料或分支名稱傳送到外部,因此在旁邊使用真實的 hash、內部分支前綴或尚未推送的功能分支名稱時是安全的。
使用前先檢視高風險命令撤銷區段集中了 reset、clean、restore 和 force push 相關的工作流程,破壞性意圖一目了然。在執行 git reset --hard HEAD~3 或 git push --force 之前,先用 git status 確認當前分支,用 git rev-parse --abbrev-ref --symbolic-full-name @{u} 確認遠端追蹤狀態,因為改寫共用歷史是隊友無法幫你復原的。
將分支、標籤和儲藏的片段存為範本像 'git switch -c feature/x'、'git tag -a v1.2 -m' 和 'git stash push -m' 這類命令會在各專案中按團隊的分支或發布慣例反覆使用。複製一次到團隊的入職文件、操作手冊或 pre-commit hook 設定中,並在 Git 行為變更時重新檢視——例如當專案要求在受保護分支上使用 --force-with-lease 而非單純的 --force 時。
用歷史命令讀取存放庫而非改寫它在開啟 rebase 或 revert 之前,先執行 'git log --oneline --graph --all'、'git blame -L' 和 'git diff <branch>...' 來了解誰改了什麼。先讀取的代價遠低於從搞砸的歷史改寫中恢復,特別是在 monorepo 中,跨功能分支的 rebase 可能使數十個進行中的 pull request 失效。

技術原理

Git 將每個專案狀態儲存為 .git/objects 內的定址物件圖,地址是 40 字元的 SHA-1 雜湊值(SHA-256 自 Git 2.29 的實驗性物件格式起可選啟用)。有四種物件類型:blob 儲存原始檔案位元組,tree 將名稱對應到 blob 和子樹,commit 指向一棵 tree 加上父提交和作者元資料,tag 則是以上任一物件的簽名指標。refs/heads/、refs/remotes/ 和 refs/tags/ 下的分支和標籤只是包含 SHA 的純文字檔案,HEAD 是指向當前分支的符號引用。

本機變更流經三個區域:工作目錄、索引(也稱為暫存區,儲存在 .git/index)和物件資料庫。git add 將 blob 雜湊記錄到索引,git commit 將索引凍結為新的 tree 加 commit 物件,git checkout/switch 則將索引和工作樹更新到目標提交。合併分為兩類:fast-forward 在目標是直接後代時直接前進分支指標,而三方合併(recursive 或 ort 策略)計算共同祖先並建立具有兩個父提交的合併提交。git rebase 透過將提交逐一重放到新基底上來改寫歷史,產生新的 SHA。

遠端同步透過 HTTPS 智慧協議、SSH 或已棄用的 git:// 協議運行,交換由 delta 壓縮產生的 pack 檔案。fetch 後,Git 將快照儲存在 refs/remotes/origin/* 下,.git/logs/ 下的 reflog 預設保留 90 天的撤銷軌跡(gc.reflogExpire),因此即使 reset --hard 或搞砸的 rebase 也能在垃圾回收修剪不可達物件之前恢復。
  • 物件模型:blob、tree、commit、tag——以 SHA-1(或自 2.29 起的 SHA-256)定址,以散列形式儲存在 .git/objects/xx/ 或打包在 .git/objects/pack/*.pack 中
  • 索引/暫存區:.git/index 是將路徑對應到 blob 雜湊 + stat 資訊的二進位檔案;git add 更新它,git commit 將其凍結為 tree
  • Refs 與 HEAD:refs/heads/<branch>、refs/remotes/<remote>/<branch>、refs/tags/<tag> 是包含 SHA 的純文字檔案;HEAD 是指向當前分支的符號引用
  • 合併策略:目標是後代時使用 fast-forward,否則使用三方 recursive/ort 合併,基於合併基底;--no-ff 強制產生合併提交
  • Rebase 改寫:git rebase 將提交重放到新基底上產生新的 SHA,若已推送則會破壞共用歷史——因此 --force-with-lease 優於 --force
  • Reflog 恢復:.git/logs/HEAD 和各 ref 的日誌保留 ref 移動記錄 90 天(gc.reflogExpire);git reflog 搭配 git reset 可在破壞性操作後恢復
  • 傳輸:智慧 HTTPS、SSH 或 git:// 透過 upload-pack/receive-pack 協議協商 pack 檔案;淺複製使用 --depth 限制歷史

範例

建立並切換到新分支

git checkout -b feature/login  # 建立並切換到新分支

撤銷工作目錄的修改

git restore filename  # 將檔案還原至最後一次提交的狀態

查看提交歷史

git log --oneline --graph --all  # 以圖形方式顯示所有分支歷史

常見問題

如何撤銷最近一次的 commit?

git reset --soft HEAD~1 會保留變更於暫存區,方便你重新提交;git reset --mixed HEAD~1 會把變更留在工作目錄但取消暫存;git reset --hard HEAD~1 則會直接捨棄變更。如果該 commit 已經推送出去,請改用 git revert HEAD,它會新建一個反向的 commit,不會改寫歷史。

git pull 與 git fetch 有什麼差別?

git fetch 只會把遠端的 commit 下載到本地的 ref,不會動到你目前的工作分支。git pull 等同於 git fetch 後再執行 git merge(若設定 --rebase 則為 git rebase)。當你想先檢視上游變更再決定是否合併時,使用 fetch 比較安全。

如何丟棄某個檔案的本地變更?

git restore <file> 會丟棄工作目錄中尚未提交的修改;git restore --staged <file> 會把檔案從暫存區取消但保留內容;git checkout HEAD -- <file> 會還原到最後一次 commit 的版本。對未追蹤檔案請使用 git clean -f 或 -fd(連目錄一起清除)。

什麼時候用 rebase,什麼時候用 merge?

若想在合併回主線前讓私人功能分支保持線性歷史,使用 rebase。若是整合共用分支且需要保留實際開發歷史,使用 merge。除非團隊有共識,千萬不要對已推送至共用分支的 commit 做 rebase——它會改寫 SHA,並破壞其他人的本地副本。

如何查看即將被推送的內容?

git log @{u}.. 會列出本地分支上、上游沒有的 commit;git diff @{u} 會顯示合併後的差異;fetch 之後執行 git status 與 origin 比對,可看到領先 / 落後幾個 commit。

如何救回被刪除的分支或遺失的 commit?

git reflog 會列出 HEAD 到過的每個位置;找到遺失 commit 的 SHA,再執行 git checkout <sha> 或 git branch <name> <sha>。reflog 紀錄預設約保留 90 天才會被垃圾回收,所以發現失誤後請盡快處理。

修改 commit 最安全的方式是什麼?

git commit --amend 可以修改最近一次 commit 的訊息或補上漏加的檔案。它會改寫 SHA,所以只能用於尚未推送的本地 commit。如果不得不修改已推送的 commit,請使用 --force-with-lease(而非 --force)推送,避免覆蓋掉隊友的更新。