这是我参与「第五届青训营 」伴学笔记创作活动的第13天。
由于最近写大项目团队需要使用Git,因此基于字节跳动廖兴桔讲师的课程先学习了一些Git的基本知识。
Git是什么?
Git是分布式板块控制系统,是现在大部分分布式项目的版块控制工具。
版本控制历史
本地版本控制
代表工具:RCS
基本原理
本地保存所有变更的补丁集,可以理解为就是所有的Diff,通过这些补丁计算出每个版本的实际的文件内容。
集中式版本控制
代表工具:SVN 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题。
基本原理
所有的用户的代码都提交到远端服务器中,增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突。
分布式版本控制
代表工具:GIT 每一个仓库都能记录历史版本,解决只有一个服务器保存版本的问题。仍是今天一些美术、游戏团队的首选工具,因此他们所迭代的产品的资源都比较大。
基本原理:
- 每个库都存有完整的提交历史,可以直接在本地进行代码提交
- 每次提交记录的都是完整的文件快照,而不是像SVN或RCS一样记录增量
- 通过Push等操作来完成和远端代码的同步
优点
- 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
- 分支管理功能强大,方便团队合作,多人协同开发
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
缺点
对于大文件的支持不是特别好,但git-ifs工具可以弥补这个功能。
Git的衍生平台
Github
全球最大的代码托管平台。
Gitlab
全球最大的开源代码托管平台,项目的所有代码都是开源的,便于在自己的服务器上完成Github的搭建,具备更高的自由度来实现企业的个性化。
Gerrit
由Google开发的一个代码托管平台,Android这个开源项目就托管在Gerrit之上。
Git基本使用方式
Git基本命令
配置
git config
git remote
提交代码
git add
git commit
远端同步
拉取代码:
- clone
- pull
- fetch
推送代码:
- push
Git目录介绍
项目初始化
git init --> 默认分支是monster分支 然后就会有一个.git文件啦,代表git可以操作该文件了。
其他参数
-
--initial-branch 初始化时确定分支
-
--bare 创建一个裸仓库(纯Git目录,没有工作目录)
-
--template 可以通过模板来创建预先构建好的自定义git目录
-
HEAD:
- 表示当前指向的分支
-
config:
- 当前仓库的配置
-
objects:
- 存储一些文件信息
-
refs:
- 存一些分支信息
Git config
不同级别的Git配置
三种级别
- --global
- --system
- --local
每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置。
常见Git基本配置
- 用户名配置
- git config --global user.name "steakSunflower"
- instead of 配置
- git config --global url.git@github.com:.insteadOf github.com/
- Git命令别名配置
- git config --global alias.cin "commit --amend --no-edit"(用于简化命令)
Git Remote
表示本地和远端仓库的一些关联信息。
查看remote
remote -v
添加remote
git remote add origin_ssh git@github.com:git/git.git
git remote add origin_http github.com/git/git.git
同一个Origin设置不过不同的Push和Fetch URL
get remote set-url --add --push origin git@github.com:my_repo/git.git
HTTP Remote
走的是HTTP协议做身份认证。
URL:github.com/git/git.git
免密配置
-
密码存内存:git config --global credential.helper 'cache --timeout=3600'
-
密码存硬盘:git config --global credential.helper "store --file /path/to/credential-file"
-
不指定目录的情况默认是~/.git-credentials
-
将密钥信息存在指定文件中
-
具体格式:{user}:${password}@github.com
但这是相对不太安全的。
SSH Remote
URL:git@github.com:git/git.git
免密配置
SSH可以通过公私钥的机制,将生成公钥存在服务端,从而实现免密访问。
目前的Key的类型四种:dsa、rsa、ecdsa、ed25519。
默认使用的是rsa,由于一些安全问题,现在已经不推荐使用rsa和dsa了,优先推荐使用ed25519。
公私钥配置:
ssh-keygen -t ed25519 -C "steak1452560640@163.com"
Git add
git cat-file -p xxxxxxxxxxx(id) --> 查看文件内容
Objects
commit/tree/blob在git中统一称为Object,除此之外还有个tag的object。
- Blob
- 存储文件的内容
- Tree
- 存储文件的目录信息
- Commit
- 存储提交信息,一个commit可以对应唯一版本的代码
三个信息如何串联在一起:
- 通过Commit寻找到Tree的信息,每个Commit都会存储对应的Tree ID
- 通过Tree存储的信息,获取到对应的目录树信息
- 从tree中获得blob的ID,通过Blob ID获取对应的文件内容
Refs
Branch
git checkout -b test 创建一个新分支 分支一般用于开发阶段,是可以不断添加Commit进行迭代的,
Tag
标签一般表示的是一个稳定版本,指向的Commit一般不会变更,
通过git tag 命令生成tag
Refs在创建后会多一个test的分支。
Refs的内容就是对应的Commit ID。 因此把ref当做指针,指向对应的Commit来表示当前Ref对应的版本。
以上内容若有不正之处,恳请您不吝指正!