☺
原理
分支
安卓端,ios端,web端各为一名开发工程师,是各自项目的负责人。要保证代码不丢失,代码可回滚,可维护,提交信息清晰,功能分支可回溯。
web端有后端和前端开发共同负责,几个项目都是多人协同开发,下面的规范主要就是web端开发需要遵循的。
分支类型
master分支
feature分支
hotfix分支
develop分支
release分支(预发布,暂时不用)
最新的稳定上线分支【master分支】
master分支同时是开发服务器和测试服务器本地的当前分支。生产上的版本切换也是在master进行的。
开发新功能【feature分支】
在master分支上进行切feature分支,开发完之后合并进master分支(注意保存master上一版本的标签),部署在测试服务器上进行测试,此时测试服务器的版本是领先于生产服务器的,
出现bug或者改文案【hotfix分支】
在master分支上切出来一个hotfix分支来改bug,然后生产服务器本地当前分支回滚一个版本。
静静的等待bug改好了进行单元测试,有时间的条件下还要回归测试下。然后master合并这个hotfix分支。
以功能为最小粒度的分支【开发分支】
从此,在develop branch上进行切feature branch进行功能模块的开发,合并代码,测试,测试成功后切出稳定预发布版本release branch。
省略的最新未上线稳定版本分支【预发分支】
因为我们几乎没有新功能做好了,不上线需要等待的时候,所以这个分支暂且不用了,以保证开发和版本控制的时效。
实际意义:当我们在develop branch测试通过功能之后,切出一个预发布分支,这个分支是稳定的,可以保障生产安全的一个分支。当线上升级版本是,master branch merge它。
使用指南
部署项目环节
git clone项目后,根据忽略文件的描述补全配置
cat .gitignore
部署php7+fpm+nginx,即可启动项目, 推荐ezhttp工具。
开发功能环节
在开发某个功能的过程中,流程如下:
先从master切出一个新功能命名的新分支,开发这个分支的几个人共同去维护这个新分支对应的远程仓库。期间可以合并master代码,但不要合并其他分支的代码。
git branch
# 确定在master分支下,不是就切过去
git checkout -b gong_neng_1
# 一顿开发之后,提交,推送对应远程仓库,第一次推送将创建新的远程分支
git add .
git commit -m 'xxxxxxx'
git pull origin gong_neng_1
git push origin gong_neng_1:gong_neng_1
每个地方可能因为暂存区未提交,网络 等原因产生error,肯定是会造成未成功执行的,要注意看命令行的返回信息,不急于进行下一步。
处理冲突环节
提交了本地代码之后,需要先拉取远程对应分支代码的代码,才能提交,此时容易产生冲突。文件路径为绿色字样为正常更新文件,红色字样即为冲突。
git diff
# 需要处理的时候到了
git add .
git commit -m '处理xx冲突'
git push
pull或者fetch操作发生代码冲突,找冲突代码部分的编写者来一起处理代码的删除或保留,由于这种情况的代码删除后恢复极为困难,所以冲突代码的合并要谨慎,其二,要保证处理完项目中所有的冲突,才可以提交。
推测试环节
什么时候把功能分支推送到测试环境
开发完成单个功能分支,完成自测之后
具体流程如下
功能分支名字叫 gong_neng_1,先拉取合并master的代码,毕竟你可能很久不拉master的东西了,拉取之后,才能保证你的功能分支版本领先于master分支。
git pull origin master
git push origin gong_neng_1 : gong_neng_1
不需要管测试环境的当前分支是什么,直接拉取代码,命令如下
git pull origin gong_neng_1
这样就可以开始测试啦。
版本稳定环节(权限)
功能分支经过测试之后,确认没有bug的功能分支代码合并到本地的master分支。(此处简化了一些流程,以保证上线流程的时效)
上线环节(权限)
首先切出来一个当日日期版本号的分支,然后在这个新分支上 拉取,合并 准备上线的版本。即使测试,如果有问题可按照branch回滚。
有问题的情况下,新切的分支删掉,等补完bug后,再切新分支,去拉取新代码。
问题和解决方案
如果某远程分支推不上去,怎么办?
可以先推到远程仓库的其他一个分支,让master来合并。
git push origin question:ques
删除远程分支命令:
git push origin --delete question
从此ques取代question分支,作为开发题库模块的功能分支。
工作重要善用切分支进行操作。以保护master不会受到污染,保证在网络不稳定或其他情况下处理版本产生的问题。
怎么在项目开始/项目中正确的添加忽略文件或目录?
当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用
git rm file_path
git commit -m 'delete somefile'
git push
当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用
git rm --cached file_path
git commit -m 'delete remote somefile'
git push
往往你需要的是最后这个—->
忽略一个已经被跟踪的文件/目录(再也不管它了):
echo dir/ >> .gitignore
git add .gitignore
git commit -am 'ignore dir ok'
git rm -r --cached dir
git commit -am 'ignore dir forever'
怎么给git命令创建快捷方式?
第一种方法:
通过配置git本身,
git config --global alias.s status
从此,git s就是git status
第二种方法:
vim ~/.gitconfig
第三种方法;
vi ~/zssrc
vi /etc/profiles
配置系统的别名
规范&禁用
在微信开发或者必要的bug查错等等在服务器上改代码之后,绝对不能提交测试/生产服务器的代码,要把改动的代码拿回本地,在本地提交,推送远程仓库。
撤销服务器上的修改,一条命令还原
git checkout -- .
#还原所有
git checkout path/filename
#还原单个文件
原则上只能对测试的服务器的代码进行修改,不能直接修改生产服务器代码。
禁用git push -f 强制覆盖远程
少用git reset –hard进行回滚
首先,我们尽量依赖branch或者tag去回归之前的版本,而不是commitid。
如果确实需要版本回滚,建议首先切出一个与现分支(master或功能分支)的测试分支出来,对这个分支进行reset或者各种操作,如果成功就merge回原分支,如果操作后得到的效果和计划的不一样,销毁这一测试分支即可。
根据commitid创建分支,可以用这个命令来还原代码。
git checkout -b 新分支名称 commitId
从标签创建分支
git checkout -b newbranch v1.0
每次板本升级通过切分支来完成不同版本代码的记录
当线上出现问题时git checkout回上一个分支来完成代码回滚,不会影响新版本,同时清晰保留了每个版本的版本号和代码。
git checkout -b v1.2
git pull
#从v1.1版本切出来1.2分支,然后合并v1.2版本的功能代码
保存功能分支的代码
在完成每天的开发任务后,项目组内下班时间前一小时进行代码合并,然后推送代码到远程仓库。
参考
因团队精简,不需要过多的分支维护版本的清晰和可维护。但是可以参考正规的workflow,学习学习。