使用git,在Visual Studio中能否切换分支而不删除旧分支?

4
我对Git还不熟悉,我们正在从TFS 2010转换到Git。我们在远程服务器上创建了一个新的主分支和3个从属分支。我安装了VS插件并克隆了远程仓库,将所有主文件下载到本地仓库。
现在,当我基于其他远程分支创建新的本地分支时,它会删除主分支的所有本地文件,并用新检出的分支的文件替换它们。当我再次切换到主分支时,它又会删除本地分支并用主分支替换它。
是否有一种方法可以保留本地文件,以便快速切换分支,而不必每次重新下载所有文件?

当您检出一个分支时,Git不会下载任何内容。这应该是一个非常快速的操作。您是否有在分支中存储非常大的文件和/或您的本地存储库实际上是映射的网络设备? - giusti
4个回答

6

与 TFVC 不同,Git 下载整个仓库到本地磁盘。从这个仓库中,它创建了一个工作目录,其中包含您所检出的版本/分支的文件。

当您从一个分支切换到另一个分支时,Git 仅替换与本地缓存不同的文件。在切换时没有传输任何文件。

这意味着,与 TFVC 不同,在同一仓库(TFVC 工作区)中无法同时打开两个分支,而是需要再次克隆仓库(可以创建整���仓库的本地副本),并在第二个仓库中检出另一个分支。当您想要同一分支的两个不同版本时,在 TFVC 中也是如此。为此,您需要创建第二个工作区。

这一切背后的原因是,在 Git 中,分支只是指向版本的指针。在不同分支之间切换就像在版本之间切换一样。因为 Git 有所有在仓库中进行的更改的本地拷贝,所以切换非常快速和高效(当然,这取决于仓库的大小)。


1
可以在一个仓库中同时检出2个分支,而不需要重新克隆它。请看一下 git worktree - Philippe
不错,尽管Visual Studio 2015及以前的版本可能无法理解。它的git功能仍然有些有限。2017年将会有相当大的改变。 - jessehouwing
Visual Studio永远无法做到Git所能做的事情。因此,有时候我们应该接受在它之外完成某些任务;-) - Philippe
完全同意。只是想让震惊少一点 :). - jessehouwing
1
显然,我完全误解了git的工作原理。当我进行checkout时,它并没有下载远程分支;它只是设置了所有本地差异。由于分支之间有超过500K个文件差异,所以这需要很长时间。我猜想在最初制作它们时,某人搞砸了什么。 - mrplainswalker

0
通常情况下,如果检出一个分支,git 已经在本地拥有所有的分支,因此不需要进行额外的下载。

1
嗯,我不知道该说什么,除了对我来说这并不是发生的事情。如果我选中“分支1”,然后检出“分支2”,再在Windows资源管理器中查看目录,那么“分支1”将会消失,并被“分支2”所替换。如果我切换回去,它也会做同样的事情。如果不需要花费10分钟重新下载每个文件,我不会在意。在TFS中,我可以本地映射任意数量的分支,当我拉取最新版本时,它会下载差异部分。它不会总是重新下载整个文件结构。 - mrplainswalker
1
当然,通过更改分支来替换文件是有意义的。否则就没有意义了,对吧?但是分支也是文件状态的快照,所以下载时要小心。请参阅https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell,详细描述了Git分支概念。 - triplem
我认为OP实际上缺少工作/阶段/提交的概念。当你检出一个分支时,Git只是更新了工作区。分支并没有被删除。通常情况下,没有必要同时拥有两个分支。Git的工作流程经常涉及分支和合并。为了最好地使用Git,OP将不得不“忘记”一些他们习惯的概念。 - giusti

0

当你克隆一个仓库时,所有的历史记录、分支和文件都会被下载并放在'.git'文件夹中,同时还有其他一些数据。

当你检出一个分支时,工作区会更新本地文件(无需下载!)

通常情况下,检出操作很快。如果不是这种情况,那么你可能有问题,需要对其进行修复。

与TFVC不同的是,你不应该提交二进制文件或大文件。因此我的建议是使用'BFG repo cleaner'来清理你的历史记录。

如果这不是真正可行的方法,也许你应该考虑使用'git-lfs'(由Tfs和其他git服务器支持)。

但是,从短期来看,如果你想像在TFVC中那样在2个不同的目录中检出2个分支,也许你可以尝试一下'git worktree'。

但是,这并不能发挥git的真正威力 :-(


0

在git中,如果您切换到另一个分支,之前的分支不会被删除。正如上面的评论所述,working/staging/commit中提到的文档已经很好地解释了这一点。

Git是分布式的,因此所有分支都存储在每台机器上,您已经获取或拉取了它。整个仓库的历史记录都存储在您的机器上。

显然,有一种方法可以删除分支(本地和远程),但这不是当前问题的一部分。


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