Git Worktree:優雅解決多分支開發痛點的終極利器
很久沒寫一些日常開發技巧類的教程了,今天來簡單介紹一個筆者認為比較實用的臨時分支管理指令——git work tree,希望對你的日常開發有所幫助。

一、傳統的臨時修復管理策略
一般情況下,我們在日常的版本迭代時都會在feature分支下進行新功能開發,臨時遇到線上生產問題需要修復時,對應的解決策略是:
- 通過git stash暫存當前更改
- 切換到release分支并基于該分支checkout出hotfix版本
- 修復問題提交代碼
- 切回原有分支,通過git stash pop還原繼續完成開發

這種做法也是不錯的選擇,但存在一個筆者認為不是很優雅的缺點,即通過git stash策略完成版本修復回歸后,盡管我們可以還原之前的開發工作,但編譯構建工作卻需要從頭開始,這對于那些編譯型的編程語言,例如:C、Go或者java都不是很友好。
二、詳解git worktree
Git worktree是Git提供的一個強大功能,允許你從單個倉庫創建多個工作目錄,每個目錄可以檢出不同的分支。在Git中,我們把通過git init或git clone創建的原始工作目錄稱為主工作樹,而通過git worktree add命令創建的額外工作目錄稱為鏈接工作樹。所有工作樹共享同一個倉庫數據(對象、引用等),但擁有各自獨立的working directory、index和HEAD。
主要命令包括:
- git worktree add <path> [<branch>] - 創建新的工作樹
- git worktree list - 列出所有工作樹
- git worktree remove <path> - 刪除工作樹
- git worktree move <old-path> <new-path> - 移動工作樹
- git worktree lock/unlock <path> - 鎖定/解鎖工作樹
- git worktree prune - 清理殘留的元數據
1. git work tree使用思路
相較于git stash,worktree的理念會顯得更加優雅,我們還是以之前的例子,當我們在進行開發過程中遇到線上故障需要切換代碼打補丁進行修復時,以work tree的使用方式,對應的策略為:
- 通過git worktree指令為release分支創建一個臨時文件夾
- 通過ide工具打開對應文件夾下的release版本工程
- checkout出hotfix分支并進行修改
- 刪除worktree文件夾,打開原有的idea繼續feature的工作
可以看到,worktree給人一種用后即焚,一種更貼近于"回到手頭的活兒"的感覺:

2. git worktree操作演示
我們現在就來實際操作演示一下,假設我們現在有一個release分支記錄著我們發布的開發代碼,對應代碼如下比較簡單,遍歷數組讓這些數值作為除數,因為從0開始遍歷,所以潛藏著一個異常:
public static void main(String[] args) {
SpringApplication.run(IdeaGitApplication.class, args);
for (int i = 0; i < 10; i++) {
System.out.println("num:"+(10/i));
}
}又假設筆者現在正在feature分支開發,此時正在編寫一個插入排序的工具類,對應的分支情況如下圖,可以看到:
- target目錄存在已編譯好的字節碼
- 新增了一個未提交的工具類SortUtils

此時,對應release版本在生產上出現問題需要緊急修復,我們就可以通過worktree指令進行切換修復,對應執行如下指令,即在/tmp文件夾下創建一個hotfix-release處理release分支的問題:
git worktree add /tmp/hotfix-release release對應的我們就可以在tmp文件夾下看到這個release版本的工程了:
? /tmp ls |grep hotfix
hotfix-release同時我們進入hotfix-release這個工程,通過git branch就可以看到,當前的工程的版本確實是release版本:

隨后我們就可以打開tmp文件夾下的工程checkout出hotfix進行修改并提交進行線上驗證:

通過idea也可以看到,通過該工程修改后的hotfix版本確實已經成功提交到遠程倉庫了:

最后,我們進行用后即焚燒的工作,通過remove指令將該文件夾刪除
git worktree remove /private/tmp/hotfix-release好的,我們tab切換回原來的工程就可以繼續工作了,是不是很方便呢?

3. git worktree帶來的便捷
從上面的演示可以看出,worktree可以非常快速的在指定目錄下創建指定版本工程,對當前分支沒有任何影響,我們也不用像git stash那樣進行繁瑣的保存和來回切換,對應編譯的代碼也不會消失。它是真正的做到了無縫銜接和用后即焚,是一種非常優雅的解決方案。
三、其他應用場景
除了緊急修復生產問題外,git worktree在日常開發中還有很多其他實用場景:
1. 并行功能開發
當需要同時開發多個功能特性時,可以為每個特性創建獨立的工作樹,避免頻繁切換分支和重新編譯:
# 為不同的功能特性創建獨立的工作樹
git worktree add ../feature-user-auth feature-user-auth
git worktree add ../feature-payment feature-payment這樣可以同時在多個功能上并行工作,每個工作樹都有獨立的編譯環境和IDE配置。
2. 代碼審查和測試
在進行代碼審查時,可以創建一個專門的工作樹來檢出和測試他人的PR分支,而不影響當前的開發工作:
# 為審查PR創建專門的工作樹
git worktree add ../review-pr-123 pr-1233. 版本維護和發布
當需要維護多個版本時,可以為不同版本創建工作樹,同時進行bug修復和功能開發:
# 為不同版本維護創建工作樹
git worktree add ../release-v1.0 release-v1.0
git worktree add ../release-v2.0 release-v2.0四、最佳實踐
為了更好地使用git worktree,以下是一些推薦的最佳實踐:
1. 目錄組織和命名
使用清晰的目錄命名約定,例如:../hotfix-release、../feature-user-auth
將工作樹目錄放在主倉庫目錄的同級目錄中,便于管理
2. 及時清理不再需要的工作樹
定期清理已完成的工作樹,避免占用過多磁盤空間:
# 移除工作樹后記得清理殘留的元數據
git worktree remove ../feature-completed
git worktree prune # 清理殘留的元數據3. 使用git worktree list管理多個工作樹
通過git worktree list命令可以查看所有工作樹的狀態:
git worktree list
# 輸出示例:
# /path/to/main-repo abc1234 [master]
# /path/to/feature def5678 [feature-branch]4. 移動工作樹目錄
如果需要移動工作樹到其他位置,可以使用git worktree move命令:
git worktree move /old/path/to/worktree /new/path/to/worktree5. 鎖定可移動媒體上的工作樹
對于存儲在USB驅動器或網絡共享上的工作樹,使用鎖定功能防止自動清理:
git worktree lock /path/to/worktree-on-usb
# 完成后解鎖
git worktree unlock /path/to/worktree-on-usb五、小結
git worktree是一個非常實用的Git功能,它允許我們在同一倉庫中管理多個工作目錄,每個工作目錄可以獨立檢出不同的分支。相比傳統的git stash方式,worktree具有以下優勢:
- 保持編譯狀態:切換分支時不會丟失已編譯的代碼,避免重新編譯的時間成本
- 并行開發:可以同時在多個分支上工作,提高開發效率
- 隔離環境:每個工作樹都有獨立的目錄和狀態,互不影響
- 靈活管理:支持創建、移動、刪除工作樹等操作
通過合理使用git worktree,我們可以更高效地處理緊急修復、并行開發、代碼審查等多種場景。掌握其核心命令和最佳實踐,能夠顯著提升我們的開發效率和工作體驗。




























