我不完全确定git如何实现检出,但可能是它正在删除磁盘上的文件(对应于工作副本),并从其内部表示中将文件写入工作副本。所以在我看来,如果你有一个包含大量文件的项目,就磁盘I / O而言,git checkout应该是一件昂贵的事情。但通常似乎并不需要这么长时间(尽管我可能只是处理小到足以让它无关紧要的存储库)。那么git是以比我想象的更聪明的方式做到这一点,或者是否有其他考虑因素在这里,或者事实上git checkout是昂贵的,我只是没注意到因为我有好处足够的硬件?
答案 0 :(得分:3)
如果您完全在项目的两个几乎完全不同的方面之间进行交换,以便通用性最小化,并且差异很大,那么git和其他VCS系统都需要删除并替换整个数据负载。在这一点上,实现效率很重要,即使在那里,git通常也有优势,因为它有一个完整的本地文件副本,而不是必须忍受你和远程网络之间的网络延迟回购。
如果您只是在项目的相当类似版本中的分支之间交换,那么您有很多预先存在的共性,并且git知道这一点,所以不需要为这些文件做任何事情。它需要做的只是一点文件恢复,你已经完成了。
Plus git通常针对速度进行优化。 git@vger.kernel.org线程通常具有速度优化和速度比较,因此它很重要,但其他一些系统并不总是如此 - 拥有本地仓库是关键!
答案 1 :(得分:2)
这是苹果和橘子。例如,git checkout
与svn revert
的共同点多于svn checkout
。
git checkout
仅适用于本地文件系统。 git push
,git pull
用于与远程存储库同步,git clone
用于下载远程存储库。
实际git checkout
将您的工作文件夹与本地存储库进行比较,并将文件更新为存储库的版本。全部在本地完成,并且带有与'git status'或'svn status'大致相同的开销。
答案 2 :(得分:0)
就像@Doug Kress所说,git checkout
是你的盒子的本地。性能仅基于IO性能和文件系统的效率。因此,真正的考虑因素是文件系统效率低下或IO性能不佳。
来自git update-index
手册:
git中的许多操作都依赖于您的文件系统来提高效率 lstat(2)实现,使st_mtime信息为工作树 可以廉价地检查文件以查看文件内容是否已更改 从索引文件中记录的版本。不幸的是,一些 文件系统lstat(2)效率低下。如果您的文件系统是其中之一 它们,您可以将“假设未更改”位设置为您未更改的路径 导致git不做这个检查。
http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html