今天七姐简单说说Git的实现原理,知其所以然; 并整理出日常生活中最常用的12条命令,分为三类与大家分享。
本文结构如下:
作者及开发理由
Git的数据模型
常用命令
资源推荐
作者及开发理由
谈话很便宜。 给我看代码。
这句话来自 Linux 和 Git 的作者
莱纳斯·托沃兹。
Linux 内核最初的版本控制系统使用的是 BitKeeper。 然而,2005年,BitMover不再允许Linux开发团队免费使用。 .
Linus一听就不用了? 我自己写的!
于是,老大在十天内就完成了Git的第一个版本。
所以 Git 是一个免费、开源的版本控制系统。
版本控制系统
其实版本控制大家都用过。 那些年修改后的简历:
小琪简历2012版
小琪简历2013版
小琪简历2014版
小琪简历2015版
小琪简历2016版
小琪简历2017版
小琪简历2018版
小琪简历2019版
…
还有那些我打死都不改的毕业论文:
毕业论文定稿
毕业论文定稿
毕业论文定稿
毕业论文定稿
毕业论文最后不会修改
毕业论文最后不会修改
毕业论文最后没有修改
毕业论文最后被秒杀不修改
毕业论文不修改终于被活活打死2
…
没错,这就是本地版本控制系统。
显然,优点是简单,但这里只能改变一个人,不能与他人合作。 于是下面两个主流的版本控制系统应运而生。
1.集中式版本控制系统
集中式版本控制系统 (CVCS)
例如:CVS、Subversion、Perforce 等。
这个版本控制系统有一个单一的集中管理的服务器,保存所有文件的最新版本,你可以通过连接到这个服务器来获取或提交文件。
这种模式是对本地版本控制系统的改进,但缺点也很明显。 如果服务器宕机,最起码会耽误工作,最严重的是会丢失数据。 于是分布式版本控制系统应运而生。
2.分布式版本控制系统
分布式版本控制系统 (DVCS)
例如:Git、Mercurial、Bazaar 等。
分布式版本控制系统将代码仓库完全镜像,这样任何服务器故障都可以通过其他仓库进行修复。
而且这种模式可以更方便的让不同公司的人开发同一个项目,因为两个远程的代码仓库可以交互,这在以前的中心化系统中是做不到的。
那么什么是“完全镜像代码仓库”呢?
CVCS的每个版本都存储了当前版本和之前版本的差异,所以也叫delta-based;
Git 存储所有文件的快照。 如果某些文件未被修改,则仅保留一个引用以指向先前存储的文件。
不容易理解? 到时候看看~
Git数据模型 1. 什么是快照(snapshot)?
首先,让我们学习一下 Git 中的两个术语:
快照是被跟踪的最顶层树。
比如我的“公众号”文件夹的结构:
那么快照就是被跟踪的“公众号”树。
2.本地库的数据模型
Git 记录每个快照的父级,即当前文件夹的先前版本。
那么快照的迭代更新过程可以表示为有向无环图,是不是很熟悉? 我们在《拓扑学》一文中提到过,如果忘记了,到公众号回复“拓扑学”即可获取拓扑学的介绍文~
每个快照其实对应一个commit,我们用代码表达一下:
class commit {
array parents
String author
String message
Tree snapshot
}
这就是 Git 的数据模型。
Blob、tree、snapshot 都是一样的,它们都是 Git 中的对象git查看当前代码版本号,可以被引用或搜索,并且会根据它们的 SHA-1 哈希来寻址。
git cat-file -t:查看每个SHA-1的类型;
git cat-file -p:查看各个对象的内容和简单的数据结构。
但是通过这个hash值来查找太不方便了。 毕竟这是一个40个十六进制字符的字符串,是git log第二部分输出的代码。
因此,Git也给出了参考。
比如我们常见的HEAD就是一个特殊的引用。
本机库由对象和引用或存储库组成。
在硬盘上,Git 只存储对象和引用,所有的 Git 命令都对应于提交一个快照。
常用命令有哪些?
常用命令
本章分为三个部分介绍常用的日常命令:
本地操作
在学习常用命令之前,首先需要了解Git的“三分区”以及对应文件的“三种状态”:
暂存区:是临时存放的地方。
本地库:存放本地的历史版本信息。
1. $ 添加
在工作区修改代码后,使用git add提交到暂存区。
如果这里的文件改动比较多,但不是全部都需要提交,我会设置git ignore file,也就是说这些文件不要提交,比如那些在构建项目的时候会自动生成的文件, ETC。
2. $ git commit -m "评论"
从暂存区提交到本地库,需要使用commit。
一般在-m后会有注释,简单说明改变的内容或原因。 我们公司的每个人也会默认附上Jira链接,这样你就知道变更对应的是哪个任务。
然后再想改的话,再git add就可以了,但是commit这句需要改成
$ git commit --amend
这仍然是一条 git 日志消息。
3. $ git日志
git log可以查看提交的信息,从近到远显示每次提交的评论以及作者、日期等信息,例如它看起来是这样的:
commit 5abcd17dggs9s0a7a91nfsagd8ay76875afs7d6
Author: Xiaoqi
Date: xxx xxx xxx
改了 Test 文件
提交后的数字是每条历史记录的索引。 例如,如果您需要向前或向后移动版本,则需要使用它。
这种方式打印的日志太多,比较简洁的打印方式是:
$ git log --oneline
它打印在一行上。
或者:
$ git reflog
比较常用。
4. $ git 重置
然后我们刚才说了如果需要前进或者后退到某个版本,使用
$ git reset --hard
这样会直接跳转到这个编号对应的版本。
那么这个硬是什么意思呢?
这里有3个参数:hard、soft、mixed,我们一一说。
回到我们最重要的画面:
我们刚才说的向前或向后到某个版本是对本地库的操作。
那么有一个问题:
本地库的代码跳转到那个版本后,工作区和暂存区的代码会和本地库不同步!
这些参数用于控制这些是否同步。
$ git reset –hard xxx
三个区都是同步的,都跳转到这个xxx版本。
$ git reset –soft xxx
如果前两个区不同步,只有本地库跳转到这个版本。
$ git reset –mixed xxx
暂存区同步,工作区不动。
所以,最常用的是硬的。
远程交互
与远程库的交互主要是push和pull,即写入和读取。
5. $ 推送
小七写完代码后,需要提交到公司的代码库。 这个过程需要 git push。
当然,你这么用,是会被打的。 . 毕竟,它需要cr。
5. $ git 克隆
新来的实习生要先把整个项目clone到本地,然后才能进行增删改查。
当然,没有人在实践中使用它。 . 因为每个公司都会有自己的打包工具。 但是如果你是在Github上做一个开源项目,它就会派上用场。
6. $ 拉动
小七提交新代码后,领导需要审核,所以用git pull拉取最新代码看看。
实际上,
git pull = 抓取 + 合并
7. $ 获取
git fetch 这个操作是将远程库的数据下载到本地库,但是workspace中的文件并没有更新。
而要说get merge,还得先说说branches。
合并是 git pull 的默认选项。 其实还有一种合并方式:rebase,中文叫rebase。
8. $ git 变基
rebase的作用更多的是整合fork的历史。 它可以将一个分支上的所有修改都移动到另一个分支上,就像改变基数一样。
分支与合并
首先,我们看一下分支的几个基本操作:
9.查看分支:
$ 分支
类似于ls,它可以列出当前所有的分支。
git branch -v 可以显示更多信息。
10.创建分支:
$ 分支
11.切换分支:
$ 结帐
分支之后,必须有一个合并:
12.合并分支:
$ git 合并
而且合并的时候可能会有冲突,什么时候会冲突呢? :
在同一文件的同一位置进行修改时。
因为Git会努力合并你改动的不同地方,但是如果真的是在同一个地方改动,那就没办法了,只能交给程序员自己去手动处理了。
当然,每个命令都有无限多的扩展git查看当前代码版本号,本文不可能全部覆盖,所以在这里强烈推荐琪姐精心挑选的三款学习资源,大家可以自己去欣赏哦~
学习资源 git help
其实我个人用的最多的是git help
真的方便好用!
例如 git 帮助拉取:
它首先介绍了参数,然后描述详细解释了它的工作原理,下面还有图解,太香了! !
但是这种方法更像是一个备忘单,当你已经知道命令但只是忘记了如何使用它时,就去查一下。
如果你想系统的学习,那么下面的更适合你。
临 Git
强烈推荐这本书! !
Pro Git这本书不仅讲了Git的基本用法和高级用法,还在最后深入讲解了Git的原理,非常详细和全面。
本书电子版也可直接从网站下载。
英文版:
中文版:
玩游戏
熟能生巧!
推荐一个宝藏资源:玩游戏练Git
项目:
网址:
熟悉很多工具都是通过小游戏练出来的,比如vim的操作,挺推荐这种方法的。 不剧透,让我们自己去发现吧~