17

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

(困惑的来源:使用漂亮的Fuel和Fossil,点击“Stash changes”按钮,看到里面有问号的文件,不知道如何处理它们......)

4

2 回答 2

25

First of all: let us understand why do we need to use stash?

为了理解 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是完成它的基本方法,因为将我们的工作保存在一个名为stashgit stash的单独区域中。

然后,我们可以在任何给定时间为任何给定分支检查代码。 在此处输入图像描述


到现在为止还挺好。

Where is the problem and why not use stash in first place?

问题是,当使用 stash 时,我们无法真正在多个分支上工作,因为每次我们希望切换分支时都必须进行 stash。

另一个问题是,我们可以将存储代码拉到错误的分支,如果我们做错了,我们必须找出哪些文件是正确的。

So how can we really work on multiple branches?

Git 从 2007 年开始就有这种能力。在contrib文件夹下有一个名为“new-workdir”的隐藏命令,后来在版本中添加到 git 中并重2.5命名为git worktree.

git worktree

git worktree将创建一个新的工作文件夹,允许我们同时在多个分支上工作。每个副本都将指向原始存储库,而它们3-states都是新的和新鲜的副本。这节省了我们使用git stash甚至克隆新存储库的需要,因为这些工作树共享相同的存储库,我们可以签出任何工作树上的任何分支,我们可以进行挑选或合并,所有这些都将在我们的机器上本地完成.

用法:

git worktree add <second path>

将在您的计算机上创建另一个文件夹,允许您同时在不同的分支上工作。

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

在此处输入图像描述

于 2017-02-25T14:18:14.740 回答
13

Fossil、Git 和可能的其他版本控制系统共享存储的想法。Pro Git有一个关于 stash 的部分。它部分说:

Stashing 获取工作目录的脏状态——即修改后的跟踪文件和暂存的更改——并将其保存在未完成的更改堆栈中,您可以随时重新应用。

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

于 2012-06-29T11:58:51.800 回答