git 什么是藏匿点?

nxagd54h  于 2023-09-29  发布在  Git
关注(0)|答案(2)|浏览(87)

我已经在谷歌上搜索了一段时间,但没有找到一个好的答案。什么是藏匿点,它的用途是什么?
(混淆的来源:使用漂亮的燃料与化石,点击“隐藏更改”按钮,看到文件在那里与问号,不知道该怎么办.)

cgvd09ve

cgvd09ve1#

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

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

3-states的“问题”是每个repository有一个,而不是每个分支有一个。因此,当我们切换分支时,唯一被修改的是指向不同提交的HEAD
在git中,branch只是给定提交的别名,因此如前所述切换分支只会更改HEAD,而不会更改working directory && stage不变,并保留所有修改。[工作目录正在更新新分支所需的文件,但这不是我们解释的一部分。]
因此,如果我们添加新文件,修改一些其他文件,现在我们希望移动到不同的分支,我们将在我们的工作目录和舞台区域中保留dirt,如下所示。
我们有一些肮脏的工作跟着我们,不管我们现在正在工作的分支。

So how can we work on multiple branches?

大多数git用户使用stash来获得同时在多个分支上工作的能力。git stash是实现它的基本方法,因为git stash将我们的工作保存在一个名为stash的单独区域中。
然后,我们可以在任何给定的时间为任何给定的分支 checkout 代码。

目前为止一切顺利

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甚至克隆新仓库的需要,因为这些工作树共享同一个仓库,我们可以 checkout 任何工作树上的任何分支,我们可以进行cherry-pick或merge,所有这些都将在我们的机器上本地完成。
使用方法:

git worktree add <second path>

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

s8vozzvw

s8vozzvw2#

化石、Git和其他可能的版本控制系统都有隐藏的想法。Pro Git has a section on stashing。它部分地说:
Stashing获取工作目录的脏状态(即修改过的跟踪文件和暂存的更改),并将其保存在一个未完成更改的堆栈中,您可以随时重新应用该堆栈。
换句话说,这是一种在做其他事情时保存当前工作的方法,而不会进行“真实的的”提交或影响存储库历史。

相关问题