我在各个地方用谷歌搜索了一段时间,但没有找到好的答案。什么是 stash,它有什么用?
(困惑的来源:使用漂亮的Fuel with Fossil,点击“Stash changes”按钮,看到里面的文件有问号,不知道怎么处理它们...)
最佳答案
首先:让我们明白为什么需要使用stash?
为了理解什么是 stash,我们首先需要理解 3-stats
。 Git 有一个名为 3-states
的内置模型,它是用于处理本地存储库的内部 git 结构。
三态
的“问题”是每个存储库 一个,而不是每个分支 一个。因此,当我们切换分支时,唯一被修改的是 HEAD
。这指向不同的提交。
在 git 中,branch 只是给定提交的别名,因此如前所述切换分支只会更改 HEAD
同时保留 working directory && stage
unchanged 并保留所有修改。
[正在使用新分支具有的所需文件更新工作目录,但它不是我们解释的一部分。]
因此,如果我们添加新文件,修改一些其他文件,现在我们希望移动到不同的分支,我们将在我们的工作目录和阶段区域中遗漏污垢,如下所示。
无论我们现在在哪个分支上工作,我们都有一些肮脏的工作跟随着我们。
那么我们如何在多个分支上工作呢?
大多数 git 用户使用 stash
来获得在多个分支上同时工作的能力。 git stash
是完成它的基本方法,因为 git stash
将我们的工作保存在名为 stash 的单独区域中。
到目前为止一切顺利。
问题出在哪里,为什么不首先使用 stash?
问题是,当使用 stash 时,我们无法真正在多个分支上工作,因为每次我们希望切换分支时都必须进行 stash。
另一个问题是,我们可以将 stash 代码 pull 到错误的分支,如果我们做错了,我们必须找出哪些文件是正确的。
那么我们如何才能真正在多个分支上工作呢?
Git 自 2007 年以来就有了这种能力。在 contrib
文件夹下,有一个名为“new-workdir”的 stash 命令,后来在 2.5
版本中添加到 git 中,并且已重命名为 git worktree
。
git 工作树
git worktree
将创建一个新的工作文件夹,允许我们同时在多个分支上工作。每个副本都将指向原始存储库,而 3-states
是一个新的副本。这节省了我们使用 git stash
甚至克隆新存储库的需要,因为这些工作树共享相同的存储库,我们可以 checkout 任何工作树上的任何分支,我们可以进行 cherry-pick 或 merge 所有这些都将在我们的机器上本地完成。
用法:
git worktree add <second path>
将在您的计算机上创建另一个文件夹,允许您同时在不同的分支上工作。
这将允许您在新工作树上进行任何实验,而不会对存储库本身产生任何影响。在所附的图片中,您可以看到有 2 个独立的 工作文件夹,但它们都使用一个存储库并共享内容。
关于git - 什么是 stash ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260981/