初次尝试git worktree——让cursor帮我同时干两份活

依然来自于阿力的发现,他在两周前的某天向我展示了他忙时的工作模式:“我现在开了四个cc窗口,每一个都在分别干活。

“它们属于同一个仓库,只是分属于不同分支。

“启动很简单,只需要使用git的worktree就行,然后每个文件夹下面都是独立分支。”

在阿力的分享之后,我有去简单搜了下git worktree是什么(我此前有看过一本专门讲解Git的书叫做Pro Git,对worktree却一点印象都没有,是有些神奇的。我去书中确认了下,有worktree概念,但没介绍过此种用法),然后有了这样的理解:

我此前的开发,都在同一个分支上进行,当需要在另一个分支做些改动时,采取的步骤是这样的:

git stash  
git checkout target-br  
git commit  
git push  
git checkout ori-br  
git stash pop  

如果改动并不很大,过程中我还会添加git rebase来将改动同步到ori-br。总之是,一番操作下来,到最后的git stash pop时,是需要处理些冲突的。如果于另一个分支上的改动很耗时,我可能还会忘记此前的改动都有些啥。

而git worktree的存在,便是为了解决这个问题。worktree所做的事情,其实是在本地直接新建一个文件夹,这个文件夹下面会直接新建一个分支(我今天是新建的分支,我理解直接checkout到某个已存在分支肯定也是可以的),如果需要在新分支改些问题,直接切换到新分支目录下去做改动就好的。

最近工作很有些忙,今天下午我忽然回忆起阿力的操作。简单请教下阿力,再基于他的分享开始让cursor帮我试做这件事。

我原有的分支,依然做正需要做的事情A。新建的分支,去做另一个可算作较底层的与A无关的langfuse集成完善。cursor依然很牛,两个agent各做各的互不干扰。

但过程中的我却感受到两处不便利。

首先是确认的容易搞错。cursor每个agent做完事情后我都需要确认(这是我现在的工作模式,我让它做每件事之前都让我看过方案待我确认后再执行),当切来切去好几遍之后,我有一次将新的指令输在错误的窗口导致上下文被污染。

然后是merge代码时的失误。git merge这条指令,也需要先做git stash。agent1 merge代码前,首先执行了git stash,而agent2此时正在修改代码,agent2的修改被搞坏后再自我修复。到agent1 merge完之后再做git stash pop时,有了冲突。这冲突cursor额外花好几分钟处理。

以上,是我今日初次尝试worktree的记录,它可算是有好有坏。

好的地方,是我确实让cursor同时帮我做了两件事。坏的地方,是我的确认竟然成了它并行开发的瓶颈!

是否可做些改进呢?

问题一,慢一点是可以避免的。

问题二,可以不着急merge代码,可在许多工作都完成之后再做这件事。

未来是否还会继续用呢?

或许会吧?但前提,一定得是我知道自己在做什么,且大概知道怎么做。

因为啥都不会?那出来的东西,大概率将是shit! 原文链接