什么是藏匿处?

Posted

技术标签:

【中文标题】什么是藏匿处?【英文标题】:What is a stash? 【发布时间】:2012-06-30 22:30:11 【问题描述】:

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

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

【问题讨论】:

藏匿处通常是“我已更改但尚未阅读的内容,但我仍需要一个干净的工作区,因此我暂时将其放在一边,以便以后继续处理”。 【参考方案1】:

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

要了解什么是stash,我们首先需要了解3-stats。 Git 有一个名为 3-states 的内置模型,它是用于处理本地存储库的内部 git 结构。

3-states 的“问题”是每个 repository 有一个,而不是每个 branch 有一个。所以当我们切换分支时,唯一被修改的是HEAD,它指向不同的提交。

在 git 中,branch 只是给定提交的别名,因此如前所述切换分支只会更改HEAD,同时保持working directory && stage 不变 并离开所有修改原样。 [正在使用新分支具有的所需文件更新工作目录,但它不是我们解释的一部分。]

因此,如果我们添加新文件,修改了一些其他文件,现在我们希望移动到不同的分支,我们的工作目录和阶段区域中将遗漏 dirt,如下所示。

不管我们现在在哪个分支工作,我们都有一些肮脏的工作跟随我们。

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 时,我们无法真正在多个分支上工作,因为每次我们希望切换分支时都必须进行 stash。

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

So how can we really work on multiple branches?

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

git worktree

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

用法:

git worktree add <second path>

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

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

【讨论】:

【参考方案2】:

Fossil、Git 和可能的其他版本控制系统共享存储的想法。专业 Git has a section on stashing。它部分表示:

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

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

【讨论】:

@CodeWizard 请不要更改引用来源的引用文本,因为它不再是直接引用。

以上是关于什么是藏匿处?的主要内容,如果未能解决你的问题,请参考以下文章

Git 藏匿操作

sh Git藏匿

sh Git藏匿

markdown 1部のファイルのみ藏匿から结帐

sh Git的で未追迹のファイルも藏匿する.SH

ELK日志处理简介