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 init2.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 reflog2.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 -v2.4.8 通过远程仓库创建分支
git fetch origin dev
git checkout -b dev origin/devgit 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 master2.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 tag2.7.4 推送标签到远程
git push origin <tagName>2.7.5 推送所有标签到远程
git push origin --tags2.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 liststash@{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 pop2.9 自定义标签
有时为了方便,自定义标签也比较常用,这里举几个简单例子
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config –-global alias.st status2.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 agentssh-add -l - 添加使用的密钥到
agent,其中-K放到keychain中
ssh-add -K ~/.ssh/id_rsa_another删除其中一个
ssh-add -d ~/.ssh/id_rsa如果临时使用不要加-K
- 查看
ssh agentssh-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-avh4.5 git-flow命令
4.5.1 初始化命令
git flow init4.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 --tags4.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>