git-stash与git-branch


92

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

我当时正在研究母版,并做了一些工作,然后决定要暂停该工作。我备份了一些提交,然后从开始垃圾工作之前分支。

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

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

与之相比git stash呢?当看起来一切git stash都已经由分支处理时,我很难理解这里的不同用例……


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

Answers:


109

'stash'将工作副本上未提交的,“ ”的东西藏起来,并将其藏起来,为您提供干净的工作副本。

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

git stash branch <branchname> [<stash>]

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

因此,如果您尚未致力于“ 错误的 ”分支,则隐藏将非常有用。

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


1
咬我的一件事...您能写出[<stash>]的实际样子吗!他们在文档中将其放在该表示法中,但是不清楚该值应该为1还是@ {1}或其他形式。
格雷格·林德

1
如果要引用特定的存储“ N”,请使用stash @ {N}
Jordi Bunster,2009年

9
请参阅git stash list以获取藏匿处的名称。
idbrii 2010年

6
格雷格,是的,您可以:git stash save(您的存储名称)。如果您经常使用它,将使其更有用,这样您就知道每个存储卡的功能。您可以使用git stash show -p(名称)向您显示存储的补丁。
Thomas Vander Stichele 2011年

7
git stash show -u可以显示与工作副本之间的存储差异。

49

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

存放您当前的更改

$ 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

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

我的博客上也对此有更深入的介绍


比所谓的“最佳”答案更有帮助的资源……(尽管最佳答案确实很清楚,但与充分使用有关的一些困惑)
kumarharsh

9

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

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

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

现在,我总是尝试分支,除非我绝对肯定要在同一天(即使在一小时内)回到那个秘密。


3
您是否在创建分支时没有给它们有用的名称?如果没有,那么我不明白为什么您不对藏匿处做同样的事情。如果您真的想知道它们包含的内容,则只需使用git-stash show来显示更改的文件,或者使用git-stash应用和git-diff来查看实际的差异。修剪藏匿处与控制分支机构一样。
熊基亚莫夫09年

18
实际上,您可以使用git stash drop [<stash>]
-kumarharsh

1
没错,git已经有很长一段时间使git stash掉落了。现在使用的PITA更少了。现在,我每天都使用它,甚至很长一段时间都使用它。
webmat 2011年

3

如果您寻找的工作流程可能比git stash更合适,则可能需要查看git-bottle。它是一个实用程序,用于在正常git提交时保存和还原各种git工作状态,从而有效地快照工作树的当前和相关状态以及git状态下显示的所有各种文件状态。

与的主要区别git stash

  • git stash狭义地保存脏git状态(已修改的文件以及索引中已添加的文件),而git-bottle旨在保存与有所不同的所有内容HEAD,并以保留方式区分已修改,已修改和未添加,未添加,未合并的路径,以及完整的变基/合并状态(仅.gitignore保存下面的路径)。
  • git stash将需要单独跟踪的对象保存到存储中。如果我在2周前藏了东西,我可能会不记得了,而git-bottle保存为对当前分支的暂定提交。反向动作git-unbottlegit stash弹出动作等效。可以在存储库之间推送和共享这些提交。这对于远程构建很有用,在远程构建中,您需要在远程服务器中拥有另一个存储库以进行构建,或与其他人就解决冲突进行协作。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.