git管理代码仓库遇到的一些问题
多人多项目同根目录的问题
root
--project1
--project2
...
当然这种情况其实不应该出现的,但是由于历史原因,多个项目有公用的一些东西,每个项目都很庞大,导致拆分比较费劲,短期无法做。代码发布流程是内网->dev->master
,各个项目每周有例行发布时间,但是由于测试进度不一致导致的代码被别的项目带出,那么应该如何平衡多个项目的发布问题?
解决方案1
这里有个前提:每次开发新需求都是从master上拉取自己的开发分支。这样我们在测试内网是没问题,然后在往dev合并的时候要注意,只需要把你的代码merge到dev分支,而不要同步dev到你的开发分支,当然在测试期间要保持你的开发分支纯净(不要修改代码,修改代码另外开一个新分支,毕竟git中建立分支是很方便的)。在dev测试通过之后,就可以把你的开发分支合并到master,此时master就只有你修改过的代码。大体流程如下:
解决方案2
保证合并到dev的代码是马上会发的(比如今晚或者两天内),那么所有的项目都测试完成再统一进行提交到master。或者说排队发布,只要有一个没发出去,那么别的项目就不可以发到dev。
代码拆分
基于以上的项目,我们可以拆分出某个独立的项目,一般来说这些独立的项目没有依赖公共文件,项目所在文件夹也是独立的,因此我们就可以直接拆分出来,并且要把他的git记录单独提取出来。
创建新分支
git check -b new branch
剥离对应文件夹
git filter-branch -f --prune-empty --subdirectory-filter Dir
这样根目录下就只会存在你自己的项目,而且该项目的git记录也都存在而且不包含别人的提交记录。
关于代码回滚
我们在开发中可能会不小心提交了不该提交代码,而此时又合并到了dev ,大家想到的可能就是代码回滚,但是要注意几个问题:
1.回滚记录中有没有别人提交的代码
2.回滚有可能遇到合并记录的时候,会回滚失败
3.回滚要不要把之前的commit清除掉
。。。
这里着重考虑1,2点问题,如果没有遇到合并记录,那么我们可以单独拉取一个分支,回滚,然后通过cherry-pick拉取别人提交记录,然后再覆盖原来的分支,但是如果别人有很多提交记录的时候,工作量就太大了。所以其实最好就是diff现有代码和线上分支代码,把不该提交的干掉,再重新提交一个commit,这样不用关注别人的提交,也保证每次提交记录的保存。当然回滚的时候可以选择使用revert,这样也会保持提交记录,但是依然会把别人的提交覆盖掉。