IntelliJ的Shelve和Git的stash有什么区别?

155

IntelliJ支持git存储和自己内置的暂存命令。它们在目的和效用上似乎几乎相同。它们之间有什么区别?


2
可能是Git Shelve vs Stash的重复问题。 - Vadzim
对于补丁管理,有quilt https://en.wikipedia.org/wiki/Quilt_(software)。它与版本控制系统无关,但在Windows上有些过时和问题,因为需要Bash。将其视为专有IntelliS Shelve的开放替代品。 - gavenkoa
4个回答

95

从IntelliJ 文档中:

在Git集成中,除了存储和取消存储外,还支持“藏匿”和“取消藏匿”。这些功能有很多共同点,唯一的区别在于生成和应用补丁的方式。

  • 具有隐藏更改的补丁是由Git本身生成的。以后应用它们时,您不需要IntelliJ IDEA。
  • 具有搁置更改的补丁是由IntelliJ IDEA生成的。通常,它们也是通过IDE应用的。在IntelliJ IDEA之外应用已搁置的更改也可能,但需要额外的步骤。

43
既然 shelving 只是与普通的 Git "不太兼容",那么它有什么优点呢? - MaxiWheat
28
如果你使用的版本控制系统没有原生的stash功能,那么搁置似乎会很有用。但如果你使用git,我看不出有任何真正的好处。 - Daniel Compton
10
“真正的好处”列在id.bobr的回答中。对我来说,最重要的是能够选择哪些文件/块进行存储,就像提交时一样。 - Martin Melka
4
自 Git 2.13 版本以来,使用 git stash push 可以对单个文件进行存储。 - Deric Lima
1
Shelve 给你更好的概览,了解里面有什么和有何不同。只应用改变文件的某些部分更容易。一开始我对这个功能不太信服,但现在我使用它的频率比藏匿更高。 - itachi
显示剩余2条评论

81

它们非常相似,但有以下几点区别:

  • 不能在IDE之外使用shelve,因为这是Intellij的功能。
  • Git stash仅适用于整个工作目录和索引。IntelliJ的shelve可以处理单个文件和更改列表(另一个IntelliJ的功能)。如您所见,例如此处,有时是必要的。
  • Idea具有更好的内置shelve支持。使用git stash更加简单。特别是,您可以从版本控制工具窗口储存/取消储存您的更改或审核已储存的文件。

此外,在我看来,shelve的速度略快,尤其是在大型项目中,当有许多文件被更改时。

更多信息请参见文档


我发现右键单击一个不变的东西以快速将其搁置非常有用。正如你所提到的,我发现这样稍微更快一些。 - vikingsteve
22
“Git stash 仅适用于整个工作目录和索引” - 这是错误的。Git stash 也可以储藏单个文件或文件夹 - 例如:git stash -- foo/bar.txt - Chaoz

38

Intellij的临时储存Shelve相对于纯Git的暂存stash有一个明显的优势,就是使用Shelve时,您可以将属于多个仓库的更改保存在一个变更列表中。而使用stash,则需要在每个仓库中分别进行暂存/恢复。这在具有多个模块(每个模块都有自己的仓库)的大型项目中非常有用,其中特定的功能工作可能跨越多个模块(因此涉及多个仓库)。


3

以下是文档中的说明:

存储更改与搁置更改非常相似,唯一的区别在于生成和应用补丁的方式不同。Git 生成了存储,可以从 IntelliJ IDEA 内部或外部应用。带有搁置更改的补丁由 IntelliJ IDEA 生成,并通过 IDE 应用。此外,存储涉及所有未提交的更改,而将更改放入搁置时,您可以选择其中一些本地更改而不是全部搁置。


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