这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
Git基本使用方式
git init 初始化
tree .git
关于git bash 不支持tree命令,cmd命令行支持tree命令
www.cnblogs.com/snowdreams1…
git 目录
git config
三个级别
- git config --global
- git config --system
- git confug --local 不同级别配置可以重复,低级别配置可以覆盖高级配置
常见git配置
用户名配置
git config --global user.name "username"
git config --global user.email 邮箱地址
Instead of配置
git config --global url.git@github.com:.insteadOf https://github.com/
将http协议和ssh协议进行替换
Git命名别名配置
git config --global alias.cin "commit --amend --no-edit"
git remote
配置
git remote add origin_ssh git@github.com:git/git.git
git remote add origin_http https://github.com/git/git.git
git remote add origin git@github.com:git/git.git
git remote set-url --add --push origin git@github.com:my_repo/git.git
使用git remote -v查看配置
cat .git/config 或者vim .git/config编辑配置文件
SSH Remote配置公钥
目前key类型有四种:dsa,rsa,ecdsa,ed25519
默认使用rsa,但是目前由于安全原因,不推荐使用dsa和rsa,优先推荐使用ed25519
ssh-keygen -t ed25519 -C "email"
然后将生成的公钥复制到GitHub中
git add
在本地仓库中创建一个文件,使用git add命令前后Object变化
新增内容为新增文件的id676b75e90452d098ba4c9e3fa8c0646dd986401c
使用git cat-file -p 676b75e90452d098ba4c9e3fa8c0646dd986401c可查看文件内容
git commit
将新增文件提交,再看一下tree命令
新增了两个文件
Object
commit/tree/blob在git里面统称为Object
- blob存储文件内容
- tree存储文件的目录信息
- commit存储提交信息,一个commit可以对应唯一版本的代码 通过commit可以找到tree信息,每个commit都会存储对应的tree id
通过tree存储的信息,获取到对应的目录树信息
从tree中获得blob的id,通过blob id获取对应的文件内容
Refs
git checkout -b test 创建分支并切换,分支一般用于开发阶段,可以不断commit进行迭代
可以看到refs中增加了test分支
refs的内容是对应的commit id,ref相当于一个指针,指向对应commit来表示当前ref对应的版本
tag
tag标签一般表示的是一个稳定版本,指向的commit一般不会变更
使用git tag 创建tag git tag v0.0.1
通过git tag -a 命令创建附注标签
git tag -a v0.0.2 -m "add feature 1"
可以看到refs中增加了一个内容,objec中也新增了一个对象
查看对象内容
使用
cat .git/refs/tags/v0.0.2,发现指向的commit id变了
追溯历史版本
通过ref指向的commit获取唯一的代码版本
git log获取commit id
git cat-file -p 1e0a5646c219439545e327e17ec3c20783fb9cbc
commit里面会存有parent commit字段,通过commit的串联获取历史版本代码
git目录发生的变化
- 新增tree object
- 新增blob object
- 新增commit object
test ref指向新的commit
cat .git/refs/heads/test
修改历史版本
方式一 commit --amend
git commit --amend可以修改commit message
修改之后通过git log查看最新的commit已经改变,从 1e0a5646c219439545e327e17ec3c20783fb9cbc变成了1c8c3f39ffe42f2b5b87f71fdb086b0268663244
原来的commit还保留,通过git fsck --lost-found可以查看
方式二 rebase
通过git rebase -i HEAD~3 可以实现对最近三个commit的修改:
- 合并commit
- 修改具体的commit message
- 删除某个commit
方式三 filter --branch
指定删除所有提交中的某个文件或全局修改邮箱地址等操作
Git GC
git gc
通过git gc 命令,可以删除一些不需要的object,以及对一些object打包压缩来减少仓库的体积
git gc --prune=now指定的是修剪多久之前的对象
reflog
reflog用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失数据,手动将日期设置为过期
git reflog expire --expire=now --all
进行以上操作后,objects对象中内容被pack,不需要的commit object被删除
cat .git/packed-refs查看pack内容
拉取和推送
- clone:拉取完整的仓库代码,可以指定分支
- fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,需要手动合并本地代码
- pull:拉取远端某分支,并和本地代码合并,等同于git fetch+git merge。可能存在冲突,需要解决冲突
- push:推送远端仓库
git 研发流程
集中式工作流
只依托于master分支进行研发活动
工作方式
- 获取远端master代码
- 直接在master分支完成修改
- 提交前拉取最新的master代码和本地代码进行合并(使用rebase),如果有冲突需要解决冲突
- 提交本地代码到master
分支管理工作流
- Git Flow
- Github Flow
- Gitlab Flow
标题:「Git 的正确使用姿势与最佳实践」第三届字节跳动青训营 - 后端专场