记一次git翻车事件

Posted 西西夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次git翻车事件相关的知识,希望对你有一定的参考价值。

昨天dmp上线了

本来整个流程是

1.在本地1.4分支开发,开发完成push到origin/1.4,在远程仓库把1.4 merge到master分支

2.本地online分支先pull一下远程online分支,再pull master分支

3.本地执行 gulp build:dev命令 构建线上代码  生成build、views/build以及public/build三个文件夹

4.online分支push到origin/online 测试发布上线 上线的是远程online分支

但是我昨天不知道具体进行了什么操作 到现在我都没想通 好像是我当时在online分支 修了个问题 没注意是online分支 就在本地gulp了一下 用的命令不是gulp build:dev 

 

对照gulpfile.js的命令 会把views/build以及public/build两个文件夹清除(注意,此时没有清除build文件夹),接着因为build:localhost命令没有复制静态文件那些命令,所以不会生成views/build以及public/build这两个文件夹

到这也没什么问题 我下一次执行 gulp build:dev 会重新生成这三个build文件夹的

gulpfile.js的构建命名(部分:

gulp.task(‘build:localhost‘, function() {
	env = ‘localhost‘;
	return runSequence(
		‘clean:init‘,	// 初始化清除文件
		‘less:lo‘,		// 编译less
		‘clean:end‘,	// 结束清除文件
		‘nodemon‘		// 代码部署
	)();
});

gulp.task(‘build:dev‘, function() {
	env = ‘development‘;
	return runSequence(
		‘clean:init‘,	        // 初始化清除文件
		‘concat‘,		// 合并js
		‘js‘,			// 复制压缩业务js
		‘otherjs‘,		// 复制其他js
		‘images‘,		// 复制图片
		‘fonts‘,		// 复制字体
		‘font‘,		        // 复制字体
		‘file‘,			// 复制文件
		‘txtCopy‘,		// 复制txt模板
		‘vendor‘,		// 自动化测试脚本
		‘QA‘,		        // 自动化测试脚本
		‘less:dev‘,		// 编译less
		‘util‘,			// 复制js插件
		‘valid‘,		// 
		‘utilJs‘,		// 插件js压缩
		‘utilCss‘,		// 插件css压缩
		‘htmlmin‘,		// 模板压缩
		‘clean:end‘		// 结束清除文件
		// ,‘nodemon‘		// 代码部署
	)();
});

gulp.task(‘clean:init‘, function () {
	return gulp.src([‘views/build‘, ‘public/build‘, ‘public/css‘, ‘public/dist‘, ‘rev-manifest.json‘, ‘public/**/*.map‘, ‘upload/*‘], {read: false}).pipe(clean());
});

gulp.task(‘clean:end‘, function () {
	return gulp.src([‘public/dist‘, ‘rev-manifest.json‘], {read: false}).pipe(clean());
}); 

后边切到master分支 然后修了两个小问题 push到远程master也没出错 然后准备到online分支合代码

但是切online分支时提示我本地有未提交的修改 提示的内容是online分支的.gitignore文件 和  build文件夹

online分支的.gitignore如下:

node_modules
public/css
demo
npm-debug.log

master分支的.gitignore:

node_modules
public/css
demo
upload
views/build
public/build
npm-debug.log
build

就是除了online分支的其他分支是不对build文件夹进行版本管理的 ,仓库里不会跟踪它的变化

我明白了 我当时应该是把master分支当成online了,pull了远程online代码到本地master了。。。--_--(什么骚操作)

这样master不仅多了个build文件夹 还对build进行了跟踪

所以切分支时会提醒我有未提交的更改 然后我push到远程master也有了这些文件夹

按理说这个时候我再切到online分支应该是没问题的 但是又报错:

git -c diff.mnemonicprefix=false -c core.quotepath=false checkout online err 

这个问题是我本地仓库配置出了问题,重新拉一个仓库就没有这个问题

用BeyondCompare对比了一下两个仓库的代码 之前那个仓库的代码有点问题 替换掉就好了

这时候再切回online分支 合代码  上线 就结束了


今天早上我想了一下 还是得把master分支的build文件夹删了 把它的.gitignore文件重置成之前那样 master分支不跟踪三个build文件夹 

解决办法是:

1.在本地删除master分支的build文件夹  修改.gitignore 加上 build、views/build、public/build这三行

2.提交修改 git commit -m ‘update‘

3.git push 更新远程代码

4.本地切到online分支,拉一下master代码,这时online的.gitignore文件会被更新 但是我们不需要这个文件被更新(online需要跟踪三个build文件夹)  ,

 不过需要保证它的更改时间是最新的(这样拉取master代码的时候这个文件不会被更改),所以把online的这个文件改回去 

5.commit并push到远程online

这样虽然online上的.gitignore为最新的,但是每次上线前只会拉最新的master代码到online上,不会把online分支往master上合,于是online的.gitignore的内容不会同步到master上,

保证了master和online的.gitignore不一致,master不会跟踪build文件夹 而online继续跟踪build文件夹

大功告成![email protected][email protected]

 

以上是关于记一次git翻车事件的主要内容,如果未能解决你的问题,请参考以下文章

记一次删除Git记录中的大文件的过程

记一次go module的坑

git 填坑记录----记一次git低版本引发的问题

记一次git排故过程

记一次Git初始化项目

记一次gitlab迁移后,ssh连接不上git