Git 介绍

一,理解 Git

1,分布式版本控制

Git 版本控制系统的设计思想是"去中心化"。传统的 CVS 、SVN 等工具采用的是 C/S 架构,只有一个中心代码仓库,位于服务器端。而一旦由于服务器系统宕机、网络不通等各种原因造成中心仓库不可用,整个 CVS 、SVN 系统的代码检入与检出就瘫痪了。

为了摆脱对中心仓库的依赖,Git 的初始设计目标之一就是分布式控制管理。即每个成员本地都是一个完整的版本库,都可以看成是中心仓库。Git 分布式的设计理念有助于减少对中心仓库的依赖,从而有效降低中心仓库的负载,改善代码提交的灵活性。

2,离线操作

由于整个仓库都在本地,很多操作可以在不需要联网的时候进行。比如代码提交到仓库、创建合并分支、打 tag 等,只有涉及到多人合作,需要将本地的改动推送给别人时,才需要联网push本地仓库。

3,文件快照

Git 和其他版本控制系统的另一个主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。下图是 CVS、SVN 记录文件内容差异的方式

同样是文件变更提交,Git 底层文件系统存储的则为文件快照,即整个文件内容,并保存指向快照的索引(根据内容生成的一串hash值),如下图所示。如果文件内容没有发生任何变化,该文件系统则不会重复保存文件内容,只是简单地保存文件的链接。

这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。

二,文件在 Git 中的几种状态

  • untracked(未跟踪):文件尚未被 Git 纳入到跟踪内容,比如在 Git 中新建一个文件 a.txt,这个文件当前状态就是 untracked
  • unmodified(未修改):文件在 Git 跟踪内容下,但是没有任何更改,比如 clone 一个项目,此时项目中的文件都是 unmodified
  • modified(已修改):文件在 Git 跟踪内容下,经过编辑,但还没有提交保存
  • staged(暂存):表示把已修改的文件放在下次提交时要保存的清单中
  • committed(已提交):表示该文件已经被安全地保存在本地版本库中了

以上状态都是在本地完成转换,不需要依赖于服务器。理解了上面的几种状态,也就理解了Git 的基本工作模式了。下图介绍了几种情况下的文件状态转换

相关命令的简要说明如下:

git add [file]:把当前工作文件加入到暂存区域 git commit:在暂存区域生成文件快照并提交到本地仓库 git rm --cached [file]:删除文件在工作区中的索引,即文件回到未跟踪状态 git reset HEAD [file]:撤销文件暂存,可以理解为 git add [file] 的反操作 git checkout -- [file]:把文件从暂存区域覆盖到工作目录,用来丢弃本地修改

三,Git 分支管理

传统的版本管理软件(如 SVN),分支操作实际上会生成一份现有代码的物理拷贝,每个分支都有自己完全独立的代码。而 Git 的分支只是一个指向当前版本的指针,新建一个分支相当于增加了一个指针,因此分支的新建和切换非常的快捷。

git 基于 master 创建特性分支 featureA:
$ git checkout -b featureA master 

将 featureA 分支合并到 master: 
$ git checkout master 
$ git merge featureA 

删除分支 featureA:
$ git branch -d featureA

下面介绍一种比较实用的 Git 分支模型

  • 主分支 master:代码库中默认的主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。正常情况下,每次有变化被合并到 master 分支时,就是一次新的发布,因此可以设置一个 hook,在 master 有提交时,自动执行 hook 脚本来开启构建程序并部署代码至发布环境服务器。
  • 开发分支 develop:与 master 平行的分支,用于日常开发,如新建、合并特性分支, bugfix等。当 develop 分支上的代码到达一个稳定的状态时,就可以发布版本。所有 develop 上的变更都应该以某种方式合并回 master 分支。
  • 特性分支:为了开发某种特定功能,从 develop 分支上面分出来的。开发完成后,需要再并入 develop。
  • 预发布分支:特性分支开发完成并测试 OK 后,需要合入 develop 分支,此时 develop 代码相对比较稳定,但还是需要进一步测试(比如过整站)。于是我们需要单独创建一个预发布分支,进行一些小的 bugfix 修改。预发布分支测试完成后,必须合并进 develop 和 master 分支,再执行发布。
  • hotfix 分支:处理现网紧急 bug。 hotfix 分支直接从 master 分支上面分出来,修补结束以后,再合入 master 和 develop 分支。

上面五种分支,除了 master 和 develop 分支是一直存在的外,其他分支都是暂时存在,发布完成即需要删除。

四,Git 子模块:

Git 子模块和 SVN 里面的 externals 相似,即在代码库的子目录中中引入另外一个代码库,并保持两个仓库的独立性。

在 Git 仓库中添加一个子模块 rack:

$ git submodule add git://github.com/chneukirchen/rack.git rack

这时会生成一个 .gitmodules 文件。这是一个配置文件,保存了项目 URL 和你拉取到的本地子目录,执行 cat .gitmodules 看看里面的内容

$ cat .gitmodules
[submodule "rack"]
      path = rack
      url = git://github.com/chneukirchen/rack.git

尽管 rack 是工作目录里的子目录,但 Git 把它视作一个子模块。两者之间本质上是两个独立的 Git 仓库,所有的 Git 命令在两个目录中都是独立工作。

五,工具介绍:

1,sourcetree:一款功能强大的 Git GUI 软件,大部分 Git 命令都可以在上面实现。重点是它将 Git 的所有 log 可视化,非常清晰的看出各个分支的走向。

下载地址:https://www.sourcetreeapp.com/download/

2,BeyondCompare:合代码必备神器,支持 MAC

下载地址:http://www.scootersoftware.com/download.php

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

虚拟化平台cloudstack(3)——安装(下)

登录时用户名和密码错误 默认账号密码 admin/password 管理节点安装好后,初始化数据库,完了使用admin和password登陆提示用户名密码错误...

3639
来自专栏北京马哥教育

CentOS系统启动流程你懂否

一、Linux内核的组成 相关概念: Linux系统的组成部分:内核+根文件系统 内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序。 ...

3325
来自专栏北京马哥教育

逼格高又实用的 Linux 高级命令,开发运维都要懂

1395
来自专栏移动安全

移动安全-应用加固命令行工具jar包使用说明

为方便用户快速集成到自动化任务中,乐固加固推出命令行工具。该工具是一个jar包(支持基础版、专业版、企业版),提供上传apk、下载加固包功能。下载的加固包需要用...

4328
来自专栏格子的个人博客

CentOS7下安装Mesos教程

Mesos是根据Linux内核相同原则而创建的,而不同点仅是在于抽象的层面。Mesos内核运行在每一个机器上,同时通过 API 为各种应用提供跨数据中心和云的资...

792
来自专栏码代码的陈同学

Rancher无法启动healthcheck和lb

一个新产品临近上线,全部采购了腾讯云ECS服务器,安装了Rancher 1.6.17做容器编排。在添加主机到服务器集群时,rancher的 healthchec...

26611
来自专栏北京马哥教育

RedHat Linux服务器安全配置细节

云豆贴心提醒,本文阅读时间8分钟 1.概述 Linux服务器版本:RedHat Linux AS 2.1 对于开放式的操作系统---Linux,系统的安全设...

2726
来自专栏FreeBuf

OpenStack:建立虚拟的渗透测试实验环境 – 网络篇

0x00 概述 对一个沙箱环境而言,其中最重要的一点就是网络的隔离,OpenStack网络支持Flat、VLAN、VXLAN等模式,配合路由器和防火墙可轻松虚拟...

3087
来自专栏数说工作室

零基础搭建分布式集群的几个方法

大家好,许久没更新了,这段时间忙着换工作和交接过度(对,换工作了);另一方面,这段时间试着搭建了一下分布式集群,本来打算跟大家详细分享一下,由于是零基础,中间还...

3395
来自专栏C/C++基础

Linux基础知识点

文件(包括目录)权限分为三类别,从左至右依次是:文件所属主的权限、文件所属所在用户组的权限和其他用户的权限。

732

扫码关注云+社区