Git 命令速查
最全 Git 命令參考手冊,按分類整理,快速查找
基礎命令(13)
在當前目錄建立新的 Git 存放庫
複製遠端存放庫到本地
淺複製,只獲取最近一次提交
將檔案加入到暫存區
加入所有修改到暫存區
提交暫存區的更改
修改上一次提交
查看存放庫當前狀態
查看未暫存的更改
查看已暫存的更改
查看所有配置
設定全域使用者名稱
設定全域郵箱
分支管理(14)
列出所有本地分支
列出所有分支(含遠端)
建立新分支
刪除分支
重命名分支
切換分支
建立並切換到新分支
切換分支(Git 2.23+)
建立並切換到新分支(Git 2.23+)
合併指定分支到當前分支
合併分支並建立合併提交
變基當前分支到指定分支
解決衝突後繼續變基
選擇特定提交合併到當前分支
遠端操作(10)
查看遠端存放庫資訊
加入遠端存放庫
獲取遠端存放庫最新內容
獲取所有遠端存放庫更新
拉取併合並遠端分支
拉取並變基
推送到遠端存放庫
強制推送(謹慎使用)
推送並設定上游分支
刪除遠端分支
撤銷修改(8)
取消暫存檔案
撤銷最近一次提交,保留更改
撤銷提交和暫存,保留工作區
撤銷提交併丟棄所有更改
撤銷指定提交(建立新提交)
恢復工作區檔案(Git 2.23+)
取消暫存檔案(Git 2.23+)
刪除未追蹤的檔案和目錄
標籤管理(6)
列出所有標籤
建立輕量標籤
建立附註標籤
刪除本地標籤
推送標籤到遠端
推送所有標籤到遠端
歷史查看(7)
查看提交歷史
簡潔顯示提交歷史
圖形化顯示所有分支歷史
顯示提交詳情
查看檔案每行的修改歷史
查看所有操作歷史
開始二分查找問題提交
儲藏(7)
儲藏當前更改
帶消息儲藏更改
查看所有儲藏
應用並刪除最近的儲藏
應用最近的儲藏但不刪除
刪除最近的儲藏
刪除所有儲藏
什麼是 Git?
Git 速查表是依任務情境整理的版本控制命令參考,用來在忘記具體寫法時快速查找。Git 本身是分散式版本控制系統:每個 clone 都包含專案歷史,分支是輕量指標,commit 記錄了程式碼庫隨時間發生的變化。速查表適合在你記得要做什麼、但想不起完整命令時使用,例如查看暫存差異、建立分支、撤銷提交、暫存工作、打標籤發布、同步遠端存放庫等。它是參考資料,不取代對存放庫狀態的判斷。reset --hard、clean -fd、rebase、force push 等破壞性或高風險命令,複製前必須確認未提交改動、目前分支與對遠端協作的影響。
使用說明
快速上手
- 點選任一指令卡即可複製指令
- 使用搜尋框快速找到特定指令
- 點選分類標籤依類型篩選
- 將滑鼠移至指令上可查看詳細說明
功能特色
進階技巧
- 使用 git restore --staged 將檔案取消暫存
- 使用 git commit --amend 修改最近一次 commit
- 使用 git stash 暫存目前的工作進度
- 使用 git revert 還原已推送的 commit
使用場景
技術原理
本機變更流經三個區域:工作目錄、索引(也稱為暫存區,儲存在 .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)推送,避免覆蓋掉隊友的更新。