参考链接
http://www.ruanyifeng.com/blog/2012/07/git.html
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md#25-pull-requests
https://github.com/xirong/my-git
https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424
规范
分支的命名限定在以下范围(master | dev | develop | release | feature/xxx | hotfix/xxx | fix/xxx ) xxx为任意内容
Eg. 1.feature/酒店信息管理 2.hotfix/订单流程更改
每次commit时,添加的描述信息需要有一个特定的前缀,限定在以下范围(feat|doc|test|docs|chore|refactor|fix|style| perf): xxx 注意冒号后面有一个空格
Eg. 1.feat: 查看酒店信息功能完成 2.fix: 浏览酒店bug修复
例子
做个例子来模拟一下这样的一个开发场景
- master:主分支
- release:预发布分支
- dev:开发分支
- feature/xxx:开发某个功能
- fix/xxx:修复功能
模拟
建了三个文件夹,模拟三个成员【person1、person2、person3】进行开发
用了三个不同的终端进行控制
首先,三个人都给他clone下来
写完才发现person3没用到,就当他不存在吧
person1一开始就给他建好了master和release分支,然后push到远端
git checkout -b release
git add .
git commit -m 'feat: xxx'
git push --set-upstream origin release
git checkout -b dev
git add .
git commit -m 'feat: xxx'
git push --set-upstream origin dev
这个时候person2和person3还没有这两个branch,最好pull一下
此时git仓库的状态时这样的
有三个分支,但是分支里面啥也没有
每个人进行工作
举个例子
person1拉了一个分支为feature/a
做了以下工作:
- 创建一个a.txt
- 在readme.md中添加【person1到此一游】
person2拉了一个分支为feature/b
做了以下工作
- 创建一个b.txt
- 在readme.md中添加【person2到此一游】
person1先合并
person1在feature/a上commit了两次,然后拉取dev分支进行merge
很显然,这时候他是第一个做这个工程的人,什么都没变,直接就push上去了
git checkout -b feature/a
git add .
git commit -m 'feat: xxx'
git add .
git commit -m 'feat: xxx'
git fetch origin dev
git checkout dev
此时指向的是dev分支,进行merge
git merge feature/a --no-ff
注意!!!:
merge合并的时候最好使用--no-ff指令!
git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。
git merge 则不会显示 feature,只保留单条分支记录。
person2准备合并
这个时候b的工作也做完了,准备合并到dev分支
但是这时候出了一些问题
直接push的话显示是不行的,因为person2的dev滞后与origin dev
于是我们尝试先fetch一下origin dev
git fetch origin dev
git checkout dev
新的问题出现了
当person2 checkout到dev分支上的时候,会提示版本滞后
这个时候还挺奇怪的,因为明明把远端仓库的dev分支fetch下来了,为什么还会behind?
因为fetch下来以后发现比本地的dev还要新,但是git不会自动帮你合并
这时候有两个选择
- git pull
- git fetch + git merge
推荐使用git fetch+git merge
Git中从远程的分支获取最新的版本到本地有这样2个命令:
- git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master git merge origin/master
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
推荐
git fetch origin dev:temp git diff tmp git checkout dev git merge temp git add . git commit -m"xxx" git push origin dev
从远程获取最新的版本到本地的temp分支上
之后再进行比较合并
最后可以把temp分支删掉
- git pull
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并。
此外,使用pull还会产生一个问题,git会自动帮你commit一次,放在系统里好像会引起不规范
merge时候会提示冲突的地方,手动修改完提交就可以了
这时候的状态大概是这样的
release分支和master分支
和上面类似 dev分支开发到一定时期放到预发布分支release上
之后可以发布到master分支上
更清晰一点看就是这这样子
tag
可以先git checkout
到某一个节点,然后用git tag
打上版本号