GIT的学习

依然范特西╮ 提交于 2020-01-06 03:15:06

Question

1.什么是版本控制器,什么是GIT?

2.GIT的原理是什么?

3.GIT的常用基本操作?

4.GIT遇到的问题?

 

Answer

1.什么是版本控制

版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。

  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员的负担,节省时间,同时降低人为错误

简单说就是用于管理多人协同开发项目的技术。

1.1那么GIT是什么?

GIT就是一个版本控制的管理工具,虽是版本工具,但是又区别于其他的版本控制器(CVS,Subversion,Perforce,Bazaar 等等),GIT是分布式版本控制器;SVN等是集中式版本控制器

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。

其他版本控制器主要是:每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容:

CVS,Subversion,Perforce,Bazaar 等等的工作原理

 

2.GIT的原理是什么?

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,

它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就如下图所示。

 

2.1 GIT的优势是什么?

A.不必时刻联网即可进行开发

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。

因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。

 举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。

  所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,

而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

B. 时刻保持数据完整性

  在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

 Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。

   常用的 Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。在别的 VCS(version control system) 中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。

 2.2 GIT的工作流程

  首先GIT对于任何一个文件,在GIT内只有三种文件状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

  每个项目都有一个 Git 目录(如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone --bare 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

  从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。

基本的 Git 工作流程如下:

  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

  所以,我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

GIT:常用术语

1)、仓库(Repository)
受版本控制的所有文件修订历史的共享数据库

2)、工作空间(Workspace) 
本地硬盘或Unix 用户帐户上编辑的文件副本

3)、工作树/区(Working tree)
工作区中包含了仓库的工作文件。您可以修改的内容和提交更改作为新的提交到仓库。

4)、暂存区(Staging area)
暂存区是工作区用来提交更改(commit)前可以暂存工作区的变化。

5)、索引(Index)
索引是暂存区的另一种术语。

6)、签入(Checkin)
将新版本复制回仓库

7)、签出(Checkout)
从仓库中将文件的最新修订版本复制到工作空间

8)、提交(Commit)
对各自文件的工作副本做了更改,并将这些更改提交到仓库

9)、冲突(Conflict)
多人对同一文件的工作副本进行更改,并将这些更改提交到仓库

10)、合并(Merge)
将某分支上的更改联接到此主干或同为主干的另一个分支

11)、分支(Branch)
从主线上分离开的副本,默认分支叫master

12)、锁(Lock)
获得修改文件的专有权限。

13)、头(HEAD)
头是一个象征性的参考,最常用以指向当前选择的分支。

14)、修订(Revision)
表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。

15)、标记(Tags)
标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。

 

 

Git理论基础

工作区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

 有了理论基础和上面的图,可以根据图进行一些日常的简单操作

工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。

日常使用只要记住下图6个命令:

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

3.GIT的常用基本操作?

首先在GIT的官网或者其他版本管理服务上创建一个账号。如(https://coding.net)

并下载安装好GIT客户端,接下来就是使用LINUX操作命令进行仓库管理。

首先在新建了一个远程仓库:

 

就会有一个仓库连接

接下来进行日常操作了,此处模拟多人协同开发(以两人为例)

场景1:

下面模拟程序员A的操作 ↓

首先进行GIT的必要操作

mkdir GitTest  #创建目录
cd GitTest #进入目录
git init #初始化创建,这里会生成.git,表明使用git管理的项目
echo "#项目的说明文件"  >> README.md  #md是Markdown的后缀,新增一个说明文件
echo "*.log" > .gitignore  #增加上传时忽略的类型的文件,比如.log后缀的日志文件
git add . #将所有修改的文件放到暂存区
git commit . -m "第一次提交"  #将所有暂存区的文件提交至本地服务器
git remote add origin https://git.coding.net/dominick123456/project01.git #给URL设置一个别名origin
git push  -u origin master   #设置推送到远程服务器,这样写一次后,以后直接git push

使用命令先在e盘创建GitTest目录也就是工作区(Workspace),并将README.md和.gitignore创建好

将所有修改的文件放到暂存区(Index / Stage)

git add .

 

git commit . -m "将所有文件提交"

 

 给项目的远程URL创建一个别名:origin 它就URL

git remote add origin https://git.coding.net/dominick123465/project01.git

 

git push -u origin master

其中origin就是使用git remote得到的远程服务器的名称。

master表示是主分支

 

提交之后,此时程序员A的这部分工作完成了。

 场景2:

后来新来了一个程序员B,他参与到这个项目,他应该干的就是

就是创建他的工作区

然后从远程仓库中把项目拉(pull)到本地工作区

git pull URL

 

 

此时程序员B的本地工作区和远程仓库一模一样

 

 

程序员B开始了他的开发。

 

场景3:

 

 在程序员B开发的时候,程序员A也没闲着,他也在开发自己的模块,并且速度比程序员B这个新生要快。此时就有一下情况:

程序员B

 

 

此时程序员A已经提交了自己新开发的模块,远程仓库现在是一个新的版本

 

 

于是程序员B提交的时候

 

 

报错了!,因为版本不同冲突了!!!怎么办,只需同步一下就行,再提交就OK

git pull

 

有些时候,这是开发到准备结束,已经提交到本地仓库了,此时使用git pull,接着使用 git push 依旧是报错了

 

 那么就得用到这么一行命令

git pull --rebase origin master

这命令很重要 

这条指令的意思是把远程库中的更新合并到本地库中,–rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中

 此时就提交成功了

 

这,就是多人协同开发的过程,如果此时再加入几个程序员C,程序员D,其操作同样是和程序员B一样,先从项目负责人那里得到项目的GIT的URL然后pull到本地工作区,对所属的模块进行开发之后,更新上去远程仓库

这个就是多人协同开发的一个过程。

可能会出现的错误

使用git上传或者下拉中出现MERGING,这是合并冲突了

三种解决方法

1.解决冲突,删除代码中矛盾的代码,然后上传或者下拉

2.回退git reset --hard head到操作前的状态

3.discard删除下载的,或者上传的代码,然后分别check out两个分支

一般都是使用回退的,把冲突的部分回退到工作区,没有到 暂存(Index / Stage),也不会存在在本地仓库(Repository)的状态

使用 

git reset --hard head

查看GIT的状态 git status ,就能看的冲突的部分,以及现在的状态

proB.txt 就是冲突的部分被回退到本地工作区了(workSpace了)

 

GIT是如何保持所有人的版本,在提交自己的代码的时候都是最新的状态?其实敲了几次代码体验了一下就知道。

  当执行oush名利是,远程服务器会与本地服务器的版本进行对比,如果存在版本不符,则需将远程服务器的最新版本给pull下来,然后再将自己的新版本提交推荐使用  git pull --rebase origin master 命令pull 这条指令的意思是把远程库中的更新合并到本地库中,–rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中。

  那么此时在更新新版本的时候,所有东西都是最新的,既不会将自己本地仓库未更新的旧代码覆盖别人的新代码,又能备份一份最新的版本在自己的仓库,GIT就是通过这样进行版本更新。这就是分布式版本控制器的原理

 

 

 

附:常见的版本控制器

主流的版本控制器有如下这些:

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)
  • Visual Studio Online

版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN

附1、版本控制分类

附1.1、本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。

1.4.2、集中版本控制

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改

所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

1.4.3、分布式版本控制

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

 

 

 

参考的原文链接:

Git的思想和基本工作原理

一个小时学会GIT

Git 多人协作开发的过程

Git 常用的命令使用

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!