(概念篇)Hello,Mac Git,I'm coming.

2019-06-10 22:57:19 浏览数 (1)

贺贺第 45 次推文~

LZ-Says:镜子碎了,再粘合,也恢复不了当初的样子。

本系列,仅限于个人学习总结,如有侵权,请联系博主进行删除~!

还请各位转载的小伙伴,将原文作者链接一并转发,写文不易,且行且珍惜~!

一、前言

想当年,从 SVN 小王八到如今的 Git,技术的变革,真是让人应接不暇。

LZ 一直常用的就是小王八,对 Git 是爱恨交加,遂果断采用可视化工具。

原以为就这样浪下去了,没想到,Enmmm,换了份工作之后,公司大佬,全栈比比皆是,相比之下,LZ low 到家了。

由于对 Git 的不熟悉,而且,之前 LZ 也只是玩哥儿们的 Mac Pro,对 Mac 操作也还停留初级朦胧的状态。遂,今日,来公司正好基于 Mac 来一波实战。

接下来,新手司机开车咯~

二、Git 初识

  1. Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  2. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
  3. 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 下载、安装:

安装下载地址:

https://sourceforge.net/projects/git-osx-installer/

安装界面如下:

无脑式安装,这里不做过多说明了。

具体详情,可点击下方链接进行查看了解学习L:

http://www.runoob.com/git/git-install-setup.html

三、Git 命令简单了解

一起来开搞,搞点事情,搞点命令~

3.1 git version

打开命令行,键入如下命令,查看当前本地安装 Git 版本:

代码语言:javascript复制
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”

同理,在命令行中依次键入如下命令,进行配置当前环境下用户名以及使用邮箱:

代码语言:javascript复制
git config –global user.name “用户名” 

git config –global user.email “邮箱”

如下图:

如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

一般网上大部分的教程都是安装 Git 之后配置用户名以及邮箱,LZ 当初不知道,俩眼一抹黑,哈哈~

可视化工具,让我忘记还有命令这么一说,2333~

2、git config –list

命令行中键入如下命令,查看当前配置信息:

代码语言:javascript复制
git config –list

如下图:

3、git config user.name/user.email

命令行中键入如下命令,查看当前具体配置信息:

代码语言:javascript复制
git config user.name / user.email

如下图:

4、git config –global core.editor 编辑器名称

命令行键入如下命令,设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置::

代码语言:javascript复制
git config –global core.editor emacs

LZ 还是使用默认的吧,懒得改。

5、git config –global merge.tool 差异分析工具名

命令行键入如下命令:设置在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

代码语言:javascript复制
git config –global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。

简单了解后,我们了解一下有关 Git 的工作流程~

四、Git 工作流程

一般工作流程如下:

  1. 克隆 Git 资源作为工作目录;
  2. 在克隆的资源上添加或修改文件;
  3. 如果其他人修改了,你可以更新资源;
  4. 在提交前查看修改;
  5. 提交修改;
  6. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

具体对应图如下(这里直接盗取现有图,链接在文末):

工作流程和我们之前使用小王八差不多,第一步都是需要拿到项目到本地,之后进行编辑,提交,其中也包含一些更新或者解决冲突等等,这里就不过多描述了。

五、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 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

概念性了解到此结束,欢迎大家点击原文查看~

欢迎各位老铁关注~不定期发布~见证你我的成长路~!!!

觉得不错,动动小手,转发让更多人看到,3Q,比心~

0 人点赞