Git 的正确使用姿势与最佳实践 | 青训营笔记

144 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

Git基本使用方式

Snipaste_2022-05-24_10-30-00.jpg

git init 初始化

Snipaste_2022-05-24_10-38-44.jpg
tree .git

Snipaste_2022-05-24_10-39-27.jpg
关于git bash 不支持tree命令,cmd命令行支持tree命令 www.cnblogs.com/snowdreams1…

git 目录

Snipaste_2022-05-24_10-51-37.jpg

git config

三个级别

  1. git config --global
  2. git config --system
  3. 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查看配置

1.jpg
cat .git/config 或者vim .git/config编辑配置文件

Snipaste_2022-05-24_13-09-51.jpg

SSH Remote配置公钥

目前key类型有四种:dsa,rsa,ecdsa,ed25519
默认使用rsa,但是目前由于安全原因,不推荐使用dsa和rsa,优先推荐使用ed25519
ssh-keygen -t ed25519 -C "email"
然后将生成的公钥复制到GitHub中

Snipaste_2022-05-24_20-00-02.jpg

Snipaste_2022-05-24_19-59-55.jpg

git add

在本地仓库中创建一个文件,使用git add命令前后Object变化

截图录屏_选择区域_20220524205121.png 截图录屏_选择区域_20220524205102.png
新增内容为新增文件的id676b75e90452d098ba4c9e3fa8c0646dd986401c
使用git cat-file -p 676b75e90452d098ba4c9e3fa8c0646dd986401c可查看文件内容

git commit

将新增文件提交,再看一下tree命令

截图录屏_选择区域_20220524205722.png
新增了两个文件

截图录屏_选择区域_20220524210215.png

Object

commit/tree/blob在git里面统称为Object

  • blob存储文件内容
  • tree存储文件的目录信息
  • commit存储提交信息,一个commit可以对应唯一版本的代码 通过commit可以找到tree信息,每个commit都会存储对应的tree id

截图录屏_选择区域_20220524223808.png 通过tree存储的信息,获取到对应的目录树信息

截图录屏_选择区域_20220524223847.png 从tree中获得blob的id,通过blob id获取对应的文件内容

截图录屏_选择区域_20220524224135.png

Refs

git checkout -b test 创建分支并切换,分支一般用于开发阶段,可以不断commit进行迭代 可以看到refs中增加了test分支

截图录屏_选择区域_20220524224422.png refs的内容是对应的commit id,ref相当于一个指针,指向对应commit来表示当前ref对应的版本

截图录屏_选择区域_20220524225256.png

tag

tag标签一般表示的是一个稳定版本,指向的commit一般不会变更
使用git tag 创建tag git tag v0.0.1 截图录屏_选择区域_20220524225810.png 通过git tag -a 命令创建附注标签 git tag -a v0.0.2 -m "add feature 1"
可以看到refs中增加了一个内容,objec中也新增了一个对象

截图录屏_选择区域_20220524230447.png

截图录屏_选择区域_20220524230550.png 查看对象内容

截图录屏_选择区域_20220524230746.png 使用cat .git/refs/tags/v0.0.2,发现指向的commit id变了

截图录屏_选择区域_20220524231147.png

追溯历史版本

通过ref指向的commit获取唯一的代码版本
git log获取commit id
git cat-file -p 1e0a5646c219439545e327e17ec3c20783fb9cbc

截图录屏_选择区域_20220524232350.png commit里面会存有parent commit字段,通过commit的串联获取历史版本代码
git目录发生的变化

  1. 新增tree object
  2. 新增blob object
  3. 新增commit object test ref指向新的commitcat .git/refs/heads/test

截图录屏_选择区域_20220524232922.png

修改历史版本

方式一 commit --amend

git commit --amend可以修改commit message 截图录屏_选择区域_20220524233748.png 修改之后通过git log查看最新的commit已经改变,从 1e0a5646c219439545e327e17ec3c20783fb9cbc变成了1c8c3f39ffe42f2b5b87f71fdb086b0268663244

原来的commit还保留,通过git fsck --lost-found可以查看

截图录屏_选择区域_20220525081334.png

方式二 rebase

通过git rebase -i HEAD~3 可以实现对最近三个commit的修改:

  1. 合并commit
  2. 修改具体的commit message
  3. 删除某个commit

方式三 filter --branch

指定删除所有提交中的某个文件或全局修改邮箱地址等操作

Git GC

git gc

通过git gc 命令,可以删除一些不需要的object,以及对一些object打包压缩来减少仓库的体积
git gc --prune=now指定的是修剪多久之前的对象

截图录屏_选择区域_20220525082418.png

reflog

reflog用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失数据,手动将日期设置为过期 git reflog expire --expire=now --all

进行以上操作后,objects对象中内容被pack,不需要的commit object被删除

截图录屏_选择区域_20220525082654.png cat .git/packed-refs查看pack内容 image.png

拉取和推送

  • clone:拉取完整的仓库代码,可以指定分支
  • fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,需要手动合并本地代码
  • pull:拉取远端某分支,并和本地代码合并,等同于git fetch+git merge。可能存在冲突,需要解决冲突
  • push:推送远端仓库

git 研发流程

集中式工作流

只依托于master分支进行研发活动
工作方式

  1. 获取远端master代码
  2. 直接在master分支完成修改
  3. 提交前拉取最新的master代码和本地代码进行合并(使用rebase),如果有冲突需要解决冲突
  4. 提交本地代码到master

分支管理工作流

  • Git Flow
  • Github Flow
  • Gitlab Flow

标题:「Git 的正确使用姿势与最佳实践」第三届字节跳动青训营 - 后端专场

网址:live.juejin.cn/4354/yc_Git…