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

103 阅读4分钟

Git 的正确使用姿势与最佳实践

基本原理

  1. 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  2. 每次提交记录都是完整的文件快照,而不是记录增量
  3. 通过Push等操作完成和远端代码的同步

优点

  1. 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
  2. 分支管理功能强大,方便团队多人协作
  3. 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失

缺点

  1. 更为复杂,学习成本较高
  2. 对于大文件的支持不是很好(git-lfs工具可以弥补此功能)

基本git命令

git init

此命令主要是可以对仓库进行一个自定义的初始化。不选参数可以默认初始化出一个分支。

git init [参数]
# 可选参数
# --initial-branch 初始化的分支
# --bare 创建一个裸仓库
# --template 通过模板创建预先构建好的自定义git目录

git config

有三种级别的配置,从高到低为:系统配置,全局配置,本地配置。

每个级别的配置可能会重复,但低级别配置会覆盖高级别的配置,有点类似于程序编写时,作用域越接近的将被采用。

git config --system #存于/etc/gitconfig中
git config --global #存于~/.gitconfig中
git config --local  #存于.git/config中

常见配置

#用户名配置
git config --global user.name username
git config --global user.email usermail
#替换配置,将actual-url开头的命令替换为redirect-from-url
git config --global url.redirect-from-url.insteadOf actual-url
#别名配置,简化命令,配置cmd为redirect-cmd的别名
git config --global alias.cmd "redirect-cmd"

git remote

主要对在本地分析出远端的仓库信息

git remote #列出已存在的远程分支
git remote -v #列出详细信息
git remote add url #添加一个远程仓库
git remote rm name #删除远程仓库
git remote rename old_name new_name #重命名仓库
git remote -h #帮助文档

HTTP Remote

对于采用http协议认证的远程仓库。

github.com/git/git.git

# 免密配置
#将密码保存在内存里,存3600s
git config --global credential.helper 'cache --timeout=3600'
#将密码保存在硬盘里,指定文件地址,默认是~/.git-credentials
git config --global credential.helper "store --file filepath" 

SSH Remote

采用SSH秘钥进行认证的远程仓库。一般选择此方法创建仓库。

git@github.com:git/git.git

SSH 可以通过公私钥的机制,将生成公钥存放到服务端,从而实现免密访问

#免密配置
ssh-keygen -t ed25519 -C "email"
cat `key-path`

将生成的公钥放置到GitHub网站的SSH-Key中

提交

# 将文件提交到暂存区
git add <filename> #filename可以直接用'.'代替,表示全部文件
git status #查看当前状态
#通过在object文件夹下,新增的文件夹名与其中文件名可以查看提交内容
git cat-file -p xxxxx #xxxxx即加密的名称
#添加信息
git commit -m “消息”
git push #推送至远程仓库

tree .git 获取文件结构

Objects

  • Blob :存储文件的内容
  • Tree :存储文件的目录信息
  • Commit :存储提交信息,一个commit可以对应唯一版本号的代码
  • tag :存储其指向的commit Object是什么,还有一些附带信息。

Refs

heads:分支信息

tag:版本信息

ObjectsRefs都是.git目录下的项目信息存储目录,是判定分支和版本的重要依据。

#创建新分支
git checkout -b test
#生成版本
git tag v0.0.1

修改历史版本

git commit --amend #修改最近一次commit信息
git rebase -i HEAD~3 #对最近三个commit修改
git filter --branch

rebase的功能:

  • 合并commit
  • 修改具体的commit message
  • 删除某个commit

悬空commit:没有ref指向的commit

git fsck --lost-found #查找悬空commit

git GC

垃圾回收,删除一些不需要的object,并且对object进行一些打包压缩来减少仓库体积

git reflog expire=now --all #手动将日志设置为过期
git gc prune=now #指定修减多少时间以前的,默认两周

同步

Clone 克隆仓库

Fetch 拉取远端某些分支最新代码到本地,不执行merge操作

pull 拉取远端某分支,并进行合并,相当于git fetch+git merge,但可能存在冲突,需要解决冲突。

git研发流程

GitHub分支管理工作流

只有一个主干分支,基于Pull Request往主干分支提交代码

合作方式

  1. 创建好仓库后,其他用户由fork来创建自己的仓库
  2. 创建好仓库后,给团队成员分配权限,在同一个仓库下工作

学习感想

本次学习主要学的是更多的git操作命令,以及git进行版本和分支管理的方法,这是我以前所欠缺的方向。对更好的合作开发项目有了实质性的帮助。