这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
Git分布式版本控制系统 | 青训营笔记
Git分布式版本控制系统(上半节)
一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
为什么需要版本控制?
更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码;
历史演变
-
本地版本控制:
-
集中版本控制:SVN
优点: 1.学习简单,更容易操作 2.支持二进制文件,对大文件支持更友好(游戏)
缺点: 1.本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交 2.分支上的支持不够好,对于大型项目团队合作比较困难 3.用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失。
-
分布式版本控制: Git 基本原理 1.每个库都存有完整的提交历史,可以直接在本地进行代码提交 2.每次提交记录的都是完整的文件快照,而不是记录增量 3.通过Push等操作来完成和远端代码的同步
优点 1、分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体2.分支管理功能强大,方便团队合作,多人协同开发 3.校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失 缺点
1.相对SVN更复杂,学习成本更高 2.对于大文件的支持不是特别好(git-lfs工具可以弥补这个功能)
常见问题
1.为什么我明明配置了Git配置,但是依然没有办法拉取代码?
- 没有配置密钥
- 没有权限 2.为什么我 Fetch 了远端分支,但是我看本地当前的分支历史还是没有变化?
- Fetch 只会更新ORigin的分支
Git目录介绍
项目初始化
- mkdir study
- cd study
- git init
--initial-branch初始化的分支 --bare创建一个裸仓库(纯Git目录,没有工作自录) --template可以通过模版来创建预先构建好的自定义git目录
查看树结构
git tree.git 注:win的gitbush是没有tree命令的 如果要使用这个命令
- 去到以下网站 gnuwin32.sourceforge.net/packages/tr…
- 下载对应的Binaries的安装包并将其bin文件夹下的tree.exe解压到git/usr/bin <而不是git/bin>文件夹底下
查看文件内容
cat .git/HEAD
- head master
- config 配置文件信息
- objects 数据文件信息
- refs 分支目录信息
工作区$暂存区
- 工作区:更改代码,新增目录
- 暂存区:存储add$commit保存的记录
保存在 .git目录
2.1.1 Git Config
不同级别的 Git配置
- global
- system
- local 低级别的配置会覆盖高级别的配置
2.1.2 常见的Git配置
- 用户名配置 git config --global user.name“liaoxingju”
git config --global user.email liaoxingju@bytedance.com
- lnstead of配置 git config --global url.git@github.com:.insteadOf github.com/
- Git命令别名配置
git config --global alias.cin "commit --amend --no-edit"
2.2 Git Remote
翻译:
remote:遥控装置,遥控器
一般没有配置的newPlayer是没有git remote的
- 查看remote $ git remote -v
- 添加Remote源 $ git remote add origin_ssh git@github.com:git/git.git
$ git remote add origin_http github.com/git/git.git
- 查看帮助 git remote -h
- 再一次查看remote
- 查看配置文件
- 同一个 Origin设置不同的 Push和Fetch URL git remote add origin git@github.com:git/git
git remote set-url --add --push origin gitegithub.com:MY_REPOSITY/gitgit remote -v
- vim命令直接编辑内部内容 vim .git/config
2.2.1 HTTP Remote
不推荐使用http的方式来访问GitHub 相对比较不安全
- URL: github.com/git/git.git
- 免密配置 内存: git config --global credential.helper 'cache --timegut=3600'
硬盘: git config --global credential.helper "store --file /path/to/credential-file"不指定目录的情况默认是~/.git-credentials
- 将密钥信息存在指定文件中 具体格式: {user}:${password}@github.com
2.2.2 SSH Remote
URL: git@github.com:git/git.git
- 免密配置
SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问目前的Key的类型四种,分别是dsa、rsa、ecdsa、ed25519
默认使用的是rsa,由于一些安全问题,现在已经不推荐使用dsa和rsa了,优先推荐使用ed25519
ssh-keygen -t ed25519 -C"your_email@example.com”密钥默认存在~/.ssh/id_ed25519.pub
我们可以通过打开GitHub配置sshKey 点击头像打开设置 -》SSH and GPG keys-》new SSH key
key为之前生成在 文档.pub 里面
Git Add
功能:
- 会将文件拉到暂存区
- 放在objects目录下
1.创建一个readme.md
- touch readme.md
2.编辑内容
- vim readme.md
git add 前
git add 后
- 通过objectId(object文件)查看内容
git cat-file -pa6c7f60cad44f7196c815944f5faba07614b6e42
- commit 提交
然后多了俩个object 子文件
一个是类型信息 一个是提交信息
$ git commit -m "add readme"
- 看一下object
- 类型信息
- 作者信息
git log 查看最新提交的信息
2.5 Objects
-
commit / tree / blob在git里面都统一称为Object,除此之外还有个 tag的object.
-
Blob:存储文件的内容
-
Tree:存储文件的目录信息
-
Commit:存储提交信息,一个 Commit可以对应唯一版本的代码
如何把这三个信息串联在一起呢?
- 通过 Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID.
- 通过Tree存储的信息,获取到对应的目录树信息。
- 从tree中获得 blob的ID,通过Blob ID获取对应的文件内容。
2.6 refs
Refs文件存储的内容
-
通过 cat [文件目录] refs的内容就是对应的Commit ID
-
因此把ref 当做指针,指向对应的 Commit来表示当前Ref 对应的版本。
不同种类的ref
- refs/heads前缀表示的是分支,除此之外还有其他种类的 ref,比如refs/tags前缀表示的是标签。
Branch
-
git checkout 一b 可以创建一个新分支
-
分支一般用于开发阶段,是可以不断添加Commit进行迭代的
Tag
- 标签一般表示的是一个稳定版本,指向的Commit一般不会变更
git tag v0.0.1
创建一个分支
-
$ git checkout -b test
2.7 Annotation Tag
什么是附注标签?
- 一种特殊的Tag,可以给Tag提供一些额外的信息。
如何创建附注标签?
- 通过git tag -a命令来完成附注标签的创建。
- 查看该tag object的内容。