我在各个地方搜索和搜索了一段时间,但没有找到一个好的答案。什么是藏匿,它用于什么?
(混乱的来源:使用美丽的燃料与化石,点击“隐藏更改”按钮,看到那里带有问号的文件,并且不知道如何处理它们......)
First of all: let us understand why do we need to use stash?
为了理解什么是藏匿,我们首先需要了解3-stats
。 Git有一个名为3-states
的模型,它是用于处理本地存储库的内部git结构。
3-states
的“问题”是每个存储库有一个,而不是每个分支一个。因此,当我们切换分支时,唯一被修改的是HEAD
,它指向不同的提交。
在git中,分支只是给定提交的别名,因此如前所述切换分支只会更改HEAD
,同时保持working directory && stage
不变并保留所有修改。 [正在使用新分支所需的文件更新工作目录,但这不是我们解释的一部分。]
因此,如果我们添加新文件,修改其他文件,现在我们希望转移到另一个分支,我们将在工作目录和阶段区域中留下污垢,如下所示。
无论我们正在研究哪个分支机构,我们都会有一些肮脏的工作。
So how can we work on multiple branches?
大多数git用户使用stash
以获得在多个分支上同时工作的能力。 git stash
是实现它的基本方法,因为git stash
将我们的工作保存在一个名为stash的独立区域中。
到现在为止还挺好。
Where is the problem and why not use stash in first place?
问题是,当使用stash时,我们无法真正在多个分支上工作,因为每次我们希望切换分支时都必须存储。
另一个问题是,我们可以将存储代码拉到错误的分支,而不是我们必须找出哪些文件是正确的,如果我们犯了错误。
So how can we really work on multiple branches?
自2007年以来,Git拥有这种能力。在contrib
文件夹下,这是一个名为'new-workdir'的隐藏命令,后来被添加到版本2.5
的git中,并被重命名为git worktree
。
git worktree
git worktree
将创建一个新的工作文件夹,允许我们同时在多个分支上工作。每个副本都将指向原始存储库,而3-states
是一个新的副本。这节省了我们使用git stash
甚至克隆新存储库的需要,因为这些工作树共享相同的存储库,我们可以检查任何工作树上的任何分支,我们可以做一个樱桃选择或合并,所有都将在我们的本地完成机。
用法:
git worktree add <second path>
将在您的计算机上创建另一个文件夹,允许您同时在不同的分支上工作。
这将允许您在新工作树上进行任何实验,而不会对存储库本身产生任何影响。在附加的图像中,您可以看到有两个单独的工作文件夹,但它们都使用单个存储库并共享内容。
Fossil,Git以及可能的其他版本控制系统都有一个藏匿的想法。 Pro Git has a section on stashing。它部分说:
Stashing采用工作目录的脏状态 - 即修改后的跟踪文件和分阶段更改 - 并将其保存在一堆未完成的更改中,您可以随时重新应用这些更改。
换句话说,它是一种在执行其他操作时保存当前工作的方法,无需进行“实际”提交或影响存储库历史记录。