Git和git-flow
1. Git介绍
Git是目前世界上最先进的分布式版本控制系统,由linux之父Linus Torvalds开发完成
1.1 推荐教程
1.2 git版本库
如上图所示。
文件系统包含了工作区、缓存区和仓库分支。
- add命令 把
工作区内容缓存到缓存区 - commit命令 把
缓存区内容提交到仓库分支 - 当
工作区内容已经添加到缓存区,尚未提交到仓库分支,
使用reset HEAD还原缓存区,再使用checkout -- <file>还原工作区 - 当
工作区内容已经添加到缓存区,并已经提交仓库分支,
使用checkout HEAD <file>还原工作区 - 这就是本地文件系统和版本库结构
1.3 git origin
如上图所示。
把origin仓库作为中心仓库,跟其他仓库类似,只不过origin是约定的命名,就指中心仓库。
每位developer都可以对origin进行pull/push操作,同时developer之间可以相互pull/push。
Alice and Bob, Alice and David, and Clair and David 构成了3个小组。
- 这就是各个分布式的PC端版本库的关系,一般人们熟知的gitlab/github就处于origin这个位置。
2. Git客户端工具
2.1 工具下载
git bash: https://git-scm.com/downloads
2.2 配置全局用户信息
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
2
每一次commit,git会用
user.name和user.email记录提交信息,该信息与密码或秘钥等授权无关
如果不加--global,可以在项目.git同级目录下,配置上述信息
优先级是,先到项目配置中找用户信息,如果找不到,向上找全局用户信息,如果找不到,抛出错误
2.3 基本操作
2.3.1 创建版本库
git init
2.3.2 提交版本库
git add <file>
git commit -m '备注信息'
2
第1步添加到缓存区,第2步提交的版本库
file如果用.表示,代表把所有修改添加到缓存区
- 所有单个
file,用.替换的,都代表所有文件
2.3.3 查看状态
git status
工作区修改未添加到缓存区的,红色显示;
缓存区有内容未提交到版本库的,绿色显示
已经提交完毕,没有红色或绿色,并显示对应的提示信息
2.3.4 对比不同
git diff
默认对比
工作区和缓存区不同,后边添加空格 HEAD,对比工作区和分支
2.3.5 查看提交日志(常用)
git log --pretty=oneline --graph --all
如果内容过长,按键盘
q退出
2.3.6 查看历史命令
git reflog
2.3.7 丢弃工作区修改
git checkout -- <file>
该命令针对尚未添加到
缓存区的
--是必须的,否则变成了切换分支
2.3.8 丢弃缓存区修改
git reset HEAD <file>
丢弃
缓存区后,执行2.3.7还原工作区
2.3.9 撤销提交
git reset --hard <commit-id>
HEAD^表示<commit-id>代表退回到上一版本,HEAD^^代表上上版本,HEAD~100代表上100版本。
<commit-id>也可以是提交的id号,也可以是tag标签
git push origin HEAD --force
撤销远程版本库的提交
2.3.10 删除版本库
git rm <file>
该命令前提是工作区已经删除某文件
如果工作区误删除,尚未提交到版本库,使用git checkout -- <file>还原
2.4 远程仓库
2.4.1 配置公钥/私钥
- 查看本地公钥私钥,如果存在不再生成
ls -al ~/.ssh
- 生成公钥和私钥
ssh-keygen --help
cd ~/.ssh
ssh-keygen -t rsa -b 4096
2
3
-t 指定加密方式
-b 字节数
- 开启ssh代理
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
2
加速秘钥验证过程
- 添加公钥的
github/gitlab
复制id_rsa.pub中的内容,添加到Account setting中SSH Keys页面。
2.4.2 添加远程仓库
git remote add origin 远程仓库地址
2.4.3 首次推送分支到远程仓库
git push -u origin master
master是把本地master分支推送到远程master分支
2.4.4 非首次推送分支到远程仓库
git push origin master
master是把本地master分支推送到远程master分支,也可以推送其他分支如develop
2.4.5 克隆远程仓库
git clone 远程仓库地址
2.4.6 拉取远程仓库
git pull origin master
origin master可以省略,默认为origin master
2.4.7 查看远程仓库地址
git remote -v
2.4.8 通过远程仓库创建分支
git fetch origin dev
git checkout -b dev origin/dev
2
git pull === git fetch & git merge
2.5 分支管理
2.5.1 创建分支
git checkout -b develop
实际上分两条命令
git branch develop git checkout develop
2.5.2 查看分支
git branch
显示所有分支,当前分支高亮显示
2.5.3 切换分支
git checkout master
2.5.4 合并分支
git merge develop
git merge --no-ff -m "merge with no-ff" dev
2
已经切换到
master分支,将develop分支内容合并到master上
默认fast forward模式,合并后删除合并痕迹
加空格 --no-ff禁用fast forward,合并后痕迹保留 加空格 -m添加备注
2.5.5 删除分支
git branch -d feature1
git push origin -d feature1
2
-d尚未合并抛出异常,合并后放可以删除分支
-D强制删除分支,不要合并就可以删除
第2条删除远程分支
2.6 冲突解决
2.6.1 push操作
如果远程更新了file1,本地修改了file1,当执行push操作时,会报错并提示
- 拉取最新代码
git pull
- 解决冲突
<<<<<< , ======= , >>>>>>标记了要解决的冲突
- 再次
push
2.7 标签管理
2.7.1 新建标签
- 简略写法
git tag <tagName> <commit-id>
<commit-id>可以不写,默认执行HEAD
- 完整写法
git tag -a <tagName> -m '备注信息' <commit-id>
-a指定标签名,-m执行备注信息
2.7.2 显示标签详细信息
show <tagName>
2.7.3 显示所有标签名称
git tag
2.7.4 推送标签到远程
git push origin <tagName>
2.7.5 推送所有标签到远程
git push origin --tags
2.7.6 删除本地标签
git tag -d <tagName>
2.7.7 删除远程标签
git push origin :refs/tags/<tagName>
2.8 工作现场
git stash命令只能用于本地,不能用于远程
2.8.1 储藏工作现场
git stash
在创建紧急
bug分支前,还有代码尚未提交到版本库,并且工作进行到半路,不希望提交
git status会发现是干净的,没有尚未提交的代码
2.8.2 查看列表
git stash list
stash@{0}: WIP on dev: f52c633 add merge
2.8.3 恢复现场,不删除数据
git stash apply
后边添加
空格 stash@{0}指向具体数据
2.8.4 删除栈顶
git stash drop
后边添加
空格 stash@{0}指向具体数据
2.8.5 恢复现场,删除栈顶数据
git stash pop
2.9 自定义标签
有时为了方便,自定义标签也比较常用,这里举几个简单例子
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config –-global alias.st status
2
3
4
2.30 避免bug重复劳动
git cherry-pick <commit>
在master分支上修复的bug,想要合并到当前dev分支
使用该命令,把bug提交的修改“复制”到当前分支,避免重复劳动
3. git-flow
3.1 git-flow介绍
git工作流,就像代码需要代码规范一样,代码管理同样需要一个清晰的流程和规范
Vincent Driessen 为了解决这个问题提出了 A Successful Git Branching Model
3.2 git-flow分支图
3.3 各分支职责
3.3.1 Master分支
主分支,唯一且稳定的分支。只能来自Release或Hotfix的合并。
3.3.2 Develop分支
开发分支,唯一的。从该分支新建Feature分支,并将Feature分支合并到该分支。
发布Release分支
合并Hotfix分支,前提是Release分支不存在
3.3.3 Feature分支
功能分支,从Develop创新新功能,完成后合并到Develop。
如果push到远程服务器origin,可以协作开发。
3.3.4 Release分支
发布版本分支,同一时间只有一个Release分支。
测试修复bug,注意少量bug。
合并到Master和Develop,并打tag。
3.3.5 Hotfix分支
紧急修复分支,基于Master分支,修复bug后合并会Master分支,并且打tag。
如果Release存在,则合并到Release,否则合并到Develop。
3.4 git-flow安装
brew install git-flow-avh
3.5 git-flow命令
3.5.1 初始化命令
git flow init
3.5.2 feature命令
- 创建一个feature
git flow feature start feature1
创建了一个基于
develop的特性分支,并切换到feature1
- 完成一个feature
git flow feature finish feature1
合并
feature1分支到develop,删除feature1分支,切换回develop分支
3.5.3 release命令
- 创建一个release
git flow release start v1.0.1
创建了一个基于
develop的预发版分支
- 完成一个release
git flow release finish v1.0.1
合并
release分支到master和develop,打tag,删除release分支
- push标签
git push --tags
3.5.4 hotfix命令
- 创建一个hotfix
git flow hotfix start v1.0.2
创建了一个基于
master的紧急修复分支,并切换到hotfix
- 完成一个hotfix
git flow hotfix finish v1.0.2
合并
hotfix分支到master,如果release存在,合并到release,否则合并到develop
删除hotfix分支,切换回develop分支
3.5.5 通用命令
- 发布
git flow <feature/release> publish <feature1/v1.0.1>
- 拉取
git flow <feature/release> pull origin <feature1/v1.0.1>
3.6 推荐UI工具
推荐UI工具
免费工具,支持windows和macOS
建议:UI工具只用来查看或检查问题,主要功能利用命令实现