今天七姐简单说说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 中的两个术语:

快照是被跟踪的最顶层树。

比如我的“公众号”文件夹的结构:

linux如何查看git版本_git查看当前代码版本号_linux查看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中的文件并没有更新。

linux如何查看git版本_git查看当前代码版本号_linux查看git版本命令

而要说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 帮助拉取:

linux如何查看git版本_linux查看git版本命令_git查看当前代码版本号

它首先介绍了参数,然后描述详细解释了它的工作原理,下面还有图解,太香了! !

但是这种方法更像是一个备忘单,当你已经知道命令但只是忘记了如何使用它时,就去查一下。

如果你想系统的学习,那么下面的更适合你。

临 Git

强烈推荐这本书! !

Pro Git这本书不仅讲了Git的基本用法和高级用法,还在最后深入讲解了Git的原理,非常详细和全面。

本书电子版也可直接从网站下载。

英文版:

中文版:

玩游戏

熟能生巧!

推荐一个宝藏资源:玩游戏练Git

项目:

网址:

熟悉很多工具都是通过小游戏练出来的,比如vim的操作,挺推荐这种方法的。 不剧透,让我们自己去发现吧~