背景
项目开发过程中使用的版本控制工具是 SVN,Git 多有耳闻,以前也偶尔玩过几次,但是工作中不用,虽然本地也有环境,总是不熟练。
最近看一本网络开源技术书时,下载源码部署了一下,又温故了一下 Git 的用法,思考一个问题:如果现在我们的版本控制工具从 SVN 转换到 Git,我能不能直接上手呢?
本文汇总一下 Git 的基础知识和转换需要的基本流程,要上手也是没问题,资料来源于网络,说实话,资源真是多啊,如果真要换 Git ,现学现用足够了。
Git 原理
- Git 是什么?Linux 的源代码版本控制工具,在 BitKeeper 收费后,该团队自己开发的一个版本控制工具。
- Git 和 SVN 的区别是什么?存储方式不同。
Git 存储的是全量快照:
途中的虚线是指相对上个版本没变化的文件,那么它就只存储一个指向上个版本的指针,其他变化的文件作为本版本的文件。而 SVN 保存的差异信息:
版本 V2 记录了相对 V1的增量变化内容。
Git 的基本思想:
- 分布式版本控制工具,每个主机上的本地仓库都是一个节点,commit 也只是提交到本地仓库的,然后通过 push 到原创共享仓库。
- 直接记录快照,而非差异比较。
- 近乎所有的操作都在本地执行,除了推送操作外。
- 时刻保持数据的完整性。
- 多数操作都是添加数据的操作。
- 文件的三种状态:CMS「客户管理系统缩写记住它们」(Commit、Modified、Stated)
Git 操作
Git 的常用操作:
- git init
- git clone
- git add
- git commit
- git pull
- git fetch :与 git pull 的区别是,不会自动合并,用于需要人工比对差异的情况,然后再手动执行 merge。相当于查看变动,如果没有冲突或者没有问题,就可以直接执行 pull 拉取操作了。
- git push
- git log
- git status
- git config
Git 的换行配置
- LF:line feed(单个字符\n),Linux 下的换行符号,含义:换行。
- CRLF:carriage return line feed(回车换行,两个字符:\r\n),Windows下的换行符号。
LF 和 CRLF 的历史遗留故事,Windows 操作系统和 Linux 操作系统的差异为版本控制带来的问题。
解决办法是配置 core.autocrlf
。
true :最初的换行符号提交到 Linux 上了,都是 LF,但是下载到本地的时候,自动转换为 CRLF,为了 Windows 系统而推荐的配置。
input:所见即所得,适合 Linux 和 macOS。
结论就是:在 Window 主机上的配置应该为 true ,自动处理行尾,在 Linux 或 MAC 上设置为 input ,所见即所得,本地获取时不处理行尾。
SVN 日常操作
本地使用的 SVN 工具是 SnailSVN,日常基本操作有:
- 检出
- 更新
- 提交
- 查看日志
- 变更比对
Git 工具
Git 的也有图形化工具 SourceTree,界面很清爽,对比 SVN 的日常操作,有这个工具就够了,尤其是它能直接在界面上显示待提交的文件变化:
这个功能太好了,尤其是我在 SVN 使用的时候,都是在文件目录下逐个对比差异的。
直接找到 SourceTree 的工程路径,然后在 IDEA 中打开就可以了,所有的修改状态自动对应到当前选中的分支上。
论工具的使用,本人还是属于熟练工的一种吧!各种技术、工具啊,真的是够多的,像我这种只会用工具、抽象创造力匮乏的人,算不上科技人才吧,妥妥的工具人!
启示录
IDEA 里面有 Git 的工具了,SourceTree 都省了。不过分开有个好处就是:IDEA 里面专注代码编写,SourceTree 里面专注代码提交。
最后还有一个疑问:Git 分支切换过程中,被导入 IDEA 中的项目源码会自动跟着切换吗?我可不可以一边对分支 A 编码,一边再切换到分支 B 呢?
Git 有一个限制:分支切换时,需要决定在当前分支上的修改内容是否需要提交,如果选择忽略改动的话,所有文件的修改就被丢弃。
就是说分支可以随便切,但是必须决定如何处理本地变更。
回顾一下 SVN 的分支管理:创建新分支,导出项目源码到本地,导入到 IDEA,开发。创建的分支越多,就需要重复执行代码检出操作,占据的磁盘空间就会堆积越多。开发过程中,不同分支直接的切换操作也很麻烦。对比来看,Git 的分支管理确实很方便。
最后一个疑问:一个 Git 库下所有分支的代码是共用同一份源代码的磁盘空间的吗?SVN 的不同分支,检出来源码都是独占一份磁盘空间的,Git 是这样的吗?感觉 Git 不同分支的源码存储空间跟 SVN 不一样的,但是没找到说明依据。