最近小编进入阿里实习,在进入阿里之前,我对于Git的了解只是 git clone
、git fetch
、git pull
、git push
、git add
、git commit
这几条简单的命令。但是在实际的工作中,发现只是掌握这几条简单的命令显然是不够用的。于是,我就花了几天的时间系统的学习了一下git的相关知识。
git 与版本控制
我们知道git是进行版本控制的工具。那么,什么是版本控制呢?最简单的版本控制就是将之前编辑的文件复制一个副本保存起来,然后再进行更改,然后对每次更改的版本都保存一个特定的名称,比如说v1.0,v1.1之类的方式。
然而这样的版本控制的方式会导致一些问题,比如说时间久了之后就不记得哪个版本改动了哪些内容,或者误删了某些版本的修改,而且进行团队协作的时候也不方便。于是就出现了很多版本控制的系统。版本控制系统可以分为两个大类:
- 集中式版本控制系统(CVCSs,Centralised Version Control Systems):它拥有一个存储在服务器端的拥有所有版本的仓库。如果开发者需要使用,则只需要从服务器端拉取相关的文件进行更改,并对更改的内容进行备注,最后在推送到服务器端仓库。
- 分布式版本控制系统(DVCSs,Distributed Version Control Systems):在本地中不只是存储了最新的文件版本,而是存储了全部仓库中所有文件版本更新信息的镜像,并且在本地可以进行版本管理的所有操作。
其中,git就是分布式版本控制系统最典型的例子。如下图所示,很多版本控制系统保存的都是当前版本对之前的内容的更改。在这些版本控制系统中,将变动的文件存储为新的版本,而没有更改的文件则不变。
而在git中,存储的不是文件的更改,而是当前时刻的snapshots。如下图所示,当某个文件发生变动(增删改)时,git存储更改后的文件。对于那些没有改变的文件,git会复制一个副本,将其保存在新的版本中。
git 与存储仓库
在git中,所有的内容都被当作一个对象存储起来。git主要存储的对象有三种,这三种对象都以键值对的形式保存,其键都是进行哈希运算后的结果,其值各不相同,分别是:
- blob:存储实际存储在计算机中的文件内容
- tree:blob元素的键的集合
- commit:将未保存的文件提交的最终对象,它包含tree对象的哈希值以及提交的信息
如下图所示,git仓库中存储了三个对象,每一个commit对象就是一个新的版本。以每一次提交的commit对象为核心,通过存储在commit对象中的tree对象的键,以及存储在tree对象中的blob对象的键可以找到更改后的文件。
正如前面提到的,每一次在git中提交新的版本提交的是当前的所有文件的snapshot。我们提交的这个snapshot就是一个commit对象,它包括包含了所有文件(即blob对象的key)的tree对象,以及一些关于本次提交的其他信息。除此之外,我们还可以给某次提交的哈希值起名字,这就是git中的branch,多个branch可以合并成一个版本。
git 与基本操作
提交代码
git add . // 将文件存入暂存区
git commit -m "本次提交的备注" // 提交代码到本地当前分支
git push // 将本地代码推送到远程,这里可以指定要推送的分支
git push origin local-branch // 将指定的本地分支推送到远程
获取远端工程
git clone ...... // 从远端获取代码的方法
git pull // 从远程拉取代码,并且合并到本地
git fetch // 拉去远程代码,但是不合并
分支相关
git branch // 查看本地分支
git branch -a // 查看远程分支
git checkout xxx // 切换到xxx分支
git branch xxx // 新建名称叫xxx的分支
代码回滚
git log // 查看提交日志,确定需要版本的哈希值
git reset -hard xxxx // 将代码回退到xxxx之前
git revert -hard xxxx // 同样是回退代码,但是该命令会留下记录,而reset则不会