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这个位置。
1.4 sourcetree
推荐的分支比对工具
https://www.sourcetreeapp.com/
免费工具,支持windows和macOS
建议:UI工具只用来查看或检查问题,主要功能利用命令实现
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"
每一次commit,git会用
user.name
和user.email
记录提交信息,该信息与密码或秘钥等授权无关
如果不加--global
,可以在项目.git
同级目录下,配置上述信息
优先级是,先到项目配置中找用户信息,如果找不到,向上找全局用户信息,如果找不到,抛出错误
2.3 基本操作
2.3.1 创建版本库
git init
2.3.2 提交版本库
git add <file>
git commit -m '备注信息'
第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
-t 指定加密方式
-b 字节数
- 开启ssh代理
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
加速秘钥验证过程
- 添加公钥的
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
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
已经切换到
master
分支,将develop
分支内容合并到master
上
默认fast forward
模式,合并后删除合并痕迹
加空格 --no-ff
禁用fast forward
,合并后痕迹保留 加空格 -m
添加备注
2.5.5 删除分支
git branch -d feature1
git push origin -d feature1
-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.30 避免bug重复劳动
git cherry-pick <commit>
在master分支上修复的bug,想要合并到当前dev分支
使用该命令,把bug提交的修改“复制”到当前分支,避免重复劳动
3. RSA密钥对配置
- 说明
github、gitee、gitlab等多账号配置 - github官网说明
https://docs.github.com/zh/authentication/troubleshooting-ssh/using-ssh-over-the-https-port
3.1 别名法(推荐)
- 生成新的密钥对
ssh-keygen -t rsa -C anotherEmail@163.com
- 修改密钥对文件名,不要覆盖默认的
Enter file in which to save the key (/Users/$USER/.ssh/id_rsa):
/Users/$USER/.ssh/id_rsa_another
- 查看
config
文件是否存在ls ~/.ssh/
- 创建config文件
touch ~/.ssh/config
- 编辑config文件
vim ~/.ssh/config
#Default
Host gitee.com
Hostname gitee.com
IdentityFile ~/.ssh/id_rsa
Host github.com
Hostname ssh.github.com
Port 443
IdentityFile ~/.ssh/id_rsa
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa
Host 123.56.159.159
Hostname 123.56.159.159
IdentityFile ~/.ssh/id_rsa
#SnapInspect
Host s.github.com
Hostname ssh.github.com
Port 443
IdentityFile ~/.ssh/id_rsa_snapinspect
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa
- 测试弱链接
ssh -T -v -p 443 git@ssh.github.com
ssh -T git@gitee.com
ssh -vT git@github.com
ssh -p 9222 -T git@123.56.159.159
ssh -T -v git@s.github.com
公式
ssh -T -v git@[config配置的host值]
,-v显示详细信息PubkeyAcceptedAlgorithms +ssh-rsa
和HostkeyAlgorithms +ssh-rsa
用来兼容新老版本差异
3.2 切换法(不推荐)
- 生成新的密钥对
ssh-keygen -t rsa -C anotherEmail@163.com
- 修改密钥对文件名,不要覆盖默认的
Enter file in which to save the key (/Users/$USER/.ssh/id_rsa):
/Users/$USER/.ssh/id_rsa_another
- 查看
ssh agent
ssh-add -l
- 添加使用的密钥到
agent
,其中-K
放到keychain中
ssh-add -K ~/.ssh/id_rsa_another
删除其中一个
ssh-add -d ~/.ssh/id_rsa
如果临时使用不要加-K
- 查看
ssh agent
ssh-add -l
- 切换到
id_rsa_another
密钥,默认密钥将失效
4. git-flow(适合复杂工程)
4.1 git-flow介绍
git工作流,就像代码需要代码规范一样,代码管理同样需要一个清晰的流程和规范Vincent Driessen
为了解决这个问题提出了 A Successful Git Branching Model
4.2 git-flow分支图

4.3 各分支职责
4.3.1 Master分支
主分支,唯一且稳定的分支。只能来自Release
或Hotfix
的合并。
4.3.2 Develop分支
开发分支,唯一的。从该分支新建Feature
分支,并将Feature
分支合并到该分支。
发布Release
分支
合并Hotfix
分支,前提是Release
分支不存在
4.3.3 Feature分支
功能分支,从Develop
创新新功能,完成后合并到Develop
。
如果push到远程服务器origin,可以协作开发。
4.3.4 Release分支
发布版本分支,同一时间只有一个Release
分支。
测试修复bug,注意少量bug。
合并到Master
和Develop
,并打tag。
4.3.5 Hotfix分支
紧急修复分支,基于Master
分支,修复bug后合并会Master
分支,并且打tag。
如果Release
存在,则合并到Release
,否则合并到Develop
。
4.4 git-flow安装
brew install git-flow-avh
4.5 git-flow命令
4.5.1 初始化命令
git flow init
4.5.2 feature命令
- 创建一个feature
git flow feature start feature1
创建了一个基于
develop
的特性分支,并切换到feature1
- 完成一个feature
git flow feature finish feature1
合并
feature1
分支到develop
,删除feature1
分支,切换回develop
分支
4.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
4.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
分支
4.5.5 通用命令
- 发布
git flow <feature/release> publish <feature1/v1.0.1>
- 拉取
git flow <feature/release> pull origin <feature1/v1.0.1>