Git在实际开发中创建分支与分支合并到master的经验

我们公司一直都使用Git作为我们的代码版本控制工具,我们总结的一些创建分支的经验:
  1. 开发新功能必须在master的基础上拉一个新的dev分支,分支的命名规则:[团队]-dev-[日期yymmdd格式]-[开发者英文名]-[分支的功能]。
  2. 修复bug必须在master的基础上拉一个新的bugfix分支,分支的命名规则:[团队]-bugfix-[日期yymmdd格式]-[开发者英文名]-[分支的功能]。
  3. 测试每天必须在master的基础上拉一个新的test分支,然后合并需要测试的各个分支,分支的命名规则:[团队]-test-[日期yymmdd格式]-[测试人员英文名]。
我们总结开发分支合并到master的经验:
  1. master必须由少数几个人控制,由团队的leader和重要的开发负责人操作。
  2. 上线合并之前,如果当前的master分支没有tag,需要在当前的master上打tag,为了让我们找到合并前的commit,万一有回滚可以用上这个分支Hash值。
  3. 合并的过程中如果遇到conflict的情况,必须要两个代码的负责人现场确认,合并完成之后必须要回归测试相关的功能。
  4. 如果遭遇需要回滚的情况,请按照《Git分支代码回滚流程》操作。
  5. 上线完成之后在当前的master上打上tag。
做到以上几点,团队在开发的时候就可以做到有条不紊。

php执行Linux命令的方法(具体案例)

最近本人在做一个系统用来管理团队的任务,其中涉及到我们的任务需要选择项目的git分支,我的方案是利用php去获取某个项目的远程仓库的分支:
exec(“cd /data/www/superb/Git/saint;git pull;git branch -r”, $output);
解释下:
cd /data/www/superb/Git/saint # 跳到从git项目拉下来的代码目录下
git pull  # 更新代码
git branch -r  # 获取当前代码目录下本地和远程所有的代码
一句话执行以上三句需要加上分号。
后来发现git pull无效的问题,即服务器的代码目录并没有自动更新,我获取的远程分支不是最新的。后来发现原来是没有权限,因为git pull这种的写操作无法执行,而git branch这样的读操作是可以执行的。
我的服务器是nginx+php-fpm,最终执行这个linux shell命令的用户是php-fpm的www,使用ps aux | grep php-fpm查看,而且我用php exec执行了whoami:
exec(“whoami”, $output);
也证明了用户是www,于是我将www用户添加到了服务器的sudo列表里:
vim /etc/sudoers
增加一行:
www             ALL=(ALL)       NOPASSWD:ALL
# www             ALL=(ALL)       ALL
下面一行注释掉的和第一行的区别是第一行的配置当www用户在执行sudo操作的时候不需要密码,第二行的配置是所有的sudo操作都要输入www用户的密码。
我把php的代码改成了:
exec(“cd /data/www/superb/Git/saint;sudo git pull;git branch -r”, $output); // git pull用sudo来执行
结果发现依然没有效果,最后我只好用下下策,将/data/www/superb/Git/saint目录和子目录文件的用户和组改为了www:
chown -R www:www  /data/www/superb/Git/saint/
最终php的命令改为:
exec(“cd /data/www/superb/Git/saint;git pull;git branch -r”, $output); // 把sudo去掉
这样就可以执行了,最终实现了我的目标。

Git分支代码回滚流程

在大型系统开发中难免会遇到一些分支的错误合并导致代码需要回滚到合并前的样子,以下是操作流程:
  1. 将代码的指针指向你所要回滚到的那个版本的分支:

    git reset --hard [分支的Hash值]
  2. 将本地的当前代码的指针push到指定的远程分支:

    git push origin [远程分支的名字] --force
  3. 如果在其他客户端或者服务器上有pull过错误的代码的,每个客户端或者服务器都需要执行

    git reset --hard [分支的Hash值]

    否则你之前做的回滚操作这些客户端和服务器无法生效

git切换分支保存修改的代码的方法

最近在一个原有的项目上做一次非常大的改版,底层的数据库做了很大的变化,跟现在的版本无法兼容。现在的工作除了开发最新的版本之外还要对原来的版本做例行的维护,修修补补。于是有了在两个分支之间游走切换的问题,最新改版的代码在分支new上,旧版本的代码在分支old上,我在new上开发了一半,忽然有人给了我一个改进的需求,于是我要切换回old去修改代码。在这个场景下,我摸索了三种方法:

及时commit代码

在new分支上把已经开发完成的部分代码commit掉,不push,然后切换到old分支修改代码,做完了commit,所有分支互不影响,这是一个理想的方法。

 

使用git stash

有时候写了一半的JAVA代码,都还不能编译通过的,就被叫去改另一个分支的bug了。

在new分支上的时候在命令行输入:

git stash

或者

git stash save “修改的信息"

这样以后你的代码就回到自己上一个commit了,直接git stash的话git stash的栈会直接给你一个hash值作为版本的说明,如果用git stash save “修改的信息”,git stash的栈会把你填写的“修改的信息”作为版本的说明。

接下来你回到old分支修改代码完成,你又再回到new分支,输入:

git stash pop

或者

git stash list
git stash apply stash@{0}

就可以回到保存的版本了。git stash pop的作用是将git stash栈中最后一个版本取出来,git stash apply stash@{0}的作用是可以指定栈中的一个版本,通过git stash list可以看到所有的版本信息:

stash@{0}: On order-master-bugfix: 22222
stash@{1}: On order-master-bugfix: 22222

然后你可以选择一个你需要的版本执行:

git stash apply stash@{0}

这时候你搁置的代码就回来了。

 

用IDE工具的shelve的功能

有一些IDE工具提供了shelve的功能,shelve的意思是“将…搁在一边”,即把还没写完的代码先搁在一边。我开发都是使用jetbrains公司的IDEA和PhpStorm,它们就提供了shelve的功能,方法:

首先在IDE的底部找到“Changes”,点开会有local的选项卡,选中你要搁置的代码,点击右键,选择“Shelve Changes”,在提交的输入框中输入你的注释,以便回来的时候识别你需要的版本,点击“Shelve Changes”键即可。这时选项卡上会多一个“Shelf”的选项卡,里面就有你搁置的代码。

这时候你可以去old分支修改代码,改完了之后回到new分支,到“Shelf”选项卡下选择你要恢复的代码或者版本,点击右键选择“Unshelve Changes”,你的搁置的代码就回来了。