都2024年了,你还不知道git worktree么?

三年前 python 大佬吉多·范罗苏姆(为 Python 程序设计语言的最初设计者及主要架构师)才知道 git worktree ,我现在才知道,我觉得没啥丢人的。

应用场景

如果你正在 feature 的分支中开发新功能,线上版本紧急错误又需要你基于 master 做修复。

可能有如下几种办法解决:

解法 1

  1. 将本地修改文件通过 git add . && git commit 提交到当前分支,或者通过 git stash 暂存起来
git 复制代码
// feature branch
git add .
git commit
git checkout  master

// or
git stash
git checkout  master
  1. 分支切到 master,修复完问题后切回 feature
  2. 若之前是 commit 的可直接开发,若是 git stash 则 git stash pop 出来处理

解法 2

clone 一份同样远程代码到本地,切换到 master 分支来解决错误。

存在问题

解法 1 缺点:

  1. 若正在跑一个耗时较长的测试不能动工作区代码,则只能等了
  2. 用 git stash 方式,暂存和切走到修改完错误切回 feature 至少得 4 步,命令行切来切去也挺麻烦

解法 2 缺点:若远程仓库太大,则 clone 一次会很耗时。

针对上述场景,可以考虑用 git worktree 来解决,该命令可让你直接开一个独立工作区域出去做别的事,未 commit 的档案原封不动留在原来分支。

它如何工作

  1. 首先创建一个本地文件夹 worktree_test 并在 worktree_test 文件夹内创建 master 分支,然后在 master 内 git init;
shell 复制代码
mkdir worktree_test && cd worktree_test && mkdir master && cd master/ && git init
  1. 先模拟构造一个主干分支 master,向 rooi.txt 文件中写几行内容#1
shell 复制代码
//master
vi rooi.txt
cat rooi.txt
master:add:rooi.txt     (#1)

git add rooi.txt
git commit -m "add:rooi.txt"
  1. 构造完主干分支 master 后,我们生成一个 feature 分支,该分支模拟开发功能分支,并写一些分支独有内容#2:feature:modify rooi.txt 和#4 生成一个临时 untracked file: a.temp
shell 复制代码
// new branch in master
git checkout -b feature

// feature
cat rooi.txt
master:add:rooi.txt   (#1)

vi rooi.txt           (#2)
cat rooi.txt
master:add:rooi.txt
feature:modify rooi.txt

git add rooi.txt      (#3)
git commit -m "dev:modify"
[feature 4d300fb] dev:modify
 1 file changed, 1 insertion(+)

touch a.temp          (#4)

git status            (#5)
Untracked files:
a.temp

线上紧急错误来了

此时我们在 feature 分支通过 git worktree add 建立一个工作区#1, 注意此时临时目录区在 d:\work\worktree_test 目录下 说明: git worktree add 中 ../bugfix 表示新建工作区名字,后面 master 表示跟进当前主干 master 分支来新建,也就是当前工作区 bugfix 是完全以 master 为基准建立的副本。

shell 复制代码
// d:\work\worktree_test\master  in feature
git worktree add ../bugfix master (#1)
// to dir : d:\work\worktree_test
cd ..

// d:\work\worktree_test
ls
bugfix/ master/

cd bugfix
cat rooi.txt
master:add:rooi.txt

vi rooi.txt
cat rooi.txt
master:add:rooi.txt
bugfix:fix bug

git add rooi.txt      (#3)
git commit -m "bugfix:fix bug"

如上,bugfix 分支是依照 master 分支构建工作区,此时可以直接提交到 master 分支上。

继续开发功能

通过#1 回到原来 master 目录下可以看到,之前提交和 untracked file 都存在,且在 feature 分支上,现场原样保持。

shell 复制代码
// in bugfix dir master
// d:\work\worktree_test\bugfix
cd ..
cd master                       (#1)

当然你也可以合并 bugfix 到 feature 分支

shell 复制代码
// feature
git merge master

如下效果图中,可以创建多个工作区副本

参考资料

It's 2024, I Haven't Used Git Worktree Yet | by David Lee | Mar, 2024 | Medium

相关推荐
xurime2 小时前
Excelize 开源十周年,发布 2.11.0 版本
golang·开源·github·excel·导出·导入·excelize·基础库
霸道流氓气质6 小时前
CodeBuddy中使用 MCP 工具将 XMind 思维导图转换为 Markdown —— 实操流程汇总
git·myeclipse·xmind
逛逛GitHub8 小时前
自测会不会被 Claude Code 标记为中国用户,有人做了个网页。
github
逛逛GitHub8 小时前
终于有个非 AI 相关的项目登上 GitHub 热榜,高低得推荐一下。
github
Lion099 小时前
【04】50 行代码实现最小 Agent:不依赖任何框架
人工智能·github
OsDepK11 小时前
mimo code安装教程
git·电脑·ai编程
狂炫冰美式12 小时前
凌晨睡不着,我给台风巴威写了个追踪网站
前端·后端·github
Maynor99613 小时前
GitHub 外链 / 自荐入口清单
github
oscar99914 小时前
3.4 Nginx 负载均衡——动态再平衡的反人性纪律
nginx·github·负载均衡·财富源代码
杨超越luckly14 小时前
Agent 应用指南:基于 OurAirports 的中国机场设施数据可视化
python·html·github·可视化·机场设施