git-stash与git-branch

时间:2020-03-05 18:46:28  来源:igfitidea点击:

在之前的Git问题中,Daniel Benamy谈论了Git中的工作流程:

I was working on master and committed some stuff and then decided I wanted to put that work on hold. I backed up a few commits and then branched from before I started my crap work.

他想将工作状态恢复到以前的时间点,而又不丢失当前的更改。所有的答案都以各种方式围绕着

git branch -m master crap_work
git branch -m previous_master master

这和git stash相比如何?我有点困惑试图在这里看到git stash所做的一切已经由分支处理的情况下的不同用例了

@Jordi Bunster:谢谢,这可以解决问题。我想我应该考虑"隐藏"像一个轻量级的,无名的分支。因此,存储可以做的任何事情,分支也可以做,但要增加更多的单词。好的!

解决方案

回答

'stash'将工作副本上未提交的,"脏"的东西藏起来,并将其藏起来,为我们提供干净的工作副本。

它根本不分支。然后,我们可以将隐藏项应用到任何其他分支的顶部。或者,从Git 1.6开始,我们可以执行以下操作:

git stash branch <branchname> [<stash>]

在一个命令中将隐藏项应用到新分支的顶部。

因此,如果我们尚未提交到"错误的"分支,则隐藏将非常有用。

如果我们已经提交过,那么我们在问题中描述的工作流程是一个更好的选择。顺便说一句,我们是对的:Git非常灵活,并且随着灵活性而产生了重叠的功能。

回答

我一直对git stash保持警惕。如果藏匿几次,事情会变得混乱。 git stash list会显示我们创建的stash的编号列表,如果我们提供了它们,还会显示消息...但是问题在于,除非残酷的git stash clear(将它们全部删除),否则我们无法清理stash 。因此,除非我们总是为自己的藏匿区提供超级描述性信息(有点违背藏匿区的哲学),否则我们最终将获得一堆无法理解的藏匿处。

我知道找出哪一个的唯一方法是使用gitk --all并找出藏匿处。至少,这可以让我们看到创建存储的提交,以及存储中包含的所有内容的差异。

请注意,我使用的是git 1.5.4.3,我认为1.6添加了git stash pop,我想它将应用所选的stash并将其从列表中删除。看起来更干净了。

现在,我总是尝试分支,除非我绝对肯定要在同一天,甚至在一小时内回到那个仓库。

回答

还原存储时,将重新应用所做的更改,并继续处理代码。

存放我们当前的更改

$ git stash save 
Saved "WIP on master: e71813e..."

我们也可以拥有一个以上的藏匿处。藏身像堆一样工作。每次保存新存储时,它都会放在堆栈的顶部。

$ git stash list
stash@{0}: WIP on master: e71813e..."

注意stash @ {0}部分吗?那就是你的藏匿ID。我们稍后将需要它来还原它。现在就开始吧。存储区ID随我们创建的每个存储区而变化。 stash @ {0}是指我们进行的最后一次存储。

申请藏匿处

$ git stash apply stash@{0}

应用后,我们可能会注意到该存储区仍然存在。如果我们不再需要它,可以将其删除。

$ git stash drop stash@{0}

或者,因为存储区的行为就像堆栈一样,所以我们可以弹出保存的最后一个存储区:

$ git stash pop

如果要擦除所有藏匿处,请运行"清除"命令:

$ git stash clear

很有可能是我们不经常使用藏匿处。如果我们只是想快速存储更改以在以后还原它们,则可以省略存储ID。

$ git stash
...
$ git stash pop

在将其用于某些非常重要的工作之前,请先对其进行试验。

我还在博客上发布了对此内容的更深入的介绍。