Git Worktree:優(yōu)雅解決多分支開發(fā)痛點(diǎn)的終極利器
很久沒(méi)寫一些日常開發(fā)技巧類的教程了,今天來(lái)簡(jiǎn)單介紹一個(gè)筆者認(rèn)為比較實(shí)用的臨時(shí)分支管理指令——git work tree,希望對(duì)你的日常開發(fā)有所幫助。

一、傳統(tǒng)的臨時(shí)修復(fù)管理策略
一般情況下,我們?cè)谌粘5陌姹镜鷷r(shí)都會(huì)在feature分支下進(jìn)行新功能開發(fā),臨時(shí)遇到線上生產(chǎn)問(wèn)題需要修復(fù)時(shí),對(duì)應(yīng)的解決策略是:
- 通過(guò)git stash暫存當(dāng)前更改
- 切換到release分支并基于該分支checkout出hotfix版本
- 修復(fù)問(wèn)題提交代碼
- 切回原有分支,通過(guò)git stash pop還原繼續(xù)完成開發(fā)

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

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

此時(shí),對(duì)應(yīng)release版本在生產(chǎn)上出現(xiàn)問(wèn)題需要緊急修復(fù),我們就可以通過(guò)worktree指令進(jìn)行切換修復(fù),對(duì)應(yīng)執(zhí)行如下指令,即在/tmp文件夾下創(chuàng)建一個(gè)hotfix-release處理release分支的問(wèn)題:
git worktree add /tmp/hotfix-release release對(duì)應(yīng)的我們就可以在tmp文件夾下看到這個(gè)release版本的工程了:
? /tmp ls |grep hotfix
hotfix-release同時(shí)我們進(jìn)入hotfix-release這個(gè)工程,通過(guò)git branch就可以看到,當(dāng)前的工程的版本確實(shí)是release版本:

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

通過(guò)idea也可以看到,通過(guò)該工程修改后的hotfix版本確實(shí)已經(jīng)成功提交到遠(yuǎn)程倉(cāng)庫(kù)了:

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

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





























