Git
What's git?
相关信息
Git 是一个免费的开源分布式版本控制系统。
占用空间小,性能快,凭借本地分支、暂存区域和多个工作流程等功能,超越 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具。
版本控制是什么
在软件项目开发中,每个里程碑或节点完成后保存一次项目的快照,可以查看历史版本快照,显示差异。方便协同开发和代码回滚。
使用Git
Git 配置用户信息:
git config --global user.name zhangsan
git config --global user.emial 252950418@qq.com
Git 配置删除用户:
git config --global --unset user.name zhangsan
SSH 密匙生成,在 Github 配置对应 SSH 密钥实现身份验证:
ssh-keygen -t rsa -C '邮箱'
分支
分支是可以在同一项目下并行修改代码的功能,在不影响主分支的情况下修改代码。
常见分支名:
master / main
:主分支,稳定的,每个 commit 是一个版本,受保护。hotfixs
:用于修复紧急的线上问题。release
:用于预发布和少量的 bug 修复,受保护。develop
:开发分支,尽早合并到 develop 及时发现问题,受保护。feature
:用于单个功能或者 fix bug 使用。
feature
feature 功能分支的本质是只要功能正在开发中就存在,从 develop 分支切出,最终经过 code review 合并回 develop 分支(确保新功能合并到即将发布的版本中)或丢弃。
注意
注意关闭 fast-forward 功能,保证每次 merge 都产生一个 commit,为了清楚看到分支之间合并,便于后续的管理。
本地合并其他分支时同样也建议加上 --no-ff
参数(禁止fast-forward)。
develop
develop 分支合并 feature 分支后,部署到开发和测试环境提供服务。如果测试反馈有问题,从之前的功能分支继续完成 bug fix 并提 merge request.
release
release 预发布分支,一般命名为 release-*
* 为版本号。当 develop 基本稳定且合并了所有预计上线的功能这时可以切出。从 develop 切出,合并到 develop 和 master .
release 分支仅允许进行较小的bug修复,不允许新增功能。
当 release 分支从 develop 切出后,develop 已经将要发布的功能交给了 release 分支,develop 可以开始接收下个版本的 feature 分支。
master
master 主分支,当 release 分支通过测试到了实际可以发布的状态,将 release 分支合并到 master 分支。同时将 release 分支合并回 develop 分支(让 release 分支上的 bug fix 代码同步到 develop 上),然后可以删除 release 分支。
master 合并了 release 分支之后,打上版本 tag,这时就是一个线上随时可以发布的版本了。
hotfixs
当线上有紧急情况需要处理时,可以不走工作流,直接从 master 分支切出 hotfix 分支用于修复并验证,再提 merge request 到 master 分支发布。
hotfixs 分支也要 merge 到 develop 分支,确保修改被同步到之后的版本。
工作流
- 从 develop 分支上签出一个 feature 分支,添加功能,验证无误后,将签出的分支推送到远程仓库中,新建一个远程分支。
- 发起 merge request 到 develop 分支,并分配 Review 成员。
- 发现 Bug,提一个 issue,分配负责人。
- 从 develop 分支上签出一个 feature 分支,修改代码,验证无误后,将签出的分支推送到远程仓库中,新建一个远程分支,推送消息中带上 #issue 号,提到这个问题。
- 发起 merge request 到 develop 分支,并分配 Review 成员。
issue
建议无论是功能开发还是 bug 的修复,都先建 issue,得到 issue 号之后,再以 issue 号为开头命名分支,如 111-subject。
在 commit 时,信息以 #issue号 空格 + 内容的形式。这样可以使得 commitId 和 issue 关联起来。
常用命令
切换到 develop 分支:
git checkout develop
更新到需要发布的 commit id 处,或 revert 掉当前版本不需要发布的功能:
git pull origin develop
切出发布使用的临时分支,假设需要发布 2.7.5-RELEASE 版本
git checkout -b v2.7.5
合并临时分支,将修改了快照版本号的分支合并到 develop 分支:
git merge v2.7.5 --no-ff
推送到远端仓库:
git push origin develop
maven release插件替换版本号,
参数说明:
DupdateWorkingCopyVersions 是否子模块一起修改版本号,
DreleaseVersion 版本 2.7.5-RELEASE,
DdevelopmentVersion 下一个快照版本 2.7.6-SNAPSHOT(快照版直接最后一位加1就好,因为版本号是在发布时才最终确认),
DskipTests 跳过单元测试。
release:prepare 命名会生成2次commit,第一次是生成当前待发布的上线版本号,第二次是生成下次的快照版本号
命令:
mvn release:prepare -DupdateWorkingCopyVersions=true -DreleaseVersion=2.7.5 -DdevelopmentVersion=2.7.6-SNAPSHOT -Dtag=2.7.5-RELEASE -Darguments="-DskipTests"
签出release:prepare生成的标签中的源代码,并在此基础上执行mvn deploy命令打包并部署构件至仓库。
mvn release:perform -Darguments="-Dmaven.deploy.skip=true -DskipTests"
切回临时发布分支
git checkout v2.7.5
回滚到修改为正式版本的commit
git reset --hard HEAD^
合并回滚之后的临时发布分支
git merge v2.7.5 --no-ff
推送到远端仓库
git push origin master
版本号管理
develop 分支使用 SNAPSHOT 版本,master 分支使用 RELEASE 版本。
项目初始化:
- 初始化 commit.
- 切出 master分支,develop分支,以及开发分支,全设置为 1.0.0-SNAPSHOT 版本。
- develop 分支测试无误需要发布,切出分支名称为 v1.0.0 的待发布分支,将项目版本号修改为 1.0.0-RELEASE 版本。
- master 分支合并 v1.0.0 分支。
- 有代码改动时,v1.0.0 分支,将项目版本号从 1.0.0-RELEASE 修改为 1.0.1-SNAPSHOT 版本,每次有代码改动时,重复 1、2、3、4 步。
Maven版本管理插件
Maven 的 versions 插件同时修改父项目和子模块的版本号:
- 切换到 develop 分支并更新最新代码
git checkout develop git pull origin develop
. - 合并待发布的分支
git merge xxx --no-ff
. - 升级版本号
mvn versions:set -DnewVersion=1.0.1-SNAPSHOT
或mvn -N versions:update-child-modules 3.2
. - 回滚版本号
mvn versions:revert 3.3
提交mvn versions:commit
. - 将新功能分支合并到 master 分支
git checkout master git merge develop --no-ff
. - 推送
git push origin master
并构建发布。 - 更新为下一个版本号
git checkout develop
使用mvn versions
插件更新为下一个快照版本,可以直接在最小版本号加 1,并带上 -SNAPSHOT.
<properties>
<!-- 父项目定义属性 -->
<!-- 父项目和子模块统一使用 revision 指定的版本号 -->
<revision>1.0.2-SNAPSHOT</revision>
<!-- 父项目版本号和子模块版本号,还有子模块互相引用时都指定版本号为 -->
<version>${revision}</version>
<!-- 需要升级版本更新版本号只需要更新父项目 -->
<revision>1.0.2-SNAPSHOT</revision>
</properties>
文件名大小写检测
Git 中默认配置为忽略文件名大小写。
执行 git config core.ignorecase false
关闭。