Git Stash vs Shelve在IntelliJ IDEA/Netbeans的区别

492
我对Git的“shelve”方面非常陌生(编辑:不是Git的一个方面,而是IntelliJ IDEA的“shelve”功能)。
如果“stash”用于搁置未完成的工作,那么“shelve”又是什么呢?你会用它做什么?
例如,在VCS菜单中的“Update Project”上。

Update Project option

在IntelliJ IDEA 2019.2中,你将会得到以下内容。

Update Project prompt window


27
shelve不是git命令。这个问题的背景是什么,这些术语来自哪里?shelve存在于其他一些工具中,但不是git的一部分。 - Jonah
2
Git stash类似于bzr、hg等中的“shelve”。您是在指一些git互操作包吗? - drRobertz
22
更多的赞同票可能会证实这个问题是有效的,而术语“Shelve”同样被误解为一个git命令。感谢您的提问,这也是我(从IDEA)的疑惑。 - PravyNandas
1
稍微有些不同的问题,但如果你因为找不到书架选项卡而被谷歌带到这里,请查看我在这里的答案:https://dev59.com/vl4b5IYBdhLWcg3wchJL#71167546 - Randy
6个回答

427

git shelve 在Git中不存在。

只有 git stash:

  • 当您想记录当前工作目录和索引的状态,但希望返回到干净的工作目录时使用 git stash
  • 它会保存您的本地修改并将工作目录恢复为与 HEAD 提交相匹配的状态。

您曾经有一个2008年的旧项目 git shelve 用于在分支中隔离修改,但现在这不再有太大用处。

正如Intellij IDEA 中的存储对话框所述,"存储和取消存储" 功能并未链接到 VCS(版本控制系统工具),而是链接到IDE本身,用于暂时存储您尚未在更改列表中提交的挂起更改。

请注意,自 Git 2.13(2017年Q2)以来,您现在也可以隐藏单个文件


130
原文:Turns out I misunderstood the concept. I thought it was a Git command when in fact it is a third party thing from IntelliJ IDEA. I could not find the git docs for it so thought I was missing something. https://www.jetbrains.com/idea/help/shelving-and-unshelving-changes.html翻译:事实证明我误解了这个概念。我以为它是一个Git命令,但实际上它是来自于IntelliJ IDEA的第三方工具。由于找不到相关的Git文档,所以我认为自己遗漏了某些内容。https://www.jetbrains.com/idea/help/shelving-and-unshelving-changes.html - Subtubes
6
您的文档链接指出,“shelves” 是仅由 IntelliJ IDE 管理的一组更改(补丁),与 Git 管理的标准“stashes” 不同。因此,请避免使用 shelves。 - barbara.post
3
在你的情况下,Jerry Chin建议您使用Shelve而不是Stash。他希望Git中有Shelve功能。Webstorm会占用大量内存,如果Git有Shelve功能并可以在命令行中运行,那将非常有用。 - digender mahara
3
有一个常见的应用场景,shelve涉及到这个场景而stash则不涉及——处理有问题的同事/公司惯例。有可能会将完全无用的内容添加到您的代码库中,但由于某人的疯狂行为,修复它可能不合适。 另一种选择是类似于git stash && <your actual command> && git stash pop 的方法,但那太麻烦了。自动储存和应用更接近我们需要的功能。 - smaudet
1
@VonC 相似但不相同 - 我有一个使用案例,我正在使用的项目具有我需要的设置,但不能提交,因为它们“不是标准的”。还有其他半打使用案例,涉及需要修改构建文件等等,以便进行本地开发与开发/测试/生产环境的区分。 - smaudet
显示剩余2条评论

250

在使用JetBrains IDE与Git时,支持“存储和取消存储”操作,除了还支持 “搁置和取消搁置”。这些功能有很多共同点;主要区别在于如何生成和应用补丁。Shelve可以处理单个文件或一组文件,而Stash只能一次处理整个更改文件集。这里有一些更多细节关于它们之间的差异。


22
似乎 shelvegit stash 更加灵活。 - Dmitry Davydov
15
有一个git stash -p命令,它比两者都更为强大。不幸的是,它只能在命令行中使用。 - The Vee
1
@TheVee 是的,就功能而言它非常类似于 shelve,感谢提供信息。 - Dmitry Davydov
14
实际上,自从Git 2.13(2017年第二季度)开始,你可以对单个文件进行贮藏... 阅读更多 - kyb
1
还有交互式的git stash -p阅读更多 - kyb
8
我发现当你需要每次自动生成文档时,shelve非常有用。Shelve会在.idea/shelve目录下创建一个文件,你可以将它添加到你的版本控制系统中并与团队共享,这样他们就可以应用这些更改并运行同样的任务。 - ingkevin

123
除了之前的回答外,我还有一个重要的说明: shelve 是 JetBrains 产品的一个特性(比如 WebStormPhpStormPyCharm 等)。它将被搁置的文件放在 .idea/shelf 目录下。 stashgit 的选项之一。它将被隐藏的文件放在 .git 目录下。

6
感谢您澄清这个关键问题。 - AmerllicA
1
它将被搁置的文件放入.idea/shelf目录中。+1 - samshers

36

如果我没有在其他地方分享我的更改,我希望将更改搁置而不是藏匿它们。

藏匿是git的一个功能,不允许您选择特定的文件或文件中的更改。搁置可以做到这一点,但这是一个特定于IDE的功能,而不是git功能:

enter image description here

正如您所看到的,我能够选择指定要包含在我的货架上的文件/行。请注意,使用stash无法这样做。

请注意,在IDE中使用货架可能会限制您的补丁的可移植性,因为这些更改未存储在.git文件夹中。

一些有用的链接:


6

Shelf 是 JetBrains 的一个功能,而 Stash 是 Git 的一个功能,用于同样的工作。你可以使用这两个功能之一在不提交并且不丢失工作的情况下切换到不同的分支。我的个人经验是使用 Shelf。


2
Shelve是IntelliJ IDE的一个功能。Stash是Git的一个功能。新版本的Git也允许你使用git stash -p来隐藏单个文件。
在我看来,Shelve比普通的stash具有合并多个存储库中变更的能力 shelve changes from multiple repos together

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接