LZ-Says:镜子碎了,再粘合,也恢复不了当初的样子。
本系列,仅限于个人学习总结,如有侵权,请联系博主进行删除~!
还请各位转载的小伙伴,将原文作者链接一并转发,写文不易,且行且珍惜~!
一、前言
想当年,从 SVN 小王八到如今的 Git,技术的变革,真是让人应接不暇。
LZ 一直常用的就是小王八,对 Git 是爱恨交加,遂果断采用可视化工具。
原以为就这样浪下去了,没想到,Enmmm,换了份工作之后,公司大佬,全栈比比皆是,相比之下,LZ low 到家了。
由于对 Git 的不熟悉,而且,之前 LZ 也只是玩哥儿们的 Mac Pro,对 Mac 操作也还停留初级朦胧的状态。遂,今日,来公司正好基于 Mac 来一波实战。
接下来,新手司机开车咯~
二、Git 初识
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
2.1 Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统 (CMS),工作管理系统等。
而下面,我们一起来了解一下又挂 Git 与 SVN 区别:
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别;
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn,.cvs 等的文件夹里;
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点不特别,就是版本库中的另外的一个目录;
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征;
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
这里补充下有关集中式和分布式的区别(基于廖神 Git 教程,文末见链接地址):
CVS 及 SVN 都是集中式的版本控制系统,而 Git 是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
针对集中式版本控制系统而言,版本库是将数据集存放于中央服务器,而工作时,我们需要将服务器数据也就是项目拉取到本地,开发完毕推送当服务器上。
而集中式版本控制系统最大的毛病就是必须联网才能工作,而且最坑的一点就是,网速 low 到爆的时候,上传文件几乎会奔溃。
与集中式不同的便是分布式版本控制系统,这个系统主要、最鲜明的特别便是,安全性会比集中式高很多,试想一下,SVN 服务器挂了,你还能玩么?痛不欲生呢。而分布式,每个人都可以理解为是一个服务器,每个人都具有完整的版本库,任何一方出现不可避免的问题,都可以很快速从其他站点(同事)克隆 / 复制 一份即可。
但是在实际工作中,分布式也会有一台服务器或者版本存放工具作为服务器,当我们修改文件后,将修改后的内容推送到服务器上,而其他人只需要直接更新即可。
当然,Git 的优势有很多,不仅仅是如上不联网,还有强大的分支管理等等优势足以碾压当年我们的小王八。
2.2 下载、安装:
安装下载地址:
安装界面如下:
无脑式安装,这里不做过多说明了。
具体详情,可点击下方链接进行查看了解学习L:
三、Git 命令简单了解
一起来开搞,搞点事情,搞点命令~
3.1 git version
打开命令行,键入如下命令,查看当前本地安装 Git 版本:
git version
如下图:
当前 LZ 安装的版本为:2.1.18
3.2 git config 系列
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。
这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件;
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件;
- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
1、git config –global user.name/email “content”
同理,在命令行中依次键入如下命令,进行配置当前环境下用户名以及使用邮箱:
git config –global user.name “用户名”
git config –global user.email “邮箱”
如下图:
如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
一般网上大部分的教程都是安装 Git 之后配置用户名以及邮箱,LZ 当初不知道,俩眼一抹黑,哈哈~
可视化工具,让我忘记还有命令这么一说,2333~
2、git config –list
命令行中键入如下命令,查看当前配置信息:
git config –list
如下图:
3、git config user.name/user.email
命令行中键入如下命令,查看当前具体配置信息:
git config user.name / user.email
如下图:
4、git config –global core.editor 编辑器名称
命令行键入如下命令,设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置::
git config –global core.editor emacs
LZ 还是使用默认的吧,懒得改。
5、git config –global merge.tool 差异分析工具名
命令行键入如下命令:设置在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:
git config –global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。
简单了解后,我们了解一下有关 Git 的工作流程~
四、Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录;
- 在克隆的资源上添加或修改文件;
- 如果其他人修改了,你可以更新资源;
- 在提交前查看修改;
- 提交修改;
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
具体对应图如下(这里直接盗取现有图,链接在文末):
工作流程和我们之前使用小王八差不多,第一步都是需要拿到项目到本地,之后进行编辑,提交,其中也包含一些更新或者解决冲突等等,这里就不过多描述了。
五、Git 工作区、暂存区和版本库了解
我们首先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是电脑里能看到的目录,也就是平时我们开发写代码的地方。
- 暂存区:英文叫 stage, 或 index。一般存放在 “.git 目录下” 下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
Enmmm,一知半解,接下来通过流程图,我们看看能否有进一步的理解吧。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
左侧为工作区,也就是我们第一步将项目克隆/拉取到本地之后进行开发的环境,可以理解为我们电脑本地工作区;
右侧为版本库,标记为 “index” 的区域就是暂存区,而标记为 “master” 的是 master 分支所代表的目录树。
简单可以理解为:
当我们本地工作区修改后的内容通过 add 添加到版本库中的暂存区,当我们进行最终的 commit 时才会进行最后提交,也就是正式提交到版本库中。当然,其中包含切换分支等等。这里仅仅作为一个简单理解,如果 LZ 理解有误,欢迎指正沟通。
下面先简单为大家贴出教程为我们总结的小内容:
- 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换;
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容;
- 当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中;
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树;
- 当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响;
- 当执行 “git rm –cached ” 命令时,会直接从暂存区删除文件,工作区则不做出改变;
- 当执行 “git checkout .” 或者 “git checkout – ” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动;
- 当执行 “git checkout HEAD .” 或者 “git checkout HEAD ” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
六、个人公众号
不定期发布博文,感谢已关注各位老铁理解,谢谢~
参考资料
- Git 官方:https://git-scm.com;
- Git 教程 | 菜鸟教程:http://www.runoob.com/git/git-tutorial.html;
- 廖雪峰 Git 教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000;