为什么可以在 SVN 中切换未提交更改的分支?

Why can you switch branch in SVN with uncommited changes?

我来自 git,所以也许我遗漏了什么。查找以下示例:

假设我有分支 master 和分支 release,我在 master 中做了一些更改,然后我切换到 release 而不提交更改,在 git 中我会得到类似 "Cannot switch branch with uncommitted changes, please commit or stash them" 的东西。然而,根据我最近在我的新公司使用 SVN 的经验,我不仅可以毫无问题地切换分支,而且我的更改仍然存在!

我有点困惑,希望能提供一些指导。

只需签出包含您需要的分支的新工作副本。使用 Subversion,您可以拥有无​​限数量的工作副本。

简短回答:它就是它的样子,因为开发人员希望它是那样的。

如您所述,git 告诉您如何获得 svn 行为(通过执行 git stash && git checkout xyz && git stash pop)。

长答案:我认为 git 开发人员喜欢这样做的原因是因为在结帐期间保留您的更改最终是一个三向合并操作。这些会引起冲突,一般是"heavy"。通过强制 git checkout 仅在干净的工作目录上可用,可以保证 git 要么快速无痛地失败,要么成功。

当您进行合并并且您的工作目录不干净时也是如此。 git 也会拒绝该操作。

这一切都是为了保护你。未提交的工作目录(和索引)更改不受提交保护。如果出现问题,它们将永远消失,无法恢复。当您使用 git 时,合并冲突解决失败是极少数可能出错的事情之一,而 git 无法避免这种情况(因为解决是人为操作)。

所以,如果 git 允许 checkoutmerge 进入一个不干净的工作目录,它必须为你在后台;设计决定只是将其留给您,并避免可能导致数据丢失的奇怪星座。