前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(概念篇)Hello,Mac Git,I'm coming.

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

作者头像
贺biubiu
发布2019-06-10 22:57:19
3830
发布2019-06-10 22:57:19
举报
文章被收录于专栏:HLQ_StruggleHLQ_Struggle

贺贺第 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,比心~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 贺biubiu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档