版本管理:Git Flow及Commit Message 规范

一、Git Flow工作流

在这里插入图片描述## 1) 常用分支

1. Production 分支

用于官方正式发布的分支:master分支,最近发布到生产环境的代码。
最近发布的Release,在Master分支上的Commit应该打上Tag。
只能从其他分支合并,不能在这个分支直接修改

2. Develop 分支

用于功能开发的主分支:dev
主开发分支:包含所有要发布到下一个Release的代码。
主要合并其他分支,如:Feature分支。

3. Feature 分支

用来开发一个新的功能,一旦开发完成,合并回Develop分支,进入下一个Release。
一般会删点这个Feature分支(也可用个人ID命名,然后始终用于个人开发)。

4. Release分支

要发布一个新Release 时,基于Develop分支创建一个Release分支。
完成Release后,测试,修改Bug,合并到Master和Develop分支。

5. Hotfix分支

在Production发现新的Bug时,需创建一个Hotfix。
完成Hotfix后,合并回Master和Develop分支。
Hotfix的改动会进入下一个Release

2) 常用操作

1、 初始化本地仓库

一般本地未建立仓库时需操作,一般只需操作一次。
**方式一:**本地建立仓库,与远端仓库建立链接。

git init
git branch master
git remote add origin <url>/repo.git

**方式二:**从远端服务器拉取仓库

git clone ssh://user@host/path/to/repo.git

2、 创建develop分支

**情况一:**远端没有develop分支,在本地创建一个空的develop分支,然后推送到远端服务器。

git branch develop                      # 创建分支
git push -u origin develop

P.S.:git branch -v 查看各分支最后一次提交
git branch --merged、–no-merged 过滤列表中已经/尚未合并的分支

**情况二:**远端已经有develop分支了,克隆仓库,为develop创建一个追踪分支。

git checkout -b develop origin/develop

3、 功能开发(创建feature分支)

拉取最新代码:开发主干develop、dev

P.S.:git pull = git fetch + git merge

git checkout develop                    # 切换分支
git pull

新建feature:一个自己的开发分支,进行功能开发。

P.S.:在创建分支时,父分支不能选择master,而要选择develop。

git checkout -b myFeature develop        # -b:切换前新建分支

代码提交、推送分支(commit,push)

提交:git commit,推送:git push

git status
git add <files>                # 添加当前目录文件:git add .
git commit -m 'feat(controller): add login function'
git push                       # 强制推送:git push --force
git push origin --delete myFeature     # 删除远程myFeature分支

# 推送到异名分支:
git push origin HEAD:master
# 推送到同名分支
git push origin HEAD

4、 同步最新代码

develop分支将包含项目的所有历史,而master会是一个缩减版本

**方式一:**从远端拉取最新代码,并合并到本地develop分支上。

git pull origin develop     # 确保了本地的develop分支拥有最新的代码

**方式二:**变基方式合并更新

将本地master、develop 更新为最新

git fetch origin
git checkout master
git rebase origin/master     # 将master最新的分支同步到本地
git checkout develop
git rebase origin/develop    # 将develop最新的分支同步到本地

5、 合并分支

先切到develop,将myFeature分支代码合并到本地的develop,最后推送到远端。

git checkout develop 
git merge feature           # 合并 feature分支代码 到当前分支上
git push                    # 推送到远端服务器的关联分支
# git push origin develop     # 指定推送的远端分支

merge 加参数写法:git merge --no-ff feature
–no-ff:不使用快进(fast-forward)方式合并,保留分支的commit历史
–squash:使用squash方式合并,把多次分支commit历史压缩为一次

P.S.:新开发的功能代码,不能直接合并入master。
合并完,切回/删除 原功能分支:git checkout myFeature,以备下次开发。

6、 合并提交记录

如果你在本地频繁重复提交某个修改,强烈建议:合并提交信息后,再推送到远端。

方式一:变基(git rebase)
将当前分支切为主分支合并(过程复杂,谨慎使用)

git rebase -i HEAD~2      # 将2次提交合并为一个
# git rebase --continue     # git rebase --skip
git rebase master
git checkout develop
git merge myFeature 
git push
git rebase -i HEAD~2 将本地的2次提交合并为一个,简化提交历史

本地有多个提交时,如果不进行这一步,在git rebase master时会多次解决冲突(最坏情况下,每一个提交都会相应解决一个冲突)

方式二:重置(git reset)

当前分支的内容回到了没提交前

git reset HEAD~2
# 解决冲突后,重新添加文件,提交
git add .              # git add --all
git commit -m 'fix:fix a bug and closes #001'
git push --force
git commit --fixup  
git rebase -i --autosquash 

7、 关于变基(rebase)

使用 rebase 命令,将提交到某一分支上的所有修改,都移至另一分支上。

使用前提:不要通过 rebase 对任何已经提交到公共仓库中的commit进行修改。

准则:若提交存在于你的仓库之外,而别人可能基于这些提交进行开发,则不要执行变基。

语法:git rebase [ ]

git rebase master server

将主题分支(server)变基到目标分支(master)上,为当前分支时可省略

l 合并分支

例:合并分支前情况:自feature创建后,master和 feature 都有了新的提交。
在这里插入图片描述

此时,feature 想同步上游(master)的修改时,有2种方案:merge、rebase

使用 merge 方案

git checkout master
git merge feature
git push origin master

合并分支后情况:
在这里插入图片描述

使用 rebase方案

git checkout feature
git rebase master    # 当前分支feature、变基的目标基底分支master

相当于:将当前HEAD先切到master 上,将分支的提交附加到master分支最新提交后。

合并分支后情况:
在这里插入图片描述
**结果说明:**原有提交(d、e、f)会被移除,并且 feature 分支被重置到 master 分支,feature 分支上的提交被重新应用到 master。重新应用的提交通常是原始的副本,它们的 SHA-1 值和原来的提交不一样。

l 合并提交信息

语法:git rebase -i [startpoint] [endpoint]

git rebase -i origin/master

-i:–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

执行 git rebase -i 后,会进入一个交互式界面:

pick 9ec8e78 add app.js

选择以下命令(决定怎样处理commit),保存&退出,将自动进行git rebase下一步操作。

p, pick = 保留该commit
r, reword = 保留该commit, 并修改commit message
e, edit = 保留该commit, rebase 会停下来等待你修改该commit
s, squash = 保留该commit, 会合并到(meld into)前一个commit中
f, fixup = 同"squash", 但是会丢弃当前commit message(注释信息)
x, exec = 执行shell命令
d, drop = 丢弃该commit

:把以下分支的B、C、D三个提交记录合并为一个完整的提交,再push到公共仓库。
在这里插入图片描述

git rebase -i HEAD~3 
git push

这样,远端分支上看到的提交信息就只有B’这一条

8、 关于发版(Release)

创建release分支

从开发完、合并好的develop分支上,生成release分支。发版测试。

git checkout -b release-0.1.0 develop

增加release.txt文件

添加简要描述功能点,提交。

release.txt内容如下:

Version:0.1.0
Features:
1.功能一xxx
2.功能二xxx

同步到master和develop

全部准备完,就把发版分支(release-0.1.0)合并入master和develop分支:

git checkout master
git merge release-0.1.0
git push
git checkout develop
git merge release-0.1.0
git push
git branch -d release-0.1.0 # 删除分支

release(发布)分支:是功能开发(develop)与官方发布(master)之间的一个缓冲。

打标签:标记版本

任何合并到master的操作后,都要立即打上对应的标签

git tag -a 0.1.0 -m "Initial public release" master
git push --tags

9、 热修复(Hotfix):修改主干bug

主干发布后,发现主干bug。需要基于master创建了一个用于维护的分支,如:issue-#001分支,或hotfix-001。

git checkout -b issue-#001 master    # 修复bug
git checkout master                 # 更新到master分支上
git merge issue-#001
git push
git checkout develop                # 同步到develop分支上
git merge issue-#001
git push
git branch -d issue-#001            # 删除分支 issue-#001

操作过程基本同功能开发流程。

3)小结:日常开发功能-主要流程

新建临时分支->缓存文件->提交->推送记录->合并分支->删除临时分支
P.S.:合并前提交功能,避免分支间冲突而导致代码丢失。

git checkout feature                # 切到功能分支,开发功能
git add .                           # 缓存新增内容
git commit -m 'feat:add xxx'        # 提交修改&新增
git checkout develop                # 将当前切到 develop分支
git pull origin develop             # 拉取远端develop分支最新代码
git merge --no-ff feature           # 合并feature到当前分支(dev)
git push origin develop             # 推送到远端
git branch -d feature               # 本地删除'该功能开发'的分支
git push origin --delete feature    # 删除远程feature分支

二、FAQ

1)推送(git push)故障:

fatal: The upstream branch of your current branch does not match
the name of your current branch.
【问题原因:】

问题的原因是在分支创建时,使用了与远程不一致的分支名。

例如远程分支是 origin/master

而在分支创建时使用了 git checkout -b master origin/master

因此本地分支名是 master origin/master

所以导致 git push 时报错 fatal: The upstream branch of your current branch does not match the name of your current branch

【解决方法:】

 # 根据提示操作,下次依旧报错:
 # 推送到异名分支:
 git push origin HEAD:master
 # 推送到同名分支
 git push origin HEAD

 # 方法一:重命名本地分支,与远程保持一致(推荐)
 git branch -m feature/develop

 # 方法二:修改git push默认规则
 git config push.default upstream

2)拉取(git merge/pull)故障:

fatal: refusing to merge unrelated histories。[hint:You have divergent branches and need to specify how to reconcile them.]
【原因:】

本地创建了仓库,gitee创建仓库并生成了README.md等文件。创建了新分支master,本地初始化创建了分支main。形成了分叉,而且没有历史相关分支,所以,两个分支毫不相干。
执行仓库关联后,两边都有提交。有版本冲突:超前一个提交&落后一个提交。所以,git pull, git push 均报错。
可以看到錯誤中提示(tips) :“You have divergent branches and need to specify how to reconcile them.
(您有不同的分支,需要指定如何协调它们。)”

【解决:】

git merge 后面加上 --allow-unrelated-histories.

如果是 git pull 或者 git push 报 fatal: refusing to merge unrelated histories,同理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值