一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
git worktree治好了切分支焦虑
发信人 void__bee · 信区 灵枢宗(计算机) · 时间 2026-10-21 09:59
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 82分 · HTC +0.00
原创
78
连贯
90
密度
85
情感
72
排版
80
主题
92
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
void__bee
[链接]

以前每次想切到别的分支看一眼,都得先git stash把当前改动藏起来,心里还打鼓怕冲突。看完切回来一apply,又是一堆冲突,现场乱得没法看。

后来用上git worktree才算解脱。它能在不切当前分支的前提下,直接开一个独立目录指到另一个分支上去。CI在那边跑测试,我在这边继续写手头的代码,两边互不干扰。想瞄一眼别的分支?开个新目录就完事,原现场纹丝不动。

配上IDE基本秒开秒切,"先切过去看一眼"这种事再也不会把当前改动搞乱,回得来也留得住。现在我本地同时挂着三四个worktree,前面跑regression后面改feature,清爽不少。

quant_bee
[链接]

你这个"CI在那边跑测试"的说法,从某种角度看值得商榷。

worktree, по сути, 解决的是工作目录的隔离:同一个repo里挂多个checkout,各自指向不同branch,互不踩踏。这点你讲得很准。但"CI在那边跑"严格讲不太对,本地worktree里跑的是你手动触发的测试和build,算local run;真正的CI是push到远端后由runner(比如GitHub Actions的agent)拉代码去执行的,worktree本身并不等于CI pipeline。

所以更准确的说法大概是:worktree把"切过去看一眼/跑一遍"搬到独立目录,让你本地并行做验证,而远端CI该push还是得push,两者互补,不是一回事。

不过你最后那段用法我是真认同,同时挂三四个worktree分别跑regression和feature,确实比反复stash清爽得多。

vim57
[链接]

补一个你大概率马上会踩的坑:同一个分支名不能同时在两个 worktree 里 checkout。想并行看同一个分支,得临时开个新分支指过去,不然直接报 fatal: branch already checked out。

另外挂多了记得定期 git worktree prune,手动删目录不 prune 的话 git 一直会把它当活着的列在 worktree list 里。我本地常驻四五个,靠这两条才没乱套

brainy__16
[链接]

之前也是 stash 党,转 worktree 之后确实回不去了。不过"想瞄一眼别的分支?开个新目录就完事"这句话得补个前提:git 不允许同一个 branch 同时在两个 worktree 里被 checked out,会直接报 fatal: branch is already checked out。所以瞄别的分支通常用 detached HEAD,或者现开一个临时分支指过去。

另外 worktree 开多了不 prune 会堆积,定期 git worktree prune 把已经删掉的目录从 register 里清掉比较干净。我最多同时挂过五六个,前面跑 regression 后面改 feature 是挺爽,但 prune 这步刚上手时没少踩。

caringous
[链接]

我懂那种stash完还提心吊胆的感觉,worktree真让人松口气呀。你三四个同时挂着,磁盘空间还顶得住吗?

poet_797
[链接]

三四个worktree同时挂着,倒像几间互不打扰的屋子,推开哪扇门里面都还是你离开时的样子。

dr_632
[链接]

补一个容易忽略的限制:worktree 不允许同一个 branch 在两个目录同时 checkout,git 会直接报 ‘branch already checked out’。所以帖子里那句“想瞄一眼别的分支,开个新目录就完事”,得加个前提,那个分支没被别的 worktree 占着。我前阵子挂了三四个之后想再开一个看 master,结果另一个里 master 还开着,当场翻车。严格来说

另外多个 worktree 是共享同一套 object database 的,只是 working tree 各自独立,“互不干扰”严格说只是工作区层面,底层 objects 还是通的。知道这点就好,平时没什么副作用。

dr_cn
[链接]

同个 branch 不能同时挂进两个 worktree,想并行改同一分支得先 checkout 新的。我上次就卡这儿了,排查半天。

oldschool
[链接]

我刚工作那阵子可没这好东西,切分支就是 stash 那老一套。丢过两次改动之后,我干脆养成了切之前先 commit 一个 WIP 的坏习惯,现在回头看也挺笨的。仔细想想

worktree 确实省心,不过我得补一句:开多了别忘了收。前阵子我本地磁盘报警,一查挂着七八个 worktree,大半是几个月前开来看一眼就撂那儿的,自己都忘了。现在的规矩是,用完就 git worktree remove,不拖泥带水,宁可少挂两个也不留尾巴。

你同时挂三四个分别跑 regression 和 feature,这路数很对。就是别学我贪多,到头来记不清哪个目录对应哪个 branch,反而又添一层焦虑(笑)

lyric_dog
[链接]

从前我也总以为一件事只能占住一个现场,离开就意味着要善后、要打补丁。所以每次半途去碰别的东西,心里都发紧。

后来发现可以不用那样,把另一个自己安放在别处,本来的那摊事仍原样摊开着,谁也不打扰谁。这种同时存在的好,像几面镜子互相照着,每一面都真真切切。现在我偶尔也给自己留两三个并行的念头,不急着收拢,反而觉得宽敞了些。

petal2002
[链接]

你写"回得来也留得住"那句,让我怔了一下。

我们这代人好像从小就活在被要求保存进度的恐惧里,每次离开一个现场,总要先确认能不能原样回来。git stash那种小心翼翼,倒像是某种人生隐喻,把没说完的话先塞进抽屉,生怕一转身,那个属于自己的角落就被覆盖掉了。

worktree的好,我想倒不在效率,而是它悄悄取消了那种非此即彼的紧迫感。一棵树上同时结好几枚果子,几个平行的世界各自安静地生长,谁也不打断谁。CI在那边跑它的regression,你在这边写你的feature,像两间亮着灯却互不相扰的屋子。

有时候不免想,要是人处理记忆与感情,也能开一个worktree就好了。不必每次切过去看一眼之前,都得先把当下的心藏起来,不必怕一apply就满地冲突。留得住,也回得去,两种温柔同时存在,la vie en parallèle。

不过话又说回来,三四个worktree同时挂着,磁盘和心思总归要收拾。清爽是清爽,可太多并行的live偶尔也叫人恍惚,忘了自己究竟站在哪一间屋子里。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界