编译wndr4300 openwrt 15.05固件

为wndr4300编译openwrt 15.05系统,内容如下:

操作环境 ubuntu 14.04 64位

  1. 安装依赖包

    1
    sudo apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc
  2. 下载源码

    1
    2
    3
    4
    5
    6
    cd /home
    git clone git://git.openwrt.org/15.05/openwrt.git
    cd openwrt
    git checkout 15.05
    ./scripts/feeds update -a
    ./scripts/feeds install luci
  3. 编译 获取官方配置

    1
    wget https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/nand/config.diff

将 config.diffg 文件

1
CONFIG_TARGET_ar71xx_nand_R6100=y

修改为

1
CONFIG_TARGET_ar71xx_nand_WNDR4300=y

生成配置

1
2
cat config.diff >> .config
make defconfig

修改 /root 为128MB
修改 target/linux/ar71xx/image/Makefile 文件, 修改 wndr4300_mtdlayout 中 23552k(ubi) 为 120832k(ubi), 25600k@0x6c0000(firmware) 为 122880k@0x6c0000(firmware)

也可以使用配置向导

1
make menuconfig

运行编译

1
make V=99

  1. 生成文件位置
    最后文件生成在 bin 目录下: openwrt/bin/ar71xx/openwrt-15.05-ar71xx-nand-wndr4300-squashfs-sysupgrade.tar openwrt/bin/ar71xx/openwrt-15.05-ar71xx-nand-wndr4300-ubi-factory.img

转载自 http://www.jayclub.net/make-wndr4300-openwrt-15-05.html

针对 bs 的 collapse 写了个添加项的 func

最近在做个项目,用到了 bs 的 collapse,模拟了 select 的操作。但是其中选择的项不是很方便更改,于是写了个 function 来更改其中的 li。在这做个笔记,避免日后忘记,大神见笑。

1
2
3
4
var createPanel=function(to,id,title,lis) {
var collapseIn=typeof arguments[4]!=="undefined"?arguments[4]:$("#"+to+" .panel").length?1:0;
$("#"+to).append($('<div class="panel panel-default" id="panel_'+to+'_'+id+'"><div class="panel-heading" role="tab" id="heading_'+to+'_'+id+'"><h4 class="panel-title"><a'+(collapseIn?'':' class="collapsed"')+' role="button" data-toggle="collapse" data-parent="#'+to+'" href="#collapse_'+to+'_'+id+'" aria-expanded="'+(collapseIn?'false':'true')+'" aria-controls="collapse_'+to+'_'+id+'">'+title+'</a></h4></div><div id="collapse_'+to+'_'+id+'" class="panel-collapse collapse'+(collapseIn?'':' in')+'" role="tabpanel" aria-labelledby="heading_'+to+'_'+id+'"><ul class="list-group">'+((function() { var op=""; for (var i in lis) { op+='<li class="list-group-item" data-menuid="'+i+'">'+lis[i]+'</li>'; } return op; })())+'</ul></div></div>'));
};

用法:

1
mixed createPanel ( string appendToDomId, mixed panelId, mixed title, object liData, [ bool collapseIn ] )

1
<div class="panel-group" id="subject" role="tablist" aria-multiselectable="true"></div>
1
2
createPanel("subject",0,"学科1",{1:"Chinese",2:"English",3:"German"},true);
createPanel("subject","1","学科2",{1:"Physics",2:"Economics"});

我不忍吐槽 bs 的文档,汉化根本不完全。。。这是原文档链接 http://v3.bootcss.com/javascript/#collapse。嗯,就这样吧。。。

iptables防火墙规则的添加、删除、修改、保存

本文介绍iptables这个Linux下最强大的防火墙工具,包括配置iptables三个链条的默认规则、添加iptables规则、修改规则、删除规则等。

一、查看规则集

1
iptables --list -n // 加一个-n以数字形式显示IP和端口,看起来更舒服

二、配置默认规则

1
2
3
iptables -P INPUT DROP  // 不允许进
iptables -P FORWARD DROP // 不允许转发
iptables -P OUTPUT ACCEPT // 允许出

三、增加规则

1
2
3
4
5
6
7
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
//允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP)
iptables -A INPUT -d 192.168.0.22 -j ACCEPT
//允许所有的IP到192.168.0.22的访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
//开放本机80端口
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

//开放本机的ICMP协议

四、删除规则

1
2
iptables -D INPUT -s 192.168.0.21 -j ACCEPT
//删除刚才建立的第一条规则

五、规则的保存

1
2
3
4
5
6
iptables -F
//清空规则缓冲区(这个操作会将上面的增加操作全部清空,若须保留建议先执行一下句:保存)
service iptables save
//将规则保存在/etc/sysconfig/iptables文件里
service iptables restart
//重启Iptables服务

最后说明一下,iptables防火墙的配置文件存放于:/etc/sysconfig/iptables

转载自 http://www.splaybow.com/post/iptables-rule-add-delete-modify-save.html

百度 Fex 的 webUploader 上传文件携带其他参数

目前有两种设置的方法。

全局设置,就是每个文件上传的时候都会携带的。通过修改options.formData来控制。比如如下demo添加一个uid=123。

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
28
29
// 初始化的时候直接添加
var uploader = new WebUploader.Uploader({
...
formData: {
uid: 123
}
...
});

// 初始化以后添加
uploader.options.formData.uid = 123;
局部设置,给每个独立的文件上传设置。通过绑定一个uploadBeforeSend事件来添加。

uploader.on( 'uploadBeforeSend', function( block, data ) {
// block为分块数据。

// file为分块对应的file对象。
var file = block.file;


// 修改data可以控制发送哪些携带数据。
data.uid = 123;

// 将存在file对象中的md5数据携带发送过去。
// data.fileMd5 = file.md5;

// 删除其他数据
// delete data.key;
});

转载自 https://github.com/fex-team/webuploader/issues/145

利用位运算进行权限管理

原理
在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:”可读”、”可写”和”可执行”,分别用 1 、2 和 4 来表示,它们之间可以任意组合:有“可读”、“可写”权限就用 3 来表示(1 + 2 = 3);有”可读“、”可执行“权限就用5来表示(1 + 4 = 5),三种权限全部拥有就用 7 表示(1 + 2 + 4 = 7)。
实际上,这种运算是基于二进制的。
假设可执行、可写、可读三种权限分别对应三个状态位,如果用户具有某种权限,那么将对应的状态位标识为“1”,反之则标识为“0”。

可执行 可写 可读 二进制 十进制
0 0 0 => 0 => 0
0 0 1 => 1 => 1
0 1 1 => 11 => 3
1 1 1 => 111 => 7

如果只有“可读”权限,那么就对应二进制数:001,将这个二进制数转成十进制就得到1;如果同时具有“可读”、“可写”权限,二进制数则对应为: 011,转十进制得:3;同理,三种权限都有的,十进制就等于7。
过位运算符很容易就可以做到类似的权限控制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//定义权限
define('READ', 1<< 0); // 把可读权限放在最右边
define('WRITE', 1<<1); // 可读权限向左移一位
define('EXCUTE', 1<<2); // 可执行权限向左移两位

//赋予权限
$user_permission = READ | WRITE;

//验证权限
echo '可读:', ($user_permission & READ) ? 'Yes' : 'No', "\n";
echo '可写:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n";
echo '可执行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n";
?>

PHP语言本身的错误控制也是用位运算来做的,它甚至还利用了按位异或和按位非,使得错误控制更加精确。

优点和缺陷

位运算的运算对象是二进制的位,速度快,效率高,而且节省存储空间,位运算做权限控制又相当地灵活。但是,位运算也有很大的局限,因为在32位计算机上,位移不能超过32次,这就要求权限数量不超过32种。

转自 http://xiaobin.net/200906/bitwise-permission/

警惕五个思维陷阱

我经常能收到各种回复、提问、私信,有五种我不会回答,有这五种思维的人在现实生活中,我也会尽量远离,这是我爸活着的时候教我的。后来我一位广东朋友跟我说,这不是我爸一个人悟出来的,这是一种在他们那边流传很久的智慧,用广东话讲“费神教会你”。
p35778177
给自己找借口
我收到很多人抱怨自己特别有天赋,被家庭环境所耽误,有些人的确是,这我不否认。但是如果你继续在抱怨的泥潭里,谁也帮不了你。你必须行动起来,改变这一切,大多数时候,尤其是你成年以后,很少有人能干涉你的生活,除了你自己,只有你自己同意。
有位姑娘抱怨“我视野不够是被家庭条件所限,父母没有钱让我环游世界,开拓眼界,所以我发展一直不好。我该怎么办?”
我爸妈也没给我钱让我环游世界去,不光如此我和妹妹还都是大学家里就不再给钱了,我和妹妹的大学假期都是在打工中度过的。可我妹妹在大学就帮助瑞士老师做过设计展。
开拓视野,真的只有环游世界这一个办法吗?你不思考总结,你环游了世界又怎么样。有句话说的好“没感悟,行万里路也是邮差。”人生开拓视野读书、见人、行路、历事都可以,没钱环游世界,读书不就行了?没钱买书,大学图书馆又不收费,多读点书不就行了。为什么《认识商业》《沟通的艺术:看入人里,看出人外》《成功心理学:发现工作与生活的意义》在开头章节都通过总结、评测进行自我认知。我们必须了解自己,正视自己,学会承担责任,为自己的决定负责。你自己被家庭条件阻碍,视野不够,又有几个人的父母资助他们的孩子环游世界去了?你如果不正视自己之前的错误决策,继续为自己找借口,那就只能被困在原地。
大学没有利用好,那毕业后就好好努力呗!为自己找了借口,是舒服了,心理安慰了。潜意识,也会觉得反正不是我的错,那我就继续这样呗。这种思维方式何谈改变呀?!
p35778177
偷换概念
这种人更可怕,我们北京俗语说“干什么不吆喝什么”,“你说前门楼子,他说胯骨肘子”。
比如我们如果想吸粉成为大号,那就充分搜集信息,找到渠道、学习写作技巧。大家聊天也是围绕这个,可是善于偷换概念的人,他思维是跳跃的,他不围绕这个。
有个人问抱怨他文章浏览量低,我说你提高文章质量看的人就多了。他说你是红人,所以浏览量高。
他问你怎么能在短时间内让微信公众号粉丝多起来。我给了他几个平台,建议他写完文章都发发。他说“你怎么这么浮躁。”
有个姑娘单身,问我怎么能够建立亲密关系,我给她推荐《沟通的艺术:看入人里,看出人外》里关于亲密关系的章节。她说“跟男朋友耍心机,感情得不到好结果。”你跟你妈不讲沟通技巧,你妈都讨厌你,别说跟男朋友了。讲沟通技巧怎么就变成耍心机了?你跟他保持亲密关系,进行语言和非语言沟通就变成耍心机了?
不要觉得这是个例,大家可以看看我浏览量几十万的《如何通过爱好赚钱》那篇文章,有几十个回复都是“做自己喜欢的事赚不到钱”,你赚不到钱是能力不行,跟做自己喜欢的事有什么关系?我一直做自己喜欢的事、特立独行的猫一直做自己喜欢的事,我们没有比别人赚钱少呀?赚钱这个事,跟你的能力、思维逻辑有直接关系,跟你喜欢不喜欢你的工作,没什么关系。三百六十行,行行出状元。《理解未来的7个原则:如何看到不可见,做到不可能》用整本书讲如何赚钱,明确提出周期性和线性的决定性作用:周期性变化告诉我们许多种不同的确定性。人类已经找出300个显著的周期,可以在某种程度上精确的预测未来。莎士比亚说:世间事,也有涨潮时节,及时把握,终可功成名就。
这种偷换概念的思维方式、沟通方式,是最好的拒绝别人分享的方式。因为沟通太累,大多数人都会闭嘴,有这种思维的人因为沟通效率差、做事效率低、抓不住重点会被处处受限。
p35778177
看什么都是“鸡汤”
直接上个截图当例子,大家就明白了。
p35779107
正常我们的逻辑,我会问怎么当上旅行体验师?这个工作前景如何?薪水如何?需要什么技能?工作内容是什么?
逻辑思维的关键是“学会提问”,以开放式的心态,学会提问,你学习知识的途径就是一个立体的 ,随时随地都在接受信息,都在吸收知识,这也被称为“淘金式”思维。
相反,截图里的这个例子,是封闭式思维的学习方式。想有孩子,以后会做家长的人千万要注意,教育孩子一定要确认孩子的思维方式,在上学前,教会孩子开放式的思维方式,让孩子学会主动摄取知识,这样孩子学习轻松成绩好。封闭式学习思维的孩子尽管很用功,很努力成绩也总是不尽如人意,尤其是在中学以后,他们在学习上会更痛苦。
p35778177
行动前,先给自己设置障碍,然后放弃
我经常会收到,问我如何写作的,我写过很多关于基础写作的文章,帮助他们。可是他们总会说“这太难了。”
还有人问我什么样的读书类文章会受欢迎,我说横向或者纵向阅读的主题书单,然后他说正常人根本就没有这种阅读量。然后我给他推荐《沟通圣经:听说读写全方位沟通技巧》第12章增进阅读速度,第13章提高阅读效率,然后他说“还得先学阅读,这工程太浩大了。”
有人说我不喜欢现在工作,怎么能找到喜欢的工作并且赚到钱。我的建议只需要评估自己、树立自己想要的目标、了解实现目标需要的技能、学习和提高自身能力、努力实现目标。他们通常会说“可是怎么开始呢?”
他们在行动前,就被自己抛出的问题吓到了,然后就没有然后了。他们会说自己拖延症、选择恐惧症。
p35778177
通过片面信息、以点概面的否定
逻辑分析的首要条件是什么?“充分占有信息”。盲目的通过片面信息否定,有时候很可笑。
比如有人看了我的便签说“字如其人,看这字就是个生活混乱的男人。”难道我两个孩子都是你生的?你给喂的奶?
我还收到过“第三行打了两个句号,作者是个浮躁的人。”
我鼓励大家无论男女都要经济独立,马上有人说“满身铜臭,就知道钱。”
我总是做工具书总结,有人说“你应该多读名著陶冶情操,就不会这么世俗了。”我上学的时候,一直担任班里的图书管理员,在初中、高中的假期协助图书馆老师完成了两个学校的图书馆电子化录入,就是把书读完,把主要内容录入到电脑里,方便检索。学校给学生选的书,大家可以想想算不算名著。我个人分析我世俗应该跟读不读名著没什么关系。
我分享理财攻略,马上有人说“这个人充满物欲。”你父母生病,住院办给你打电话跟你说“单间自费,1000元每天,您预定吗?”的时候,咱们可以再来聊这个话题。

写了这么多,希望能帮到大家。

记录一下钱升钱的面试题和第一小题答案

IMG20160626101617

1
2
3
4
5
6
7
CREATE TABLE `metro` (
`line` INT(11) UNSIGNED NOT NULL,
`stop` VARCHAR(100) DEFAULT NULL,
`sequence` INT(11) UNSIGNED DEFAULT NULL,
KEY `idx_line` (`line`),
KEY `idx_station` (`stop`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
INSERT INTO metro(line,`stop`,sequence)
VALUES (2,'徐泾东',1)
, (2,'虹桥2号航站楼',2)
, (2,'淞虹路',3)
, (2,'北新泾',4)
, (2,'威宁路',5)
, (2,'娄山关路',6)
, (2,'中山公园',7)
, (2,'江苏路',8)
, (2,'静安寺',9)
, (2,'南京西路',10)
, (2,'人民广场',11)
, (2,'南京东路',12)
, (2,'陆家嘴',13)
, (2,'东昌路',14)
, (2,'世纪大道',15)
, (2,'上海科技馆',16)
, (2,'世纪公园',17)
, (2,'龙阳路',18)
, (2,'张江高科',19)
, (2,'金科路',20)
, (9,'杨高中路',1)
, (9,'世纪大道',2)
, (9,'商城路',3)
, (9,'小南门',4)
, (9,'陆家滨路',5)
, (9,'马当路',6)
, (9,'打浦路',7)
, (9,'嘉善路',8)
, (9,'肇嘉浜路',9)
, (9,'徐家汇',10)
, (9,'宜山路',11)
, (9,'桂林路',12)
, (9,'漕河泾开发区',13)
, (9,'合川路',14)
, (9,'星中路',16)
, (9,'七宝',17)
, (9,'中春路',18)
, (9,'九亭',19)
, (9,'泗泾',20)
, (9,'佘山',21)
, (9,'洞泾',22)
, (9,'松江大学城',23)
, (9,'松江新城',24)
, (9,'松江体育中心',25)
, (9,'醉白池',26)
, (9,'松江南站',27);
1
2
3
4
5
6
/* 是否存在一次换成的路线 */
SELECT count(1)
FROM metro AS t,metro AS t1
WHERE t.`stop`=t1.`stop` /* 一次换乘 */
AND t.line=(SELECT line FROM metro WHERE `stop`='淞虹路') /* 出发点 */
AND t1.line=(SELECT line FROM metro WHERE `stop`='漕河泾开发区') /* 终点 */;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 明细换乘路线 -- 可能还需要改进 */
SELECT t2.*
FROM metro AS t2,
(SELECT t.line,t.sequence
FROM metro AS t,metro AS t1
WHERE t.`stop`=t1.`stop`
AND t.line=(SELECT line FROM metro WHERE `stop`='淞虹路')
AND t1.line=(SELECT line FROM metro WHERE `stop`='漕河泾开发区')) AS tt
WHERE t2.line=tt.line
AND t2.sequence<=tt.sequence
AND t2.sequence>=(SELECT sequence FROM metro WHERE `stop`='淞虹路')
UNION
SELECT t2.*
FROM metro AS t2,
(SELECT t1.line,t1.sequence
FROM metro AS t,metro AS t1
WHERE t.`stop`=t1.`stop`
AND t.line=(SELECT line FROM metro WHERE `stop`='淞虹路')
AND t1.line=(SELECT line FROM metro WHERE `stop`='漕河泾开发区')) AS tt
WHERE t2.line=tt.line
AND t2.sequence>=tt.sequence
AND t2.sequence<=(SELECT sequence FROM metro WHERE `stop`='漕河泾开发区');

另求各位大神看看后面的题目,谢谢
全部答案已放出 https://github.com/jshensh/phpcon2016-qsq

css3 calc():css简单的数学运算-加减乘除

多好的东西啊,不用js,一个css就解决了。

1
2
3
4
5
.box{
border:1px solid #ddd;
width:calc(100% - 100px);
background:#9AC8EB;
}

3栏等宽布局。

1
2
3
4
5
6
7
.box{
margin-left:20px;
width:calc(100%/3 - 20px);
}
.box:nth-child(3n){
margin-left:0;
}

实例:

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
28
29
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>css3 calc():css简单的数学运算-加减乘除--刘和虎的博客</title>
<script type="text/javascript" src="http://www.liuhehu.com/themes/sohodesign/js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="js/iehtml5.js"></script>
<style>
.box{
border:1px solid #ddd;
margin:0 auto;
width:calc(100% - 100px);
width:-moz-calc(100% - 100px);
width:-webkit-calc(100% - 100px);
background:#9AC8EB;
}
</style>
</head>
<body>
<div class="box">width:calc(100% - 100px)</div>
<script>
/*
作者:刘和虎
*/
$(function(){
});
</script>
</body>
</html>

运算规则
calc()使用通用的数学运算规则,但是也提供更智能的功能:

使用“+”“-”“*”“/”四则运算;
可以使用百分比、px、em、rem等单位;
可以混合使用各种单位进行计算。

浏览器支持
firefox 4.0+已经开支支持calc()功能,不过要使用-moz-calc()私有属性,chrome从19 dev版,也开始支持私有的-webkit-calc()写法,IE9这次则牛逼了一次,原生支持标准的不带前缀的写法了。Opera貌似还不支持~~

注意:
http://www.qianduan.net/calc-at-at-at-page-intelligent-layout.html看到的,他的原文中width:calc(100%-100px)是没有空格的,经测试无效,就像其评论中:calc()里面的表达式好像要注意格式。

转载自 http://www.liuhehu.com/?p=320

Git保存密码

https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速

设置记住密码(默认15分钟):

1
git config --global credential.helper cache

如果想自己设置时间,可以这样做:

1
git config credential.helper 'cache --timeout=3600'

这样就设置一个小时之后失效


长期存储密码:

1
git config --global credential.helper store

转载自 http://www.cnblogs.com/shi5588/p/4618221.html

Git命令行基本操作

安装Git
网上有很多Git安装教程,如果需要图形界面,windows下建议使用TortoiseGit,linux建议使用Git GUI或者GITK。

Git基本配置
git config 可以配置git的参数,可以使用 git config --list 查看已经配置的git参数。其中有三个级别的保存位置,--system
--global--local,分别表示所有用户(本系统)、当前用户(全局)、本地配置(当前目录),默认使用 --local

配置用户名及邮箱
在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中。

1
2
git config --global user.name "Tocy"
git config --global user.email zyvj@qq.com

其他配置
如果在windows下建议还是配置下默认文本编辑器 core.editor 和差异分析工具 merge.tool

创建Git仓库
可以直接调用 git init
初始化当前目录,即创建Git仓库。

获得Git仓库
如果需要克隆远程仓库,可以使用 git clone,比如:git clone https://git.oschina.net/Tocy/SampleCode.git

提交更新
在windows下的Git GUI中,提交很简单,右键-TortoiseGit-Commit。那么命令行下需要怎么处理? Git中每个文件都有三种状态:committed、staged、modified。它们之间关系如下:
commit <– stage <-- modify="" commit="" --=""> — –modify
我们获取的Git仓库中的所有文件都是committed状态,如果你在本地修改了文件a,a的状态就变成modified的;如果使用 git add a,a的状态变成staged;如果使用 git commit,a的状态就变成commited。这种状态变化也说明复制代码是很方便的,但是提交更新请慎重。 当然还有一种文件状态,未跟踪状态(unversioned/untracked),通过使用 git add可以把未跟踪状态变更为staged;通过 git rm 可以将staged或者committed状态变为未跟踪状态。
git status 通常提交前先检查下修改了什么内容,当前Git目录下各文件的状态。

1
2
3
4
5
6
7
8
9
10
$ git status
On branch master

Initial commit

Untracked files: (use "git add &lt;file&gt;..." to include in what will be committed)
Readme.md


nothing added to commit but untracked files present (use "git add" to track)

git add
git add 可以添加文件或者目录,也可以使用通配符。比如:

1
2
3
git add Readme.md    # add file only
git add *.cpp # add all cpp files
git add /home/code/ # add all files in /home/code

可以查看当前目录的所有修改。 提交之前,还是单独确认下处于staged状态的文件有哪些,并保证修改正确。在实际应用中,可能还需要使用 git diff
导出PATCH做代码走读。 可以使用 git diff --stagedgit diff --cached 查看staged与上次提交快照之间的区别。

git commit
提交前需慎重。直接调用 git commit 会弹出编辑器,输入提交日志(如果是多行日志,建议使用)。 针对单行日志提交的情况,可以使用如下命令:git commit -m "add readme"。 还有一种快捷的提交方式,直接跳过stage缓存区,直接提交当前目录下的所有修改 git commit -a(使用这个命令前建议确认下当前目录的修改是否正确、必须)。

git rm
git rm 会把文件从当前目录删除(不会保存删除的文件)。如果需要从Git仓库中删除,但保留在当前工作目录中,亦即从跟踪清单中删除,可以使用 git rm --cached readme.md

提交历史查看
可以使用 git log 查看当前工程的所有提交的日志。

1
2
3
git log --stat      # 仅显示摘要选项
git log --pretty=oneline # 定制记录格式
git log --graph # 图像化分支和版本更新

远程仓库
可以使用 git remote 查看当前的远程库。
git remote -v 可以显示对应的克隆地址。(对于多个远程仓库很有用)
添加远程仓库 git remote add [short_name] [url] 可以添加新的远程仓库。
从远程仓库抓取数据 git fetch [remote-name] 可以从远程仓库抓取数据到本地。
也可以使用 git pull

推送数据到远程仓库 git push [remote_name] [branch_name]
默认使用origin和master。
查看远程仓库信息 git remote show origin

远程仓库的删除和重命名 git remote rename [old_name] [new_name] git remote rm [remote_name]

打Tags
可使用 git tag 显示当前库中的标签。
添加标签(含附注)git tag -a v0.1 -m "my version 0.1"

使用如下命令查看Tag日志信息(指定对应标签的名字)

1
git show v0.1

也可使用SHA-1的提交表示创建tag:

1
git tag -a v0.2 [SHA-1] -m "my version 0.2"

分享标签
默认的,git push 不会推送标签信息到远程仓库,需要通过命令显式推送。git push origin v0.1

如果需要推送所有标签,使用 git push origin --tags

Git分支
git分支是轻量级的,速度很快,仅记录索引信息。

显示所有分支
使用 git branch 可显示当前所有分支。 可以使用 --merged--no-merged 查看已经合并、未合并的分支。

创建及切换分支
可以使用下面命令直接切换并创建分支 git checkout -b testing
等价于

1
2
$ git branch testing    # 创建testing 分支
$ git checkout testing # 切换到testing分支

注意切换分支时请保持工作目录没有未提交的修改。Git鼓励使用分支,处理完问题之后合并分支即可。

分支合并
将hotfix分支合并到master(主分支)上,需要通过下面命令:

1
2
$ git checkout master
$ git merge hotfix

合并之后可以使用 git branch -d hotfix
删除分支。 如果合并时存在冲突,需要手工修改。

转载自 http://www.cnblogs.com/tocy/p/git-command-line-manual.html