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