摘要: 源代码系列:underscore的封装和扩展http://www.cnblogs.com/samwu/p/5619029.html underscore.js 1.8.3的isEqual函数http://www.cnblogs.com/samwu/p/4586217.html jQuery的封装和扩 阅读全文
posted @ 2015-06-03 14:44 草珊瑚 阅读(438) 评论(0) 推荐(0) 编辑

github flow场景

第一步:根据需求,从master拉出新分支,不区分功能分支或补丁分支。

第二步:新分支开发完成后,或者需要讨论的时候,就向master发起一个pull request(简称PR)。

第三步:Pull Request既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码。对话过程中,你还可以不断提交代码。

第四步:你的Pull Request被接受,合并进master,重新部署后,原来你拉出来的那个分支就被删除。(先部署再合并也可。)

这个场景满足绝大多数的中小项目开发需求。

多主干场景

场景描述如下:

  1. 当前仓库是个通用组件,需要同时维护多个版本,如 1.x,2.x。
  2. 仓库代码针对多个场景的输出,对应的源码有差别,但需要同时维护。
  3. 仓库代码发布线上后,发布线上的代码不想立刻合并到 master,待确认线上稳定后再合并。

多主干项目v1版
a人开发分支为daily/1.0.0。
然后从daily/1.0.0切出功能分支feature/describe,开发测试完毕后合并到daily/1.0.0,并删除feature/describe分支。
发布分支从publish/1.0.0开始递增。
publish分支发布后,会合并到开发分支daily/1.0.0,但不会把代码合到master。
b人开发分支也为daily/1.0.0,发布前需合并一下publish/1.x.x的最新版本。

多主干项目v2版
a人开发分支为daily/2.0.0.
然后从daily/2.0.0切出功能分支feature/describe,开发测试完毕后合并到daily/1.0.0,并删除feature/describe分支。
发布分支从publish/2.0.0开始递增。
publish分支发布后,会合并到开发分支daily/2.0.0,但不会把代码合到master。
b人开发分支也为daily/2.0.0,发布前需合并一下publish/2.x.x的最新版本。

注意

以上功能只是一个思路,非git自带,需要自定义开发。

这种多主干场景也可以用fork仓库方式解决。
也就是Github fork其他项目的分支与主干保持同步

Github fork其他项目的分支与主干保持同步

Fork一个Repo

Fork是一个复制的操作,当你Fork一个项目之后,你就有了在原项目的基础之上进行修改和扩展的权限。

通常情况下,Fork操作用于参与别人的项目(成为项目中的一员),或者以别人的项目为基础来开发自己的项目。

当你使用一个开源项目的时候,如果项目中存在bug,除了可以将bug报告项目开发人员。你也可以通过Fork原项目,并参与进来。

  • 首先,Fork原项目,并将项目代码更新到你的本地;
  • 其次,修复项目中的bug,并确认问题已修复;
  • 最后,如果一切测试都没有问题,你就可以提交一个pull request给项目所有人,如果项目所有者认可你的代码,他就会将你的修改更新到原项目中;
    在Github中,Fork一个开源项目主要有两步:

查找到你想要Fork的项目;
点击项目介绍页面右上角的Fork;

保持同步

当你Fork一个项目之后,你的项目与原项目之间就不存在联系了,当原项目有更新的时候,你自己Fork的项目也不会同步保持更新。为了保持与原项目的一致,你需要使用到Git的命令行。

第一步 安装git客户端

如果你没有安装git的客户端,你需要先去下载git的客户端并安装,windows系统git下载安装地址:http://git-scm.com/download/

第二步 clone你fork的项目

fork一个项目使用git命令行clone项目:git clone git@github:[yourname]/Spoon-knife

第三步 添加新的远程仓库地址

当你clone完一个项目,可以使用git remote -v来查看你fork的远程仓库的地址;默认的clone操作完成后,远端仓库的地址别名为:origin,为了需要与原项目保持更新,你还需要将原项目地址给添加进来,使用命令:git remote add upstream git@github.com:octocat/Spoon-Knife.git可以添加远端仓库地址,其中upstream为新的远端仓库的别名。

第四步 同步更新

假设你已经完成了前三步,当原项目有更新的时候,怎么将更新检入到本地呐,主要是以下几个步骤:

打开git命令行工具;
进入项目本地路径;
执行git fetch upstream命令,检出upstream分支以及各自的更新。
切换到你的本地分支主干:git checkout master
合并upsteram/master分支和master分支,将原项目中的更改更新到本地分支,这样就能使你的本地的fork分支与原项目保持同步,命令为git merge upstream/master
或者使用命令git cherry-pick挑几个commit来合并。
执行git push将本地分支的修改推送到远端fork的项目。

参考:https://www.cnblogs.com/kakag/p/4287536.html

子模块场景

当前git项目依赖另一个git项目。
你想将两个项目单独处理但是又需要在其中一个中使用另外一个。

子模块变更

在子模块中的git操作就和独立的git项目操作一样。
进入到子模块目录,提交变更。

$ git add .
$ git commit -m "commit"
$ git push origin HEAD:master

提交完子模块的变更,还要回到父模块的目录,提交下子模块的变动。

cd ..
git status
git commit -m 'update submodule'
git push origin

子模块更新

在父模块的目录下更新子模块

git submodule update --recursive

在子模块的目录下,就是正常git操作

git pull

clone包含子模块的父模块仓库

方法1,直接递归clone

git clone git@github.com:jjz/pod-project.git --recursive

方法2,只clone了父模块,要追加clone子模块

git clone git@github.com:jjz/pod-project.git
cd pod-project
git submodule init
git submodule update

添加子模块

已有的项目中添加子模块步骤

git submodule add git@github.com:xxx/xxx-library.git xxx-library
git add .gitmodules xxx-ibrary
git commit -m "xxx-library submodule"
git submodule init
git submoudle update

删除子模块

cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules
vim .git/config
# 删除submodule相关的内容
# 比如
# [submodule "*"]
# url = git@github.com:jjz/**.git
git commit -a -m 'remove submodule'

参考

https://git-scm.com/book/zh/v1/Git-工具-子模块
https://www.jianshu.com/p/9000cd49822c
https://www.jianshu.com/p/b49741cb1347

回滚场景

常见回滚场景

  1. 丢弃工作区的修改(没有git add过),用命令git checkout -- file
  2. 丢弃暂存区的修改(已git add过,没有commit过),用命令git reset HEAD <file>
  3. 丢弃本地仓库的当前提交(已commit过,但没有推到远程仓库),命令git reset --hard commit_id
  4. 丢弃本地仓库的当前提交(已推到远程仓库),并且覆盖远程仓库提交历史
# 下面两个命令不建议,会被打
git reset --hard resetVersionHash
git push -f origin currentBranch

忠告:如果你的回退涉及到了远程分支,在版本回退时最好使用revert,因它没有修改版本历史;如果使用reset,因为你的reset操作,会使你比远程少了几个提交,远程会提示你落后于远程版本,应该先git pull代码,那么你的reset操作又有何意义呢?(git push -f 强推可以做到,但不推荐这样做)

  1. 描述如下
假设一开始你的本地和远程都是:

a -> b -> c

你想把HEAD回退到b,那么在本地就变成了:

a -> b

这个时候,如果没有远程库,你就接着怎么操作都行,比如:

a -> b -> d

但是在有远程库的情况下,你push会失败,因为远程库是 a->b->c,你的是 a->b->d

两种方案:

push的时候用--force,强制把远程库变成a -> b -> d,大部分公司严禁这么干,会被别人揍一顿。
实践方案如同4。

做一个反向操作,把自己本地变成a -> b -> c -> d,注意b和d文件快照内容一莫一样,但是commit id肯定不同,再push上去远程也会变成 a -> b -> c -> d

反向操作描述如下(建议操作)

  1. git log --pretty=online 显示有三个版本
  2. git revert 版本号,抵消某个版本与其之后版本的修改,注意,这里的逻辑与git reset不一样,如果想回到Second commit的版本,就需要抵消掉Third commit的修改。所以这里应该git revert Third commit的版本号
  3. revert的过程中可能会有冲突,git status查看冲突位置,解决冲突,git commit 文件名(无需git add)
  4. git log --pretty=online,Third commit并没有丢失,而是多了一个revert版本,你可以 git log -p查看每个版本的修改,发现revert的版本所做的修改与Third commit恰恰相反,正好抵消掉了它的修改。

git reset commitID是返回到指定commitID。
git revert commitID是撤销指定的commitID。

git撤回已add未commit的修改

也就是撤销暂存区的修改。
git checkout .

git删除未跟踪文件

  • 删除 untracked files
    git clean -f

  • 连 untracked 的目录也一起删掉
    git clean -fd

  • 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
    git clean -xfd

  • 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删

git clean -nxfd
git clean -nf
git clean -nfd

git merge了错误分支,如何优雅的回退到merge前的状态?

当前master分支,小明和小王在中午12点分别新建了a b 分支。

1.小明在a分支,下午 1 3 5点分别提交了三个commit
2.小王在b分支,下午 2 4 6点分别提交了三个commit
3.小明在a分支,在下午7点执行了git merge b,此时commit的顺序是1 2 3 4 5 6倒序,但是此时发现merge了错误分支,想回退到下午7点时的没merge的状态,即1 3 5commit状态,如何优雅的进行git回退操作?

使用git merge --abort

从commit历史,以及.git库里移除掉某文件

通常是误commit大文件导致不能push。
git push时终端报错:

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
fatal: The remote end hung up unexpectedly

你已经把大文件写入本地.git历史中。
你需要把它从commit历史,以及.git库里移除掉。
可以使用git filter-branch --tree-filter 'rm -f 文件名' HEAD命令

posted @ 2020-05-21 16:33 草珊瑚 阅读(1065) 评论(0) 推荐(0) 编辑
摘要: 一个Observable的例子 输出 可以看到 Observable 对象可以被重复订阅。 Observable 对象每次被订阅后,都会重新执行。 一个Subject的例子 输出 可以看到 Subject 是 Observable 对象。 Subject 是保持内部状态的 Observable 对象 阅读全文
posted @ 2020-04-26 19:40 草珊瑚 阅读(539) 评论(0) 推荐(0) 编辑
摘要: 客户端 开发版和测试版首次登录需要用户手动触发登录。比如点击指定登录组件 对应的事件处理 服务端 根据客户端传过来的 ,以及小程序注册时获取的 和`appSecret openId`和其它非敏感信息。 这个唯一标识 也可以作为你的业务系统中用户的唯一标识。 阅读全文
posted @ 2020-03-29 23:49 草珊瑚 阅读(547) 评论(0) 推荐(0) 编辑
摘要: 依赖收集的策略 遍历dom节点,找到正则匹配的{{}}所在节点,执行$watch方法。 $watch方法传入两个参数: 1.绑定的数据路径 2.回调函数 回调函数包含了对应的节点信息。 $watch方法的实现: 生成一个Watcher实例,用于收集依赖。 然后就把Watcher实例放入全局targe 阅读全文
posted @ 2020-02-27 10:13 草珊瑚 阅读(1313) 评论(0) 推荐(0) 编辑
摘要: 当前版本的生命周期都是同步代码,而且启动超时默认时间为30s。 所以不建议在生命周期内执行耗时操作。如果确定能在30s秒内搞定,可以搞。 非要执行的话,建议通过如下方式: 为什么可以这么操作? 因为 "eggjs的启动过程" 会加载两次config文件,一次在agent.js加载之前,一次是在app 阅读全文
posted @ 2020-01-06 11:14 草珊瑚 阅读(2518) 评论(0) 推荐(0) 编辑
摘要: 场景1 启动时 dubbo服务提供端在Zookeeper上注册的节点目录:假设接口名称是:com.bob.dubbo.service.CityDubboService dubbo服务提供端连接到注册中心,注册自身到 目录下,其节点信息参考如下。 其中第4个节点是临时节点。心跳检测超时zk会删除临时节 阅读全文
posted @ 2019-12-02 13:15 草珊瑚 阅读(699) 评论(0) 推荐(0) 编辑
摘要: 数据的表示 数据可通过二进制0或1表示。一个比特位可以表示0或1。 一个字节等于8个比特位。ascii编码规范是一个字符等于一个字节。 也就是说可以通过 这字符来表示数据。 流的表示 数据交换的过程就是流。这个过程的如下: 可以在缓冲区对流进行操作。 Java语言的Stream类,就是对这些操作进行 阅读全文
posted @ 2019-11-01 10:16 草珊瑚 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 没有 和`EGG_SERVER_ENV`环境变量的场景 执行 ,默认读取 。 执行 ,默认读取 有 和`EGG_SERVER_ENV`环境变量的场景 优先级高于 。 比如,要为开发流程增加集成测试环境 SIT。将 设置成 sit(并建议设置 NODE_ENV = production,也可以不设置) 阅读全文
posted @ 2019-10-12 12:30 草珊瑚 阅读(6307) 评论(0) 推荐(1) 编辑
摘要: 前言 0. promise解决了嵌套地狱的问题,Observable解决了promise只有一个结果,和不可以取消的问题。 1. 使用的是rxjs6版本。 2. 这篇文章是方便使用Observable的API替换Promise的API。 正常用法 then Promise.all Promise.r 阅读全文
posted @ 2019-09-13 20:11 草珊瑚 阅读(1894) 评论(0) 推荐(0) 编辑
摘要: 1. 捕获异步链中的方法 2. 捕获跳出异步链的方法 3. 通过中间件拦截上个中间件的异常http code信息拦截 首先eggjs间件机制是一个洋葱模型。 洋葱模型解释如下: 请求先到gqlErrorHandler,再到graphql。 响应先从graphql,再到gqlErrorHandler。 阅读全文
posted @ 2019-08-08 10:24 草珊瑚 阅读(3775) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示