Git命令
初始化
流程示例
mkdir demo
cd demo
git init
tree .git
其他参数
–initial-branch 初始化分支
–bare 新建裸仓库
–template 可以通过模版创建预先构建好的自定义git目录
配置
git config
配置文件内等级分为三级(逐级递减):
- system:系统配置,存储在etc/gitconfig内
- global:全局配置,存储在当前用户文件夹下的gitconfig内
- local:本地配置,存储在.git/config内
这些等级下的一些配置可能会产生重复,以较低等级的为准
常见的git配置例子:
- 用户名配置:git config user.name “LuckyQu”
- InsteadOf配置:git config –global url.git@github.com:.insteadOf https://github.com/
- 别名配置:git config –global alias.cin “commit –amend –no-edit”
git remote
查看remote
git remote -v
添加remote
git remote add
在同一个Origin上添加不同的push和fetch URL
git remote add origin git@github.com:git/git
git remote set-url –add –push origin git@github.com:My_resp/git
SSH Remote
URL: git@github.com:git/git.git
Key目前有四种类型,RSA,DSA,ECDSAECDSA,ED25519,默认为RSA,推荐使用ED25519
例:ssh-keygen -t ed25519 -C “super.lucky.qu@gmail.com”
提交代码
Object
在git当中,blob,tree,commit,tag都属于Object,其中,blob存储文件的内容,tree存储文件的目录信息,commit存储提交信息,一个commit可以对应唯一版本的代码
在一次提交中,通过commit寻找到tree的信息,每个commit都会存储对应的tree的id,再通过tree存储的信息获得目录树的内容,通过tree中记录的blob的ID来获得blob中的文件内容
Refs
refs的内容就是对应的commit ID,可以把refs当作指针,指向对应的Commit来表示ref的版本
Branch
可以通过git checkout -b来创建一个新分支,分支一般用于开发阶段,是可以不断添加commit进行迭代的
Tag
标签一般表示的是一个稳定版本,指向的commit一般不会变更,通过git tag命令生成一个tag
附注标签
一种特殊的Tag,可以给Tag补充一些额外的信息
通过git tag -a 来完成附注标签的创建
git add
git add 文件名
git commit
git commit 文件名
commit内会存储parent commit字段,通过commit的串联获取历史版本代码
commit -amend可以修改最近的一次提交(ID会改变)
远端同步
拉取代码
clone
拉取完整的仓库到本地目录,可以指定深度,分支
pull
拉取分支并进行合并,等同于fetch后merge
fetch
将远端某些分支的最新代码拉至本地,不会执行merge操作,会修改refs中的remote内的分支信息,要和本地代码合并需要手动操作
推送代码
push
将本地代码推送到远端,使用git push origin main即可
开发流程
不同的工作流
类型 | 代表 | 特点 | 合并方式 |
集中式工作流 | Gerrit / SVN | 只依附主分支进行开发,不存在其他分支 | fast-forward |
分支管理工作流 | Github / Gitlab | 可以定义不同特性进行开发分支,上线分支,在开发完成后通过MR/PR合并进主分支 | 自定义,fast-forward或者Three-way merge都可以 |
集中式工作流
只依托主分支进行研发
流程:拉取代码到本地->直接在主分支完成修改->提交前拉取代码合并处理冲突(如有)->提交本地代码到主分支
基本原理
- 依托于 Change ID 概念,每个提交生成一个单独的代码评审
- 提交上去的代码不会存储在真正的 refs/heads/下的分支中,而是存在一个 refs/for/ 的引用下
- 通过 refs/meta/config 下的文件存储代码的配置,包括权限,评审等配置,每个 Change 都必须要完成 Review 后才能合入
分支管理工作流
分支管理工作流 | 特点 |
Git Flow | 分支类型丰富,规范严格 |
Github Flow | 只有主干分支和开发分支,规则简单 |
Gitlab Flow | 在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布or环境的需要 |