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
Git 介绍的更多相关文章
- Git介绍及常用操作演示(一)--技术流ken
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]
Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...
- 【转】Git介绍
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3. ...
- git介绍和常用指令
Git介绍和常用指令 介绍:Git和SVN一样都是版本控制工具.不同的是Git是分布式的,SVN是集中式的.Git开始用可能感觉难点,等你用习惯了你就会觉得svn是有点恐怖.(如果一个项目有好多人一起 ...
- git介绍及安装
git介绍 git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目.git是linus Torvalds为了帮助管理Linux内核开发的一个开放源码的版本控制软件. Git 与常用 ...
- CI 知识 :Git介绍及常用操作
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- Git介绍与简易搭建
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- Git介绍、安装、命令和实战
一.Git介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 二.Git安装(Mac系统) 在Git官网下载安装包双击直接安装 在终端输入git来检测Git ...
- git介绍-常用操作(一)
Table of Contents 1 系列文章 2 git说明 3 git常用命令 3.1 基本操作 3.2 远程操作 4 查看git的配置 4.1 查看已配置项 4.2 其他配置 ...
- 版本控制工具Git介绍-01
使用版本控制工具是为了方便团队开发,比如多人共同维护一个项目的时候,用版本控制工具可以很方便的维护项目代码,如果哪天你改了一个版本,出问题了,我们也可以很快的找到你改了什么,这里介绍使用比较多的版本控 ...
随机推荐
- Rectangle and Square
Description Little Petya very much likes rectangles and especially squares. Recently he has received ...
- abiword Namespace List
abiword Namespace List Here is a list of all namespaces with brief descriptions: abicollab 这个命名空间以及 ...
- OC 代理 协议 委托 数据源的概念
(网摘) OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 ): 数据源就是对象遵循了存储数据的协议,可以存储使用数据 协议表示了方法可 ...
- js void运用
谈谈Javascript中的void操作符 http://segmentfault.com/a/1190000000474941 总结: void有如下作用: 通过采用void 0取undefined ...
- SD/MMC卡初始化及读写流程
二.MMC/SD卡的模型和工作原理 PIN脚.SD卡总线.SD卡结构.SD卡寄存器.上电过程 SD卡寄存器: OCR:操作电压寄存器: 只读,32位 第31位: 表示卡上电的状态位 CID: 卡 ...
- MongoDBAuth
1,mogoDB 认证登陆
- 【转】android camera(三):camera V4L2 FIMC
关键词:android camera CMM 模组 camera参数 CAMIF V4L2 平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...
- 用Python实现九九乘法表
1.用“#”组成的矩形的实现 代码 eight = int(input("Height:")) #用户输入高度 width = int(input("Width:&quo ...
- java中return和continue区别
编程语言大多是想通的,当然java也不例外,下面的在其他编程语言也是相同的道理. return与continue的区别 先看代码哦 class demo2 { public static void m ...
- 命令行分析java线程CPU占用
1.使用top命令找出占用cpu最高的JAVA进程pid号 2. 找出占用cpu最高的线程: top -Hp -n 1 3. 打印占CPU最高JAVA进程pid的堆栈信息 jstack pid &g ...