我已经在谷歌上搜索了一段时间,但没有找到一个好的答案。什么是藏匿点,它的用途是什么?(混淆的来源:使用漂亮的燃料与化石,点击“隐藏更改”按钮,看到文件在那里与问号,不知道该怎么办.)
cgvd09ve1#
First of all: let us understand why do we need to use stash?
为了理解什么是stash,我们首先需要理解3-states。Git有一个名为3-states的内置模型,这是用于使用本地存储库的内部Git结构。
3-states
3-states的“问题”是每个repository有一个,而不是每个分支有一个。因此,当我们切换分支时,唯一被修改的是指向不同提交的HEAD。在git中,branch只是给定提交的别名,因此如前所述切换分支只会更改HEAD,而不会更改working directory && stage不变,并保留所有修改。[工作目录正在更新新分支所需的文件,但这不是我们解释的一部分。]因此,如果我们添加新文件,修改一些其他文件,现在我们希望移动到不同的分支,我们将在我们的工作目录和舞台区域中保留dirt,如下所示。我们有一些肮脏的工作跟着我们,不管我们现在正在工作的分支。
HEAD
working directory && stage
So how can we work on multiple branches?
大多数git用户使用stash来获得同时在多个分支上工作的能力。git stash是实现它的基本方法,因为git stash将我们的工作保存在一个名为stash的单独区域中。然后,我们可以在任何给定的时间为任何给定的分支 checkout 代码。
stash
git 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。
contrib
2.5
git worktree
git worktree将创建一个新的工作文件夹,允许我们同时处理多个分支。每个副本将指向原始存储库,而3-states是一个新的和新鲜的副本。这就省去了我们使用git stash甚至克隆新仓库的需要,因为这些工作树共享同一个仓库,我们可以 checkout 任何工作树上的任何分支,我们可以进行cherry-pick或merge,所有这些都将在我们的机器上本地完成。使用方法:
git worktree add <second path>
将在您的计算机上创建另一个文件夹,允许您同时处理不同的分支。这将允许您在新工作树上进行任何实验,而不会对存储库本身产生任何影响。在所附的图像中,您可以看到有2个单独的工作文件夹,但它们都使用单个存储库并共享内容。
s8vozzvw2#
化石、Git和其他可能的版本控制系统都有隐藏的想法。Pro Git has a section on stashing。它部分地说:Stashing获取工作目录的脏状态(即修改过的跟踪文件和暂存的更改),并将其保存在一个未完成更改的堆栈中,您可以随时重新应用该堆栈。换句话说,这是一种在做其他事情时保存当前工作的方法,而不会进行“真实的的”提交或影响存储库历史。
2条答案
按热度按时间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,所有这些都将在我们的机器上本地完成。使用方法:
将在您的计算机上创建另一个文件夹,允许您同时处理不同的分支。
这将允许您在新工作树上进行任何实验,而不会对存储库本身产生任何影响。在所附的图像中,您可以看到有2个单独的工作文件夹,但它们都使用单个存储库并共享内容。
s8vozzvw2#
化石、Git和其他可能的版本控制系统都有隐藏的想法。Pro Git has a section on stashing。它部分地说:
Stashing获取工作目录的脏状态(即修改过的跟踪文件和暂存的更改),并将其保存在一个未完成更改的堆栈中,您可以随时重新应用该堆栈。
换句话说,这是一种在做其他事情时保存当前工作的方法,而不会进行“真实的的”提交或影响存储库历史。