一,理解 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

Git 介绍的更多相关文章

  1. Git介绍及常用操作演示(一)--技术流ken

    Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...

  2. 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...

  3. 【转】Git介绍

    版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3. ...

  4. git介绍和常用指令

    Git介绍和常用指令 介绍:Git和SVN一样都是版本控制工具.不同的是Git是分布式的,SVN是集中式的.Git开始用可能感觉难点,等你用习惯了你就会觉得svn是有点恐怖.(如果一个项目有好多人一起 ...

  5. git介绍及安装

    git介绍 git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目.git是linus Torvalds为了帮助管理Linux内核开发的一个开放源码的版本控制软件. Git 与常用 ...

  6. CI 知识 :Git介绍及常用操作

    Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...

  7. Git介绍与简易搭建

    Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...

  8. Git介绍、安装、命令和实战

    一.Git介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 二.Git安装(Mac系统) 在Git官网下载安装包双击直接安装 在终端输入git来检测Git ...

  9. git介绍-常用操作(一)

    Table of Contents 1  系列文章 2  git说明 3  git常用命令 3.1  基本操作 3.2  远程操作 4  查看git的配置 4.1  查看已配置项 4.2  其他配置 ...

  10. 版本控制工具Git介绍-01

    使用版本控制工具是为了方便团队开发,比如多人共同维护一个项目的时候,用版本控制工具可以很方便的维护项目代码,如果哪天你改了一个版本,出问题了,我们也可以很快的找到你改了什么,这里介绍使用比较多的版本控 ...

随机推荐

  1. Rectangle and Square

    Description Little Petya very much likes rectangles and especially squares. Recently he has received ...

  2. abiword Namespace List

    abiword Namespace List Here is a list of all namespaces with brief descriptions: abicollab  这个命名空间以及 ...

  3. OC 代理 协议 委托 数据源的概念

    (网摘) OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 ): 数据源就是对象遵循了存储数据的协议,可以存储使用数据 协议表示了方法可 ...

  4. js void运用

    谈谈Javascript中的void操作符 http://segmentfault.com/a/1190000000474941 总结: void有如下作用: 通过采用void 0取undefined ...

  5. SD/MMC卡初始化及读写流程

    二.MMC/SD卡的模型和工作原理 PIN脚.SD卡总线.SD卡结构.SD卡寄存器.上电过程 SD卡寄存器:  OCR:操作电压寄存器: 只读,32位 第31位: 表示卡上电的状态位   CID: 卡 ...

  6. MongoDBAuth

    1,mogoDB 认证登陆

  7. 【转】android camera(三):camera V4L2 FIMC

    关键词:android  camera CMM 模组 camera参数  CAMIF   V4L2  平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...

  8. 用Python实现九九乘法表

    1.用“#”组成的矩形的实现 代码 eight = int(input("Height:")) #用户输入高度 width = int(input("Width:&quo ...

  9. java中return和continue区别

    编程语言大多是想通的,当然java也不例外,下面的在其他编程语言也是相同的道理. return与continue的区别 先看代码哦 class demo2 { public static void m ...

  10. 命令行分析java线程CPU占用

    1.使用top命令找出占用cpu最高的JAVA进程pid号 2. 找出占用cpu最高的线程: top -Hp  -n 1 3. 打印占CPU最高JAVA进程pid的堆栈信息 jstack pid &g ...