这是我参与「第三届青训营-后端场」笔记创作活动的第5篇笔记。
Git 命令基本使用方式和原理
快速开始
mkdir test
cd test
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin 仓库地址
git push -u origin "master"
Git 配置
- Git Config
Git 配置,分成本地,用户,系统基本的配置
- Git Remote
Git Remote 配置,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式
代码提交
- Git Add
将代码从工作区提交到暂存区
- Git Commit
将暂存区代码提交到 Git 存储
Git 存储基本概念
-
Ref
- Tag 仓库标签
- Branch 仓库分支
-
Object
- Blob 存储文件内容信息
- Tree 存储目录树信息
- Commit 存储提交信息
- Tag 存储附注标签信息
代码同步
- Git Clone
将代码从远端拉取到本地
- Git Fetch & Git Pull
将远端仓库代码同步到本地仓库
- Git Push
将本地代码同步到远端仓库
课中问题
-
为什么配置了Git配置,但是依然没有办法拉取代码呢?
- 没有配置密钥,或者没有权限
- instead of 配置没有配,配置类ssh免密配置,但是使用的还是http协议访问
-
为什么Fetch了远端分支,但是我看本地当前的分支历史还是没有变化?
- Fetch会把代码拉取到本地的远程分支,但是并不会合并到当前分支,所以当前分支历史没有改变
-
Clone
拉取完整的仓库代码到本地目录,可以指定分支,深度。
- Fetch(不清楚远端情况)
将远端的某些分支最新代码拉取到本地,不会执行merge操作,会修改refs。remote内的分支信息,如果需要和本地代码合并需要手动操作。
- Pull(清楚远端情况)
拉取远端分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase 完成 git fetch + git rebase操作。可能存在冲突,需要解决。
- Git init
追溯历史版本
通过使用git log命令可以获取最新提交版本代码的Commit Id。
使用git cat-file -p命令可以在显示的结果中找到当前commit版本的parent的Commit Id,可以用于获取历史版本的代码
修改历史版本
通过
git fsck --lost-found命令可以查看当前是否有悬空的Object(没有ref指向的object),通过上述操作,git commit --amend命令使得之前的那个commit id指代的代码版本已经没有作用了。
Git GC
- GC
通过git gc命令,可以删除一些不需要的object,以及对object进行一些打包压缩来减少仓库的体积
- Reflog
reflog用于记录操作日志,防止误操作之后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
- 指定时间
git gc prune=now指的是修剪多久之前的对象,默认是两周前
Git 研发流程
集中式工作流
- Gerrit 平台
围绕主分支进行开发
分支管理工作流
- Git Flow
- Github Flow
- Gitlab Flow
如何合并代码
- Three Way Merge
- Fast Forward Merge
选择合适的工作流
- 少量多次提交
- 保证 CR / CI 等流程通过后才可合入
- 尽量保证主分支整洁