什么是stash?

25

我在各种地方谷歌搜索了一段时间,但没有找到一个好的答案。什么是stash,它有什么用途?

(混淆来源:使用漂亮的Fuel和Fossil,点击了“Stash changes”按钮,在那里看到带问号的文件,并不知道该怎么处理...)


1
一个stash通常是“我改变了但还没有被读取的东西,但我仍然需要一个干净的工作空间,所以我暂时把它放在一边以便稍后继续工作”。 - Joachim Sauer
2个回答

38
首先,让我们了解为什么我们需要使用stash。
为了理解stash是什么,我们首先需要了解“三个状态”。Git有一个内置的模型叫做“三个状态”,它是用于处理本地仓库的内部Git结构。

3-states diagram

“问题”在于每个“3-states”有一个,而不是每个分支一个。所以当我们切换分支时,唯一被修改的是指向不同提交的HEAD
在Git中,一个分支只是给定提交的别名,所以如前所述切换分支只会改变HEAD,而不会改变工作目录和暂存区,也不会改变所有的修改。 [工作目录会被更新为新分支所需的文件,但这不是我们解释的一部分。]
所以,如果我们添加了新文件,修改了其他文件,现在我们希望切换到另一个分支,我们的工作目录和暂存区将会有未完成的修改,如下所示。
无论我们现在在哪个部门工作,我们都有一些“肮脏”的工作跟随着我们。

enter image description here

那么我们如何在多个分支上工作呢?

大多数Git用户使用stash来实现同时在多个分支上工作的能力。git stash是实现这一目标的基本方法,因为git stash会将我们的工作保存在一个名为stash的独立区域中。

然后,我们可以在任何时间、任何分支上检出代码。 enter image description here


到目前为止还不错。
问题在于使用stash时,我们无法真正在多个分支上工作,因为每次切换分支都需要stash。
另一个问题是,我们可能会将stash的代码拉到错误的分支上,然后我们就必须找出哪些文件是正确的,如果我们犯了一个错误的话。
那么我们如何真正在多个分支上工作呢?
Git自2007年就有了这个能力。在contrib文件夹下有一个隐藏命令叫做'new-workdir',后来在2.5版本中被添加到git中,并改名为'git worktree'。
git worktree

git worktree会创建一个新的工作目录,允许我们同时在多个分支上工作。每个副本都指向原始仓库,而3-states是一个新的、全新的副本。这样我们就不需要使用git stash甚至克隆一个新的仓库,因为这些工作目录共享同一个仓库,我们可以在任何工作目录上检出任何分支,可以进行cherry-pick或合并,所有操作都将在我们的本地机器上完成。

用法:

git worktree add <second path>

将在您的计算机上创建另一个文件夹,使您能够同时在不同的分支上工作。
这将允许您在新的工作树上进行任何实验,而不会对存储库本身产生任何影响。在附图中,您可以看到有2个独立的工作文件夹,但它们都使用同一个存储库并共享内容。

enter image description here


1
这篇帖子可以通过文字而非截图来改进。 - ggorlen

16

Fossil、Git 以及可能其他版本控制系统都采用了一个名为“stash”的概念。Pro Git 有一节专门讲解 stash。其中一部分内容是:

Stash 将工作目录的“脏”状态 - 也就是修改过的跟踪文件和暂存更改 - 保存在未完成更改的堆栈中,您可以随时重新应用它们。

换句话说,这是一种在做其他事情时保存当前工作的方法,而不会进行“真正”的提交或影响您的存储库历史记录。


@CodeWizard 请不要更改引用来源的文本,否则它就不再是一个直接引用了。 - Todd A. Jacobs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接