git - 什么是 stash ?

标签 git git-stash fossil

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

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

最佳答案

首先:让我们明白为什么需要使用stash?

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

enter image description here

三态 的“问题”是每个存储库 一个,而不是每个分支 一个。因此,当我们切换分支时,唯一被修改的是 HEAD。这指向不同的提交。

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

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

无论我们现在在哪个分支上工作,我们都有一些肮脏的工作跟随着我们。

enter image description here

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

大多数 git 用户使用 stash 来获得在多个分支上同时工作的能力。 git stash 是完成它的基本方法,因为 git stash 将我们的工作保存在名为 stash 的单独区域中。

然后我们可以在任何给定时间检查任何给定分支的代码。 enter image description here


到目前为止一切顺利。

问题出在哪里,为什么不首先使用 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 个独立的 工作文件夹,但它们都使用一个存储库并共享内容。

enter image description here

关于git - 什么是 stash ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260981/

相关文章:

git 工作流程 : should I commit before I pull?

git - 如何别名 git checkout && git stash apply

Fossil 添加外部目录

java - jGit 使用 RevWalk 获取 RevCommit 不返回任何内容

git - 对于文件路径已满或缩短并依赖于 "token"扩展,创建符号链接(symbolic link)的正确方法是什么

python - 维护 PIP 存储库

fossil - 如何撤销化石的旧变化?

使用 grep 命令过滤的所有文件中的特定行的 git blame

git stash - 防止执行拼写错误的子命令

fossil - Fossil-Scm 是否能够添加新的票证状态?