只會用 2005 年的 Git 老命令?這七個 Git 新命令,很實用!
自 Git 在 2005 年誕生以來,諸如 clone、pull、push、merge、checkout 和 commit 等核心命令便已存在,支撐著日常的開發工作。隨著版本控制需求的演變,Git 持續迭代更新,引入了諸多增強功能和新命令。本文將聚焦于近年來新增的七個 Git 命令,探索它們如何進一步提升工作效率!
git switch:安全切換分支
git switch 命令是在 Git 2.23.0 版本中引入的,以解決 git checkout 命令職責過重的問題,并使得 Git 的命令更加直觀和易于理解。
在 Git 2.23 之前,git checkout 既用于切換分支,也用于還原文件內容,很容易引起混淆。通過將 git checkout 的功能拆分,Git 團隊創建了兩個新的、更專業的命令:
- git switch:專門用于在分支之間進行切換。
- git restore:專門用于還原文件內容。
使用 git switch 切換分支非常簡單,以下是基本用法:
# 切換到已存在的分支
$ git switch <branch-name>
# 創建并切換到新分支
$ git switch -c <new-branch-name>
# 從遠程倉庫創建并跟蹤一個本地分支
$ git switch -c <new-branch-name> --track <remote>/<branch-name>
# 返回到上一個分支
$ git switch -
注意:如果遇到錯誤信息 'switch' is not a git command,那么可能是因為 Git 版本低于 2.23.0。可以通過運行 git --version 來檢查 Git 版本,并升級到最新版本以使用這些新特性。
git restore:安全撤銷更改
git restore 命令同樣是在 Git 2.23.0 版本中引入的,專門用于恢復工作目錄中的文件內容。
git restore 主要用來撤銷工作目錄中的更改,可以用來丟棄未提交的工作樹修改、還原刪除的文件,或者將文件重置為之前的某個提交狀態。以下是 git restore 的基本用法:
# 恢復工作目錄中的文件到最近一次提交的狀態
$ git restore <file>
# 從指定的提交中恢復文件到工作目錄
$ git restore --source=<commit> <file>
# 取消暫存區的更改(類似于 git reset HEAD <file>)
$ git restore --staged <file>
# 恢復所有文件到指定的提交狀態
$ git restore --source=<commit> .
# 恢復所有已刪除的文件
$ git restore -w -- *
# 丟棄暫存區和工作目錄中的更改(即恢復到指定的提交狀態)
$ git restore --staged --worktree <file>
使用 git restore 時,可以選擇性地指定 --staged 來影響暫存區,或者 --worktree 來影響工作目錄。如果同時指定了這兩個選項,則會同時影響暫存區和工作目錄。
git restore 是一個相對安全的操作,因為它不會改變分支的歷史記錄,它只會影響工作目錄和/或暫存區。
git worktree:同時在多個分支工作
git worktree 命令是在 Git 2.5 版本中引入的,它允許在同一個倉庫中創建多個工作目錄(worktrees),每個工作目錄可以檢出不同的分支或提交。這為開發者提供了同時處理多個任務的能力,比如在不同的分支上進行開發、測試,而不需要來回切換分支。
以下是 git worktree 的基本用法:
# 添加一個新的工作目錄,并檢出指定分支
$ git worktree add <path> [<branch>]
# 列出所有的工作目錄
$ git worktree list
# 移除一個工作目錄(必須先確保該目錄沒有未提交的更改)
$ git worktree remove <path>
# 移動一個工作目錄到新的位置
$ git worktree move <current-path> <new-path>
例如,如果想要添加一個新的工作目錄來檢出名為 feature-branch 的分支,可以這樣做:
$ git worktree add ../my-feature-worktree feature-branch
這將在 ../my-feature-worktree 目錄下創建一個新的工作目錄,并檢出 feature-branch 分支。
git sparse-checkout:高效處理大型倉庫
git sparse-checkout 是在 Git 2.25.0 版本中引入的,個功能是對之前存在的稀疏檢出機制的一個重大改進。通過 git sparse-checkout,開發者可以更高效地克隆大型倉庫,只檢出部分文件或目錄,而不是整個項目。
要啟用 sparse-checkout,首先需要設置倉庫以使用稀疏檢出模式:
# 啟用 sparse-checkout 模式
$ git sparse-checkout init
# 設置你想要包括的模式或路徑
$ git sparse-checkout set <pattern>...
例如,如果只想檢出 src 目錄及其子目錄中的文件,可以這樣做:
$ git sparse-checkout set src/
如果想添加多個模式或路徑,可以在 set 命令后列出所有路徑,或者分多次調用該命令。
除了 set 命令,還可以使用 add 和 list 來管理稀疏檢出模式:
# 添加額外的路徑到稀疏檢出模式
$ git sparse-checkout add <pattern>...
# 列出現有的稀疏檢出模式
$ git sparse-checkout list
如果不再需要稀疏檢出模式,可以通過以下命令禁用它,并恢復完整的檢出狀態:
# 禁用 sparse-checkout 模式并恢復完整檢出
$ git sparse-checkout disable
git range-diff:比較提交范圍之間的更改
git range-diff 是在 Git 2.19.0 版本中引入的,用于比較兩個提交范圍之間的差異。它可以幫助開發者理解在一次變基(rebase)、合并(merge)或歷史改寫操作后,一系列提交發生了哪些變化。
git range-diff 的基本用法如下:
# 比較兩個分支上的最近 n 個提交
$ git range-diff A~n..A B~n..B
# 或者更常見的用法是直接指定兩個范圍
$ git range-diff A..B C..D
這里的 A..B 和 C..D 分別表示兩個不同的提交范圍。例如,如果想比較 feature 分支在變基前后的差異,可以這樣做:
# 假設 origin/feature 是變基之前的遠程分支狀態
# 而 feature 是變基之后的本地分支狀態
$ git range-diff origin/feature..feature~n feature~n..feature
git range-diff 會輸出每個提交的摘要信息,包括提交消息、作者、日期等,并高亮顯示兩個范圍內的提交之間的差異。如果提交的內容完全相同,它將只顯示提交消息并指出它們是相同的;如果有差異,則會詳細列出差異之處。
git maintenance:自動化倉庫健康
git maintenance是在 Git 2.30.0 版本中引入的,用于管理和自動化各種維護任務的命令。這個命令旨在簡化和優化倉庫的維護工作,通過提供一組預定義的任務來幫助保持倉庫的健康狀態和高效性能。
git maintenance 提供了幾種子命令來管理不同的維護任務:
- 啟用和禁用自動維護:
# 啟用自動維護
$ git maintenance start
# 禁用自動維護
$ git maintenance stop
- 執行一次性維護任務:手動觸發一次性的維護任務,這對于在特定時間點(如大型提交之后)優化倉庫非常有用。
# 執行所有配置的維護任務
$ git maintenance run
# 執行特定類型的維護任務
$ git maintenance run --task=<task>
常見的維護任務包括:
gc:運行完整的垃圾收集,包括壓縮對象數據庫。
commit-graph:構建或更新提交圖文件以加速提交歷史查詢。
loose-objects:清理松散對象并將其打包。
incremental-repack:逐步重新打包對象以優化存儲。
prefetch:預先獲取遠程分支的新數據,以加速未來的克隆和拉取操作。
- 配置自動維護計劃:可以通過配置文件設置哪些任務應該被定期執行以及它們的執行頻率。例如,在 .git/config 文件中添加如下內容:
[maintenance "daily"]
task = prefetch
task = loose-objects
[maintenance "hourly"]
task = commit-graph
[maintenance "weekly"]
task = incremental-repack
[maintenance "monthly"]
task = gc
然后啟用這些計劃:
$ git maintenance start --schedule=daily
$ git maintenance start --schedule=hourly
$ git maintenance start --schedule=weekly
$ git maintenance start --schedule=monthly
git log --remerge-diff:更好地理解合并
從 Git 2.35 版本開始,可以使用 git log --remerge-diff 命令來更好地理解合并提交。通常情況下,合并提交會顯示哪些分支被合并了,但并不總是能清晰地解釋合并過程中引入的具體更改,特別是在解決合并沖突時所做的改動。
git log --remerge-diff 通過重播記錄的合并策略來重建合并提交,并展示該合并引入的確切更改。這對于調試合并沖突或審查復雜的合并歷史非常有用。