git相关

GitHub小结

作为世界上目前最大的 【男性同性交友平台】 开源平台,现在的程序猿没有不知道的吧!
关于git的操作,推荐一个链接http://gitbook.liuhui998.com/,能帮助你尽快的掌握Git。

这里简单记录下一些我容易忘记的功能:

rebase (变基)

中文听起来很恶心。。。我是从sourceTree这个gitGUI程序的中文翻译里copy来的。

基本

git rebase用于把一个分支的修改合并到当前分支。
这个和merge很像。

1
2
git merge develop
git rebase develop

都是把develop分支合并到当前分支。

区别如下:(图片来至推荐连接)

在原有的C1、C2 2个提交后,2个分支origin和mywork各提交了2次

1

这里通过merge commit提交会变成这样:

2

而通过rebase提交则会变成这样:

3

这些命令会把你的”mywork”分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到”.git/rebase”目录中),然后把”mywork”分支更新到最新的”origin”分支,最后把保存的这些补丁应用到”mywork”分支上。当’mywork’分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除。变成这样:

4

在Gitlog上观察的话会是这样:

5

当我们使用Gitlog来参看commit时,其commit的顺序也有所不同。

假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,

对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1

对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C7 ,C6‘,C5’,C4,C3,C2,C1

因为C6’提交只是C6提交的克隆,C5’提交只是C5提交的克隆,
从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1

在发生冲突时:

在rebase的过程中,也许会出现冲突。 在这种情况,git会停止rebase并会让你去解决冲突;在解决完冲突后,用git-add命令去更新这些内容的索引, 然后你无需执行git-commit,只要执行:git rebase --continue就能继续应用(apply)余下的补丁。
在任何时候,你可以用git rebase --abort来阻止rebase的行动,并且”mywork”分支会回到rebase开始前的状态。

结论:

  • 使用merge命令合并分支,解决完冲突,执行git addgit commit -m 'XXXX'。这个时候会产生一个commit。
  • 使用rebase命令合并分支,解决完冲突,执行git addgit rebase --continue,不会产生额外的commit。这样的好处是‘干净’,分支上不会有无意义的解决分支的commit。
  • merge显性的处理冲突,rebase隐性的处理冲突。

补充:fork后clone下来的项目如何保持与原项目同步?

当我们在github上fork出一个项目后,如果原有的项目更新了,怎样保持我们fork出来的项目和原有项目保持同步呢并提交我们的代码更新呢?

  1. 在Fork的代码库中添加上游代码库的remote源,该操作只需操作一次即可:(P.S. 其中# upstream 表示上游代码库名, 可以任意。)

    1
    git remote add upstream <原作者项目的URL>
  2. 将本地的修改提交commit

  3. 将远程分支同步到本地

    1
    git fetch upstream
  4. 检查本地代码变更

    1
    git checkout master
  5. 合并

    1
    2
    3
    git merge upstream/master
    或者
    git rebase upstream/master

React组件开发中的神器

React中的Context

写在前面的话

Context是react@0.14以后发布的一个先进易变特性,它的API很可能会在未来的版本里改动。context有点儿像全局变量,使用它会使代码不够清晰。

我是正文

首先,既然有可能变动,那么为什么还要用context?context有什么用?

好吧,其实context主要用在react组件间内部传递props用。那直接用props传递不是更好?问题就在这里,假设我们的应用页面很复杂,用到了多个组件,并且组件之间多层级嵌套,那么通过props一层层的传递当然没有问题,只是太过麻烦了,这个时候context的优势就体现出来了。

假如我们有下面这样的组件结构

image

F组件要获取A组件中的设置信息怎么办?肯定不能一层层的写props传递啊,程序猿都很懒的好伐~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var A = React.createClass({
childContextTypes: {
setting: React.PropTypes.object.isRequired
},
getChildContext: function() {
return {setting: this.state.setting};
},
render: function() {
return <div>{this.props.children}</div>;
}
});
/**
B...
C...
D...
E...
*/
var F = React.createClass({
contextTypes: {
setting: React.PropTypes.object.isRequired
},
render: function() {
return (
<div>{this.context.setting.info}</div>
);
}
});

是不是很简单?只要在外层定义一个getChildContext方法,在父层和里层分别制定contextTypes就可以直接在里层用this.context访问了。

另外官方文档上说,context也可以在生命周期里引用

1
2
3
4
5
constructor(props, context)
componentWillReceiveProps(nextProps, nextContext)
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)
componentDidUpdate(prevProps, prevState, prevContext)

github加速

github加速

一般Github的访问有两部分:主站的访问和二级域名的资源加载(比如样式文件等)。

为什么慢?因为github的CDN被某墙屏了。

那么有vpn服务的可以直接使用vpn,没有vpn的,可以绕过dns解析,在本地直接绑定host

找到最快的ip

用站长工具的DNS查询,查找tel最小的IP地址

  • 192.30.253.113 www.github.com
  • 151.101.192.133 documentcloud.github.com
  • 192.30.253.113 github.com
  • 151.101.192.133 assets-cdn.github.com
  • 151.101.192.133 avatars0.githubusercontent.com
  • 151.101.192.133 avatars1.githubusercontent.com
  • 8.7.198.45 gist.github.com
  • 151.101.192.133 help.github.com
  • 192.30.253.121 nodeload.github.com
  • 151.101.192.133 raw.github.com
  • 23.21.205.246 status.github.com
  • 151.101.100.133 training.github.com
  • 151.101.88.249 github.global.ssl.fastly.net

修改hosts

1.在终端执行指令sudo vi /etc/hosts打开hosts文件进行编辑

2.插入上述查找到的ip地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# github
192.30.253.113 www.github.com
151.101.192.133 documentcloud.github.com
192.30.253.113 github.com
151.101.192.133 assets-cdn.github.com
151.101.192.133 avatars0.githubusercontent.com
151.101.192.133 avatars1.githubusercontent.com
8.7.198.45 gist.github.com
151.101.192.133 help.github.com
192.30.253.121 nodeload.github.com
151.101.192.133 raw.github.com
23.21.205.246 status.github.com
151.101.100.133 training.github.com
151.101.88.249 github.global.ssl.fastly.net

RN项目框架搭建

#RN项目框架搭建

主框架

  • 采用react-native + react-redux + axios分别实现视图层、逻辑层、数据通信层;
  • 采用realm + storage做本地存储;
  • 采用react-native-router-flux实现路由功能;

目录结构

  • app
    • assets 图片资源
    • component 组件
    • core 核心组件
    • pages 页面
    • theme 主题
    • utils 工具类
  • biz
    • actions 请求action
    • api api接口
    • entity 本地存储entity
    • middleware redux中间件
    • reducers redux的reducer
    • repository 本地存储
    • socket socket封装
    • errors 请求错误处理

关于RN的主题化实现

痛点

开发了几个工程后,越发觉得react-native在app初始阶段的快速迭代开发有不十分巨大的优势。然而开发中遇到的问题也比较多,例如性能问题,组件问题,主题问题,开发规范问题,多人协作问题等等。
今天主要说下主题的问题吧。
在很多开发中,我们都需要指定一些通用的页面式样,比如:背景颜色,标题字体大小及颜色,默认字体等等。这些听起来在css上很容易实现,但是在RN上却不能简单的做到,虽然可以创建一个通用的MyText这种组件,然后在app中广泛使用它,但是这满足改变我们对主体化和全局式样的需求。

好在github上已经出现了一些kit组件库的开源项目,里面关于主题化的想法很不错,在这里结合自己的理解总结一下。

开始博客

博客这东西

记得上次写博客还是6年前了,然后去创业后就再也没有时间写这东西了!时间不由己啊!

从开这东西的想法其实很简单:年纪大了,很多东西都记不住了!前几天翻看收藏夹,发现:『我艹,这东西我以前看过』?不得不说,过了30后记忆力减退是真的~

为了应对这一问题,我就想起了博客。可是发现以前的帐号已经不知什么时候注销掉了,正好同事说github上面搭博客挺方便的,就有了现在这个page。