乐趣区

关于java:Git-看这一篇就够了

上一篇讲 Git 的文章收回来没想到成果特地好,很多读者都要求持续深刻的写。

那明天齐姐简略讲下 Git 的实现原理,知其所以然能力知其然;并且梳理了日常最罕用的 12 个命令,分为三大类分享给你。

本文的构造如下:

  1. 作者和开发原由
  2. Git 的数据模型
  3. 常用命令
  4. 资源举荐

作者和开发原由

Talk is cheap. Show me the code.

这句话就出自 Linux 和 Git 的作者
Linus Torvalds

本来 Linux 内核的版本控制系统是用的 BitKeeper,然而 2005 年,BitMover 公司不再让 Linux 开发团队收费应用了。。

Linus 一听,不给用了?老子本人写!

于是,大佬十天之内实现了 Git 的第一个版本。

所以 Git 是一个收费的、开源的版本控制系统。

版本控制系统

版本控制其实每个人都用过,那些年批改过的简历:

小齐简历 2012 版
小齐简历 2013 版
小齐简历 2014 版
小齐简历 2015 版
小齐简历 2016 版
小齐简历 2017 版
小齐简历 2018 版
小齐简历 2019 版

还有那些年打死都不再改的毕业论文:

毕业论文最终版
毕业论文最最终版
毕业论文最最最终版
毕业论文最最最最终版
毕业论文最终不改版
毕业论文最终真不改版
毕业论文最终真真不改版
毕业论文最终打死不改版
毕业论文最终打死不改版 2

没错,这就是本地版本控制系统。

很显著,益处是简略,然而只能一个人在这改,无奈和别人实现单干。那么以下两种支流的版本控制系统应运而生。

1. 集中化版本控制系统

Centralized Version Control Systems (CVCS)

比方:CVS, Subversion, Perforce, etc.

这种版本控制系统有一个繁多的集中管理的服务器,保留所有文件的最新版本,大家能够通过连贯到这台服务器上来获取或者提交文件。

这种模式绝对本地版本控制系统是有所改进的,然而毛病也很显著,如果服务器宕机,那么轻则耽搁工作、重则数据失落。于是分布式版本控制系统应运而生。

2. 分布式版本控制系统

Distributed Version Control Systems (DVCS)

比方:Git, Mercurial, Bazaar, etc.

分布式的版本控制系统会把 代码仓库残缺地镜像 下来,这样任何一个服务器产生故障,都能够用其余的仓库来修复。

更进一步,这种模式能够更不便的和不同公司的人进行同一我的项目的开发,因为两个近程代码仓库能够交互,这在之前的集中式零碎中是无奈做到的。

那么什么叫“把代码仓库残缺地镜像下来”呢?

CVCS 每个版本寄存的是以后版本与前一个版本的差别,因而也被称作基于差别的版本控制 (delta-based);

Git 存储的是所有文件的一个快照 (snapshot),如果有的文件没有批改,那就只保留一个 reference 指向之前存储的文件。

不是很好了解?那接着看吧~

Git 的数据模型

1. 什么是快照 (snapshot) 呢?

首先咱们来学两个 Git 中的术语:

  • blob, 就是单个的文件;
  • tree, 就是一个文件夹。

快照则是被追踪的最顶层的树。

比方我的“公众号”文件夹的这么一个构造:

那么一个快照就是追踪的“公众号”这颗树。

2. 本地库的数据模型

Git 记录了每个快照的 parent,也就是以后这个文件夹的上一个版本。

那么快照的迭代更新的过程就能够示意为一个 有向无环图,是不是很相熟?咱们在「拓扑」那篇文章里讲过,忘了的小伙伴快去公众号内回复「拓扑」获取拓扑的入门文章吧~

每个快照其实都对应了一次 commit,咱们用代码来示意一下:

class commit {
  array<commit> parents
  String author
  String message
  Tree snapshot
}

这就是 Git 的数据模型。

blob, tree, snapshot 其实都一样,它们在 Git 中都是 对象,都能够被援用或者被搜寻,会基于它们的 SHA-1 hash 进行寻址。

git cat-file -t: 查看每个 SHA-1 的类型;
git cat-file -p: 查看每个对象的内容和简略的数据结构。

然而通过这个哈希值来搜寻也太不不便了,毕竟这是一串 40 位的十六进制字符,就是第二局部 git log 里输入的那个 编码

因而,Git 还给了一个援用 reference

比方,咱们常见的 HEAD 就是一个非凡的援用。

本地库就是由 对象 援用 形成的,或者叫 Repositories.

在硬盘上,Git 只存储 对象 援用,所有的 Git 命令都对应提交一个快照。

那有哪些常用命令呢?

常用命令

本章分三大部分介绍日常常用命令:

  • 本地操作
  • 和近程库的交互
  • 团队合作 – 分支

本地操作

在学习常用命令之前,你首先须要晓得的 Git 的「三个分区」和对应的文件的「三种状态」:

  • 工作区:就是你本地理论写代码的中央,无论你是用 vim 间接改也好,还是在 IDE 里写,都无所谓。

    • 对应的文件状态是:modified,已批改,但还没保留到数据库中。
  • 暂存区:就是长期寄存的中央。

    • 对应的文件状态是:staged,Git 曾经对该文件做了标记,下次提交晓得要蕴含它。
  • 本地库:寄存本地历史版本信息。

    • 对应的文件状态是:committed,文件曾经平安的保留在本地数据库中。

1. $ git add

工作区改完了代码,就用 git add 提交到暂存区。

这里如果文件改变的比拟多,但又不是每个都须要提交,我会设置 git ignore file,就示意这些文件不要提交,比方在 build project 的时候会主动生成的那些文件等等。

2. &dollar; git commit -m “comment”

从暂存区提交到本地库,就须要用 commit。

个别前面都会跟个 -m 加句 comment,简略说下改变的内容或者起因,咱们公司大家默认也会把 Jira链接附上,这样就晓得这个改变对应哪个工作。

那如果想再改,再从新 git add 即可,然而 commit 这句须要改成

$ git commit --amend

这样就还是一条 git log 信息。

3. &dollar; git log

git log 能够查看到提交过的信息,从近到远显示每次 commit 的 comment 还有作者、日期等信息,比方大略长这个样子:

commit 5abcd17dggs9s0a7a91nfsagd8ay76875afs7d6
Author: Xiaoqi<xiaoqi@163.com>
Date: xxx xxx xxx
改了 Test 文件

commit 前面的这个 编号 ,是每次历史记录的一个 索引。比方如果须要对版本进行后退或者后退的时候,就须要用到它。

这样打印的 log 太多,更简洁的打印形式是:

$ git log --oneline

就一行打印进去了。

或者:

$ git reflog

更罕用一些。

4. &dollar; git reset

那咱们刚刚说过,如果须要后退或退回到某个版本,就用

$ git reset --hard < 编号 >

这样就间接跳到了这个 编号 对应的那个版本。

那么这个 hard 是什么意思呢?

这里有 3 个参数:hard, soft, mixed,咱们一一来说一下。

回到咱们最重要的这张图上来:

咱们刚刚说的后退或后退到某一版本,是对 本地库 进行的操作。

那有个问题:
本地库的代码跳到那个版本之后,工作区和暂存区的代码就和本地库的不同步了呀!

那这些参数就是用来管制这些是否 同步 的。

&dollar; git reset –hard xxx

三个区都同步,都跳到这个 xxx 的版本上。

&dollar; git reset –soft xxx

后面两个区不同步,就只有本地库跳到这个版本。

&dollar; git reset –mixed xxx

暂存区同步,工作区不动。

所以呢,用的多的就是 hard.

近程交互

和近程库的交互次要是 ,也就是写入和读取。

5. $ git push

小齐写完了代码,要提交到公司的代码库里,这个过程要用 git push.

当然了,这么用会被打的。。毕竟还要 cr 呢。

5. $ git clone

新来的实习生首先要 clone 整个我的项目到本地来,而后能力增删改查。

当然了理论工作中也没人这么用。。因为每家公司都会有本人包装的工具。不过如果是做 Github 上的开源我的项目,就用得上了。

6. $ git pull

小齐提交了新的代码之后,领导要审查呀,所以用 git pull 把最新的代码拉取下来瞅瞅。

实际上呢,

git pull = fetch + merge

7. $ git fetch

git fetch 这个操作是将近程库的数据下载到本地库,然而工作区中的文件没有更新。

而要谈 get merge,咱们还须要先讲下 分支

mergegit pull 默认的选项,合并其实还有另外一种办法:rebase,中文叫做 变基

8. $ git rebase

rebase 的作用更多的是来整合分叉的历史,能够将某个分支上的所有批改都移到另一分支上,就像是变了基底。

分支与合并

首先咱们来看几个对于分支的基本操作:

9. 查看分支:

$ git branch

相似于ls,可能列出以后所有分支。

git branch -v 可能显示更多信息。

10. 创立分支:

$ git branch <branchName>

11. 切换分支:

$ git checkout <branchName>

有了分支之后必然会有合并:

12. 合并分支:

$ git merge <branchName>

而合并时就可能会有抵触,什么时候会有抵触呢?:

在同一个文件的同一个地位批改时。

因为 Git 会致力的把你们改变不同的中央合并在一起,但如果切实是在同一个中央改的,那它也没方法了,只能留给程序员去手动解决了。

当然了,每个命令延长上来还有有限多个,本文不可能涵盖全副,所以在此重磅举荐齐姐精心筛选的三大学习资源,大家能够自行享受~

学习资源

git help

其实我集体应用最多的是git help

真心不便又好用啊!

比方 git help pull:

先介绍了有哪些参数,而后 description 具体解释了它的工作原理,上面还有图解,有木有太香!!

不过这种形式更像是 cheatsheet,当你曾经晓得了这个命令、只是忘了它的用法的时候去查。

如果你想零碎的学习,那么上面 ???? 的更适宜你。

Pro Git

这本书是强烈推荐了!!

Pro Git 这本书不仅讲了 Git 的根底用法、高级用法,以及最初还深刻解说了 Git 的原理,十分粗疏全面。

书的电子版也能在网站上间接下载。

英文版:

  • https://git-scm.com/book/en/v2

中文版:

  • https://git-scm.com/book/zh/v2

玩游戏

Practice makes perfect!

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

我的项目:https://github.com/pcottle/learnGitBranching

网址:https://learngitbranching.js.org/

我相熟很多工具都是通过小游戏来练习的,比方 vim 的操作,还是蛮举荐这种形式的。就不剧透啦,大家本人去摸索吧~

如果你喜爱这篇文章,记得给我点赞留言哦~你们的反对和认可,就是我创作的最大能源,咱们下篇文章见!

我是小齐,纽约程序媛,终生学习者,每天晚上 9 点,云自习室里不见不散!

更多干货文章见我的 Github: https://github.com/xiaoqi6666…

退出移动版