mavericks使用brew安装PostgreSQL
1 | $ brew install postgresql |
Untitled Post - 51
Mac OS X更改主机名 sudo scutil --set HostName new_hostname
Untitled Post - 50
firefox在linux下窗口最大化时,tabs bar并不会与title bar合并,所以会比较浪费屏幕空间。如果想最大化的节省屏幕空间可以使用pentadactyl,适合vim控,连地址栏都不会显示。还有一个插件叫HTitle,也可以隐藏掉标题栏。
git rebase简介
rebase顾名思义re base,重设基准,也就是重设当前分支的基准,rebase又叫做”衍合”。
git分支都有一个起始点,是从某个commit起始分支出来的。rebase时指定新的分支起始点,git会将当前的分支的所有改变以新的起始点为基准重新计算,计算出相对于新的分支起始点的所有改变之后,将这些改变在新的分支起始点上重放,会生成新的commits,最后将当前分支的头设定到新生成的commits的最后一个上。
实际上就将当前分支嫁接到了新的分支起始点上。rebase可以使提交历史看起来更干净。
rebase还可以用来修改当前分支的历史提交信息,修改历史提交代码,合并或拆分提交,调整提交的历史顺序,甚至删除历史提交,总之这个命令是强大无比。
选定当前分支的一个上游提交,然后使用参数-i进入交互模式Interactive Mode
1 | $ git rebase -i <upstream> |
然后git会用默认编辑器打开一个调整commit的界面,类似如下:
1 | pick 1517205 测试 |
各个命令的解释:
- pick
保留这个提交,不做任何修改 - reword
修改本条提交的提交信息,其他不做修改 - edit
保留这个提交,并修改提交的实际内容 - squash
与上一条提交合并,保留本条提交的提交信息 - fixup
与squash差不多,除了舍弃本条的提交信息 - exec
使用shell执行exec行除exec关键字之后的命令
如果想删除某个提交,将pick那行完整删除即可。如果将所有的行全部移除,rebase将会终止。
参考[2]图文并茂的展示了git rebase的强大威力。
使用rebase必须遵守的一个规则:
一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合(rebase)操作。
如果你遵循这条金科玉律,就不会出差错。否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。
References:
[1]分支的衍合
[2]Git-rebase 小筆記
[3]Git 学习笔记:git-rebase 命令
===
[erq]
Bash heredoc界定终止符缩进
即时文档(heredoc)的界定符是可以自定义的,但一般习惯上使用EOF。
界定符的终止符有一个限制,终止符必须放到行首,后面也不能有任何空白,有时候不缩进会很不美观。
这时候可以这样来使终止符EOF可以使用TAB缩进:
1 | echo |
在设定终止符时加一个横线,也就是使用<<-
但这里还有一个坑,即使是这样写,EOF缩进时也只能使用TAB字符而不能使用任何其他空白字符。
我的vim配置里使用了expandtab来将tab自动替换为空格,因此踩上了这个大坑,无论如何都提示错误:
1 | warning: here-document at line xxx delimited by end-of-file (wanted \`EOF') |
这时候只要输入真正的TAB字符就可以了,Ctrl+V+TAB
,windows下要用Ctrl+Q+TAB
===
[erq]
git操作远程分支和tag
查看远程分支
1 | $ git branch -av |
远程分支会用红颜色显示
删除远程分支
1 | $ git branch -r -d origin/branch-name |
或者推送一个空的分支到远程分支
1 | $ git push origin :branch_to_delete |
删除远程tag
1 | $ git push origin --delete tag tag_to_delete |
或者用一个空的tag覆盖远程tag
1 | $ git push origin :refs/tags/tag_to_delete |
重命名远程分支
先删除远程分支,然后重命名本地分支,然后将重命名后的分支推送到远程。
1 | $ git branch -m old_name new_name |
本地tag推送到远程
1 | $ git push --tags |
获取远程tag
1 | $ git fetch origin tag tag_name |
References:
[1]GIT查看、删除、重命名远程分支和TAG
===
[erq]
git reset与revert
reset和revert都可以修改历史提交,但二者的区别是很大的。
reset
git reset - Reset current HEAD to the specified state
对于撤销提交,git reset的命令格式如下:
1 | $ git reset \[--soft --mixed --hard --merge --keep\] \[-q\] \[<commit>\] |
这种形式的reset会将当前分支的头设置到指定的commit,并且根据不同的模式可能会更新索引区域(使用指定commit的目录树)和工作树。如果省略模式参数,则默认为--mixed
,模式只能设置为以下值之一:
-
--soft
不修改索引区域(staging area)和工作目录(woring tree),直接将当前分支的头设置为commit。 -
--mixed
使用commit的目录树重置索引区域,当前工作树保持不变。因此工作树中修改的文件需要重新添加到索引区域才能提交。 -
--hard
使用commit的目录树重设索引区域和工作树。完全丢弃commit之后的所有修改。 -
--merge
使用commit的目录树重设索引区域,并且更新工作树中在commit和HEAD之间存在差异的文件,但是不更新工作树中索引区域与工作树之间存在差异的文件。
如果一个文件在commit和有修改但未将修改更新到索引区域的文件之间存在差异,则撤销会被终止。 -
--keep
使用commit的目录树重设索引区域,并且更新工作树中在commit和HEAD之间存在差异的文件。
revert
1 | $ git revert <commit>... |
git revert用于反转提交,执行evert命令时要求工作树必须是干净的。git revert用一个新提交来消除一个历史提交所做的任何修改。
区别
reset会将历史提交直接撤销掉,不会保留提交历史。而revert会增加一个新的提交来反转指定的历史提交所做的修改,保留完整的提交历史,但被反转的提交相当于没对代码库做任何修改。简单来说,一次提交修改了代码库,revert后另一个提交把对应的修改恢复了原样。
如果comit已经push到远程服务器,要慎用甚至最好不要用reset来撤销修改,除非你真的知道你在做什么。这时候用revert是比较合适的。如果这时候执行git push,会有错误提示:
1 | To gitsvr:xxx |
如果你确信你push到远程服务器的提交没有别人在引用,比如就你自己在使用代码库,可以强制更新远程代码库:
1 | $ git push -f |
如果你的强制撤销会影响到别人,就应该使用git revert了。
git reset后悔药
git reset后还能恢复吗?只要提交对象还在代码库中存在就可以恢复,因为只不过是HEAD指针被移动了而已,可以重新移动到原来的提交对象。
使用git reflog查看操作历史,找到之前 HEAD 的 hash 值,然后git reset --hard
到那个hash就可以了。
References:
[1]man git
===
[erq]
Mac安装Eclipse
系统为mavericks
下载Mac OS X(Cocoa 64)版本的Eclipse IDE for Java EE Developers,当前版本为Kepler。
然后将其解压到/opt目录下就算完成了安装
1 | # mkdir /opt |
安装自带了Eclipse.app,将其从finder中拖到dock中的Lauchpad图标上就可以将其加入到Lauchpad中,也可以直接将其拖到dock中。或许将其直接拖放到Applications文件夹中也可以。
===
[erq]
mac系统tomcat使用80端口
mac与linux一样,1024以下的端口为特权端口,只有root用户才有权监听。
因此要使用80端口要么使用root启动tomcat,要么使用端口转发。
使用ipfw(Internet Protocol Firewall)设置端口转发
1 | # ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in |
不过ipfw已经被标记为废弃状态。
使用pf(packet filter)设置端口转发
- 创建anchor文件
/etc/pf.anchors/tomcat1
rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
- 测试anchor文件
1
# pfctl -vnf /etc/pf.anchors/tomcat
- 添加到主配置文件
pf启动时会自动装载/etc/pf.conf文件,因此将anchor文件链接到/etc/pf.conf,转发规则就会自动建立了。注意要紧随文件中现有的rdr-anchor后面添加上面两行1
2rdr-anchor "tomcat-forwarding"
load anchor "tomcat-forwarding" from "/etc/pf.anchors/tomcat" - 打开pf
pf默认是关闭的。可以使用以下命令启动pf:也可以使用其他配置文件启动pf。1
# pfctl -ef /etc/pf.conf
也可以修改LaunchDaemons来使pf开机自动打开。
/System/Library/LaunchDaemons/com.apple.pfctl.plist
[xml]
[/xml]
添加的为-e参数,即enable。
有一点一定要注意,-f和/etc/pf.conf这两个参数不能被打断,因为-f必须紧跟一个文件参数,所以说添加-e参数时不要打断-f参数,否则开机不会自动启动pf,切记。
- 跨接口转发
如果需要跨接口转发,则需设置系统参数:
/etc/sysctl.conf这与linux一致。1
2net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
References:
[1]Port Forwarding in Mavericks
===
[erq]