对于用过 Git 和 Subversion 的人绝大多数都会对比这两者的命令;从 Subversion 切换到 Git 的用户 通常会经常纠结为什么 Git 的 clone 命令 不叫 checkout,为什么 commit 命令不会推送到远程仓库;反之,从 Git 切换到 Subversion 的用户也会有类似的纠结;对于在 Git 和 Subversion 频繁切换的用户,如果不理解其中的原因,还会导致经常混淆;本文就对比下 Git 和 Subversion 的命令和操作流程,并解释下这些命令的本质,以及这些命令看起来不同实则相同的原因;
- 如果你还在纠结 Git 和 Subversion 选择哪个,请看选择Git的理由
- 如果你还不了解Git,你可以阅读Git基础教程
- 如果时常忘记Git的命令名字或语法格式,Git命令大全 值得你收藏,它可作为你的Git命令查询手册;
- 如果你的Git项目管理混乱,你应该看看Git并行工作流程规范;
- 如果遇到了Git方面的难题,Git技巧和问题解决方案兴许能够帮到你
对于用过 Git 和 Subversion 的人绝大多数都会类比这两者的命令;
先来看下 Git 和 Subversion 命令操作的时序图:
Git操作时序图:
Git操作时序图
Subversion操作时序图:
Subversion操作时序图
从操作时序图上来看,绝大多数人可能感觉:
- Subversion 的 checkout 命令的作用 相当 Git 的 clone 命令的作用;
- Subversion 的 commit 命令的作用 相当 Git 的 push 命令的作用;
- Subversion 的 update 命令的作用 相当 Git 的 pull 命令的作用;
其中第3点我不反对,但对于 第1点 和 第2点的认识说明了一个问题:
- 还没明白 checkout 和 commit 命令的本质操作;
- 还没明白 Subversion 和 Git 的最大区别————集中式版本控制系统 与 分布式版本控制系统区别;
-
Subversion是集中式版本控制系统:
集中式 -
Git是分布式版本控制系统:
分布式
-
如果不明白这些问题,对于从 Subversion 切换到 Git 的用户会经纠结;
其实 checkout 和 commit 命令 在 Git 和 Subversion 中的本质操作都是一样的:
checkout命令的本质操作:
checkout 命令的本质操作是将版本库中的目录树取出并放到工作区中;
在 Git 中,由于 Git 是分布式版本控制系统,版本库在本地,所以 checkout 时不需要从远程仓库拿,只需要从本地仓库中取出目录树即可;
而 Subversion 是集中式版本控制系统,版本库在远程服务器上,所以 checkout 时需要从远程仓库来取出目录树;这也是用 checkout 命令从远程仓库拉取项目的原因;
commit命令的本质操作:
commit命令的本质操作是将暂存区中的变更纳入到版本库中;
由于 Git 是分布式版本控制系统,版本库在本地,所以 commit 时不需要将变更数据发送到远程仓库,只将变更添加到本地仓库中即可;
而 Subversion 是集中式版本控制系统,版本库在远程服务器上,所以 commit 时需要将变更数据发送到远程仓库服务器,由远程仓库服务器创建新的版本节点;这也是用 commit 命令可以将数据同步到远程仓库的原因;
网友评论