一、什么是Git

  Git是一个分布式版本控制系统,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异(如CVS、Subversion等)。而Git并不保存这些前后变化的差异数据。Git更像是把变化的文件作快照后记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。若文件没有变化,Git不会再次保存,而只对上传保存的快照做一次连接,即若文件未变化则指向上一次提交。

  所谓Git的指纹信息,是指文件在保存到Git之前,所有数据都要进行内容的checksum计算,并将此结果作为数据的唯一标识和索引。也就是说Git会立即察觉到数据的变化。

  受Git控制的文件一般有三种状态:已提交状态(Commited)、已修改状态(Modified)、已暂存状态(Staged)。每一次提交实际上是保存树状态和路径状态。

●已提交:表示该文件已经被安全的保存在本地数据库了;

●已修改:表示修改了某个文件但是还没有提交保存;

●已暂存:也可称为索引(index),表示把已修改的文件放在下次提交时要保存的清单中。

  我们在用Git管理项目的时候,文件流转的三个区域:Git的本地数据目录、工作目录、暂存区域。每个项目都有一个git目录,它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

  所谓的暂存区域只不过是个简单的文件,一般都放在 git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。
  基本的 Git 工作流程如下所示:
1. 在工作目录中修改某些文件。
2. 对这些修改了的文件作快照,并保存到暂存区域。
3. 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。
所以,我们可以从文件所处的位置来判断状态:
如果是 git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

1.安装Git

  Git目前已经属于基础工具了,在yum的base仓库中直接安装即可:

~]# yum install -y git

  可以用命令去获取一个Git仓库或项目,也可从从零创建一个Git项目目录:

~]# git init
Initialized empty Git repository in /root/.git/ #默认在当前用户家目录下创建一个.git的目录

  Git的对象类型: 保存在.git/objects目录下
1.块(blob)对象:文件的每个版本表现为一个块(blob);
2.树(tree)对象:一个目录代表一层目录信息;
3.提交(commit)对象:用于保存版本库一次变化的元数据,包括作者、邮箱、提交日期、日志;每个提交对象都指定一个目录树对象;
4.标签(tag)对象:用于给一个特定对象一个易读的名称;

  .git目录的结构:

~]# ls .git/
branches description hooks objects
config HEAD info refs
~]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
├── heads
└── tags

  创建或者得到一个git后的大致结构:

  下面通过创建一个项目(文件)来演示这些逻辑:

在家目录下创建一个某项目工作目录:

 ~]# mkdir -p ./testobj
~]# cd testobj/
~]# git init
~]# cp /etc/passwd ./
~]# vim README
test

此时在项目的工作区就有了文件 passwd 和 README ,若想要git跟踪这两个文件(即放入暂存区)可使用命令 git add :

2.暂存

~]# git add passwd README #将passwd和README放至暂存区。

然后可看到.git目录下自动生成了一个 index 目录:

而 .git/objects 目录下生成了两个新目录,并在目录下生成了一串hash值的文件:

现在修改工作目录中的README文件看看会发生什么情况:

~]# vim ../../README #在文件中随便加一行内容。
~]# pwd
/root/testobj
~]# git add README #再次推入暂存区
~]# cd .git/objects
~]# tree

  这里可以看到比之前多出了一个目录和文件,这是因为每一次暂存都会在objects目录下创建一个对象,不能是空目录,Git是无法追踪空目录的。

可用 git status 查看当前git的状态:

~]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README
# new file: passwd
#

  当文件放至暂存区后,要删除文件需要用 git rm --cached <file>... 命令从暂存区域删除。

  若要查看暂存区中的内容可以用 git cat-file -p <file> ,这里的<file>为暂存区中文件名为hash格式的文件,用cat命令无法查看。

3.提交

  若想提交文件则可用 git commit 命令,查看提交日志可用 git log 。在生产环境中若是提交至git服务器,必须要求先配置真实的个人信息,以便于代码追踪管理。配置个人信息可用 git config 命令来实现。例如要加个人信息可用:

git config --global user.name ready
git config --global user.email @.com

  配置个人信息后会在家目录下自动生成 .gitconfig 文件,里面存放着配置的个人信息。

  文件提交后,当我们把 .git 目录复制到其他目录时,我们就可以用 git checkout -- <file> 命令将文件重构出来。

mkdir -p ~/myobj
cp ~/testobj/.git ~/myobj

  这时新目录中是没有passwd和README文件的,用 git checkout 命令后:

~]# git checkout -- README passwd
~]# ls
README passwd

  可以看到文件都被恢复了,并且内容是和之前一样的,但要注意,提交什么才能恢复什么。

4.Git中的文件分类

已追踪的(tracked):已经在版本库中,或者已经使用git add命令添加至索引中的文件;
被忽略的(Igored):在版本库中通过“忽略文件列表”明确声明为被忽略的文件;
未追踪的(untracked):上述两类之外的其它文件;

5.设定标签tag

  在生产环境中可以为每次提交创建标签(tag),便于版本管理。命令为 git tag <tagname> <commit hash>

6.创建分支

  在开发过程中常做分支是很有必要的。

  创建分支可使用 git checkout -b 或 git branch ,使用 git checkout 来切换分支,每一次切换都会根据分支的具体数据改变工作目录的文件。

 myobj]# git branch brh
myobj]# git branch --list
* (detached from V1)
brh
master
myobj]# git checkout brh
Switched to branch 'brh'
myobj]# git branch --list
* brh #星号表示当前所在的分支
master

  合并分支则用 git merge 命令

7.撤销提交

  撤销提交可以用 git reset 命令,该命令有三个重要的参数:

1. --soft :将HEAD指向上一次提交,不会改变工作目录,也不会影响暂存区。

2. --mixed :将HEAD指向上一次提交,并回退暂存区,但不会改变工作目录。

3. --hard :改变HEAD并且删除暂存区数据,并修改工作目录。

8.差异比较

   git diff 命令可以用来比较两次提交的不同。

分布式版本控制系统GIT的使用的更多相关文章

  1. [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git

    [.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...

  2. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

  3. [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境

    [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...

  4. 分布式版本控制系统 Git 的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/CJL29 ...

  5. 分布式版本控制系统Git的安装与使用

    分布式版本控制系统Git的安装与使用 作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 我的远端仓库地址是:htt ...

  6. 【软件工程】分布式版本控制系统Git的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/Richa ...

  7. 分布式版本控制系统Git的安装与使用(作业2)

    (本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103) 分布式版本控制系统Git的安装与使用 一.安装Git b ...

  8. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)

    近期想改公司内部的源码管控从TFS为git,发现yubinfeng大侠有关git的超详细大作,现将其转载并记录下,以防忘记,其原博客中有更加详细的git及.net开发相关内容.原文地址:http:// ...

  9. 分布式版本控制系统 Git 教程

    简介 Git 是什么? Git 是一个开源的分布式版本控制系统. 什么是版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 什么是分布式版本控制系统? 介绍分布 ...

  10. 分布式版本控制系统-git

    Git是目前世界上最先进的分布式版本控制系统 SVN是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?这个可以找度娘...... 1.安装Git yum i ...

随机推荐

  1. oracle 区分大小写遇到的坑

    1. oracle 字段是区分大小写的 ..在navicat 中使用查询 select REMAIN_PRINCIPAl from T_NF_PROJECT;    navicat 默认会把 REMA ...

  2. tensorflow nan

    https://github.com/tensorflow/tensorflow/issues/3212 NaNs usually indicate something wrong with your ...

  3. Apache ab性能测试结果分析

    Apache ab性能测试结果分析 测试场景:模拟10个用户,对某页发起总共100次请求. 测试命令: ab -n 100 -c 10 地址 测试报告: Server Software: 被测服务器软 ...

  4. C#中 property 与 attribute的区别

    说的通俗些Attribute是类,不过是一类比较特殊的类,Attribute必须写在一对方括号中,用来处理.NET中多种问题:序列化.程序的安全特征等等,在.NET中的作用非同凡响 Attribute ...

  5. scp复制文件到指定端口

    1.scp基本格式 scp file user@host:/dir 2.scp复制文件到指定端口 scp默认连接的端口是22端口,如果ssh不是使用标准的22端口则使用-P(P大写)指定: scp - ...

  6. CentOS7 启动中文输入法

    CentOS 系统中是带有中文输入法的(智能拼音),启动方式如下: Applications --> System Tools -->  Setting --> Region &am ...

  7. vue报错TypeError: Cannot read property '$createElement' of undefined

    报错截图: 这个错误就是路由上的component写成了components

  8. [Solution] JZOJ3470 最短路

    [Solution] JZOJ3470 最短路 题面 Description 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少. ...

  9. Azure DevOps Server(TFS): 在Excel中解除服务器同步

    通过Azure DevOps Server 提供与Excel集成的功能,用户可以非常便捷地使用Excel,实现工作项数据的同步. 对于需要批量处理数据.离线工作.制作临时报表的用户来说,这个功能必定成 ...

  10. 项目Alpha冲刺(团队1/10)

    项目Alpha冲刺(团队1/10) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标: 完成项目Alpha版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 ...