我读了Github上git-worktree的帖子。他们写道:
假设您正在一个名为feature的分支的Git存储库中工作,这时用户在master中报告了一个高度紧急的错误。首先,您可以创建一个带有新分支、hotfix、相对于master[…]签出的链接工作树。您可以修复错误、推送hotfix并创建一个拉取请求。
当我在一个叫做feature的分支上工作时,master中报告了一些非常紧急的bug,我通常会把我正在做的东西藏起来,然后创建一个新的分支。当我完成时,我可以继续工作。这是一个非常简单的模型,我已经做了很多年了。
另一方面,使用git-worktree也有其局限性:
例如,不允许在两个链接的工作树中同时签出同一个分支,因为这将允许在一个工作树中提交的更改导致另一个工作树不同步。
为什么我要为一个已经解决的问题选择一个更复杂的工作流?
在git-worktree中,是否有什么东西是事先无法完成的,从而证明了这个全新的、复杂的功能是合理的?
我有一个相当不寻常的问题:我在同一台机器上进行Windows和Linux开发。我的Windows盒子里有一个运行Linux的VirtualBox。VirtualBox挂载一些Windows目录,并直接在Linux机器内部使用它们。这让我可以使用Windows来管理文件,但可以在Linux中构建。这是一个跨平台的项目,所以它构建在Windows和Linux上,使用相同的目录结构。
问题是,Linux和Windows的构建系统在同一个目录下使用时会互相崩溃;有一些复杂的构建步骤用于下载使用相同目录名的库等。构建系统的Windows版本下载特定于Windows的库,而构建系统的Linux版本下载特定于Linux的库。
在理想的情况下,构建系统应该被修改,以便Windows和Linux可以在目录中共存,但目前,这个问题是通过工作树解决的。“Linux”文件夹可以生成特定于Linux的构建构件,“Windows”文件夹可以生成特定于Windows的构建构件。虽然这不是一个理想的解决方案,但在等待构建系统错误得到解决时,这是一个很好的权宜之计。
诚然,工作树并不是为此而设计的;我必须把Windows版本和Linux版本放在不同的分支上,尽管我真的希望它们放在同一个分支上。尽管如此,它还是在发挥作用,并且是一个不同寻常的工作树拯救世界的例子。
一个明显的用途是同时比较不同版本的行为(而不是来源)——例如,一个网站的不同版本或仅仅是一个网页。
我在当地试过。
创建目录page1。
在里面创建目录SRC和git init它。
在SRC中创建带有少量内容的page1.html并提交。
$ git分支ver0
$ git工作树添加../ V0 ver0
在SRC master中添加更多文本到page1.html并提交。
$ git分支sty1
在sty1分支中编辑page1.html(添加一些独特的CSS样式)并添加提交。
$ git工作树添加../ S1 sty1
您现在可以使用网页浏览器同时打开和查看这3个版本:
.\page1\src\page1.html //任何git当前的内容
.\page1\V0\page1.html //初始版本
\page1\S1\page1.html //实验风格的版本