linux操作
git add -p
如果你已经使用git很长一段时间了,你很可能遇到过原子提交这个概念了。本质上,这个概念指一次提交只包含相关操作,不包含逻辑上不相关的事情。例如,你对一个类的改动和相关的单元测试应该在一个提交中,而对另一个不同类的操作你应该放在另一个提交中。
但是,如果在一个文件中包含多个不相关操作的时候应该怎么办,或者你会想要把他们放在多个提交中,这样你可以单独对他们进行revert操作?或者你在一个文件中写了很多log日志的语句,但是你不希望将这些语句提交到项目中去怎么办?通常人们使用的git命令是达不到这个要求的:
$ git diff diff --git a/some-file.c b/some-file.c index f383179..09e4e35 100644 --- a/some-file.c +++ b/some-file.c @@ -2,6 +2,8 @@ int main(void) { printf("doing some stuff\n"); - printf("doing some more stuff\n"); + do_some_stuff(); + printf("doing some unrelated stuff\n"); + do_some_unrelated_stuff(); return 0; } $ git add some-file.c $ git commit [master 1938906] some unrelated stuff, cramming it all in one commit 'cause I'm lazy 1 file changed, 3 insertions(+), 1 deletion(-) $ echo "Whoops we just committed unrelated stuff. Not very modular of us."
git add的 -p (代表patch)参数对于这种场景是非常有用的。这个会告诉git add,我想要做一个特殊的add操作,并且这个命令有个非常好的交互界面能让我们明确指定我们想要操作文件中的哪个部分。git会将所有的变动自动分块,你可以使用y或者n来通过或者拒绝这个分块,或者你也可以使用s将它切成更细粒度的块。如果git不能自动将变动分成你希望的块的话,你可以使用e(edit)选项来指定更多细节。
vim的 CTRL-P/CTRL-N 自动完成的功能
这是vim的杀招之一,并且我发现很多人(即使是vim的大师)都不是很经常使用。假如你是个马虎的用户(当ssh进入一个空间的时候使用vim去编辑一些配置文件),这招会潜在帮到你很多的。很多人声称他们不能放弃IDE的特性原因就是IDE的智能提示这项功能,这个功能能自动完成变量和函数的名字。这些特性是非常受欢迎的,因为它不会让我们因为拼写而出现错误,也缩短了编译/运行/调试的周期。许多人没有意识到直接从vim的黑盒子中也有类似的功能,而且是不需要任何插件的。
在INSERT模式下,你可以按下CTRL-N键下移建议的自动完成下拉框(这个下拉框vim是从当前缓冲中获取,如果有的话,也会从tags中获取),或者按下CTRL-P键来上移(如果记不住助记符的话,记着这两个分别是代表“NEXT”和“PREVIOUS”)。如果只有一个可能的自动完成条目,vim就会继续输入,然后插入这个唯一的条目。非常方便且有效率,特别当你的代码中有大量的长变量/方法/常量名称的时候。
丰富的ctags
使用vim的人都知道打开一个远距离目录中的文件是很麻烦的(可以使用:e 来减缓麻烦程度,但是仍然不能瞬间做到)。如果你正好是在一个team中工作,或者在一个大项目中工作,迅速完成这个事情对你的工作来说是至关重要的。
丰富的ctags(http://ctags.sourceforge.net/)会让这个世界变得更好。使用ctags,你可以在顶级目录下跑一个命令,生成一个”tags”文件,然后,你就可以使用Ctrl-] 来“跳到” 你鼠标制定的定义(比如说,一个类名)。按CTRL-T回到你之前的位置。
你可以在git中搭建一个提交后钩子(http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html)当你提交代码之后会自动生成ctags文件!漂亮。
vim 宏
许多时候,当你写代码或者做相关任务的时候,即使可能只是非常微小的操作,你也会发现你自己非常需要一个方法来一遍一遍重复相同的编辑命令。不同的开发者会使用不同的方法来达到这个目的。例如,SubLime Text(http://www.sublimetext.com/)有个“杀招”是放多个光标在不同的位置,然后统一编辑。在Vim(在emacs也一样,但是我们这里只介绍vim的方法),你可以使用记录和回放来完成这个目标。这是个非常有用且方便的工具,它会根据你的操作量的大小在不同程度加速你的代码写作速度。
要制作一个宏,在normal模式下按下q,然后按下其他的按键来“命名”宏(通常我使用q)。vim将会开始记录你的键盘操作,vim将会记录你的键盘操作,知道你按下了q来保存宏。你可以在normal模式下使用@-letter来重放,所以我通常使用@-q。你也可以在@重放命令前加个数字,这样,你可以一遍又一遍重复执行你的宏(就像许多vim使用者,已经非常习惯来这样做了)。如果你非常习惯使用vim的花哨的操作命令(例如,使用/搜索来定位),然后你只需要一些小小的联系,你就可以很快地操作大量的宏了,你会将你的还在依靠鼠标进行操作的同事远远甩在后面了。
sudo !!命令
没有特定输入sudo命令而运行,将给出没有权限的错误。那么,你不需要重写整个命令,仅仅输入'!!'就可以抓取最后的命令。
mtr命令
我们大多数都熟悉ping和traceroute。那对于把两个命令的功能合二为一的mtr命令呢。如果mtr没在你的机子上安装,apt或者yum需要的包。
$ sudo apt-get install mtr (On Debian based Systems)
# yum install mtr (On Red Hat based Systems)
现在运行mtr命令,开始查看mtr运行的主机和google.com直接的网络连接。
# mtr google.com
Ctrl+x+e命令
这个命令对于管理员和开发者非常有用。为了使每天的任务自动化,管理员需要通过输入vi、vim、nano等打开编辑器。
仅仅从命令行快速的敲击“Ctrl-x-e”,就可以在编辑器中开始工作了。
nl命令
“nl命令”添加文件的行数。一个叫做'one.txt'的文件,其每行的内容是(Fedora、Debian、Arch、Slack和Suse),给每行添加行号。
shuf命令
“Shut”命令随机从一个文件或文件夹中选择行/文件/文件夹。首先使用ls命令来显示文件夹的内容。
# ls Desktop Documents Downloads Music Pictures Public Templates Videos # ls | shuf (shuffle Input) Music Documents Templates Pictures Public Desktop Downloads Videos # ls | shuf -n1 # 随机选择一个 Public # ls | shuf -n1 Videos # ls | shuf -n1 Templates # ls | shuf -n1 Downloads
注意:你可以把‘ n1’替换成‘ n2’来输出两个随机选择或者使用 n3、 n4等数字输出其他任意的随机选择。
ss命令
“ss”表示socket统计。这个命令调查socket,显示类似netstat命令的信息。它可以比其他工具显示更多的TCP和状态信息。
# ss State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.198:41250 *.*.*.*:http CLOSE-WAIT 1 0 127.0.0.1:8000 127.0.0.1:41393 ESTAB 0 0 192.168.1.198:36239 *.*.*.*:http ESTAB 310 0 127.0.0.1:8000 127.0.0.1:41384 ESTAB 0 0 192.168.1.198:41002 *.*.*.*:http ESTAB 0 0 127.0.0.1:41384 127.0.0.1:8000
curl ifconfig.me
那么如何得到你的外部IP地址呢?使用google?那么这个命令就在你的终端输出你的外部IP地址。
# curl ifconfig.me
注意:你可能没有按照curl包,你需要 apt/yum来按照包。