Git 的正确使用姿势与最佳实践
基本原理
- 每个库都存有完整的提交历史,可以直接在本地进行代码提交
- 每次提交记录都是完整的文件快照,而不是记录增量
- 通过Push等操作完成和远端代码的同步
优点
- 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
- 分支管理功能强大,方便团队多人协作
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
缺点
- 更为复杂,学习成本较高
- 对于大文件的支持不是很好(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协议认证的远程仓库。
# 免密配置
#将密码保存在内存里,存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:版本信息
Objects和Refs都是.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往主干分支提交代码
合作方式
- 创建好仓库后,其他用户由fork来创建自己的仓库
- 创建好仓库后,给团队成员分配权限,在同一个仓库下工作
学习感想
本次学习主要学的是更多的git操作命令,以及git进行版本和分支管理的方法,这是我以前所欠缺的方向。对更好的合作开发项目有了实质性的帮助。