若是你已經使用git很長一段時間了,你極可能遇到過原子提交這個概念了。本質上,這個概念指一次提交只包含相關操做,不包含邏輯上不相關的事情。例如,你對一個類的改動和相關的單元測試應該在一個提交中,而對另外一個不一樣類的操做你應該放在另外一個提交中。html
可是,若是在一個文件中包含多個不相關操做的時候應該怎麼辦,或者你會想要把他們放在多個提交中,這樣你能夠單獨對他們進行revert操做?或者你在一個文件中寫了不少log日誌的語句,可是你不但願將這些語句提交到項目中去怎麼辦?一般人們使用的git命令是達不到這個要求的:linux
$ 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)選項來指定更多細節。git
這是vim的殺招之一,而且我發現不少人(即便是vim的大師)都不是很常用。假如你是個馬虎的用戶(當ssh進入一個空間的時候使用vim去編輯一些配置文件),這招會潛在幫到你不少的。不少人聲稱他們不能放棄IDE的特性緣由就是IDE的智能提示這項功能,這個功能能自動完成變量和函數的名字。這些特性是很是受歡迎的,由於它不會讓咱們由於拼寫而出現錯誤,也縮短了編譯/運行/調試的週期。許多人沒有意識到直接從vim的黑盒子中也有相似的功能,並且是不須要任何插件的。vim
在INSERT模式下,你能夠按下CTRL-N鍵下移建議的自動完成下拉框(這個下拉框vim是從當前緩衝中獲取,若是有的話,也會從tags中獲取),或者按下CTRL-P鍵來上移(若是記不住助記符的話,記着這兩個分別是表明「NEXT」和「PREVIOUS」)。若是隻有一個可能的自動完成條目,vim就會繼續輸入,而後插入這個惟一的條目。很是方便且有效率,特別當你的代碼中有大量的長變量/方法/常量名稱的時候。bash
使用vim的人都知道打開一個遠距離目錄中的文件是很麻煩的(可使用:e 來減緩麻煩程度,可是仍然不能瞬間作到)。若是你正好是在一個team中工做,或者在一個大項目中工做,迅速完成這個事情對你的工做來講是相當重要的。網絡
豐富的ctags(http://ctags.sourceforge.net/)會讓這個世界變得更好。使用ctags,你能夠在頂級目錄下跑一個命令,生成一個」tags」文件,而後,你就可使用Ctrl-] 來「跳到」 你鼠標制定的定義(好比說,一個類名)。按CTRL-T回到你以前的位置。less
你能夠在git中搭建一個提交後鉤子(http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html)當你提交代碼以後會自動生成ctags文件!漂亮。ssh
許多時候,當你寫代碼或者作相關任務的時候,即便可能只是很是微小的操做,你也會發現你本身很是須要一個方法來一遍一遍重複相同的編輯命令。不一樣的開發者會使用不一樣的方法來達到這個目的。例如,SubLime Text(http://www.sublimetext.com/)有個「殺招」是放多個光標在不一樣的位置,而後統一編輯。在Vim(在emacs也同樣,可是咱們這裏只介紹vim的方法),你可使用記錄和回放來完成這個目標。這是個很是有用且方便的工具,它會根據你的操做量的大小在不一樣程度加速你的代碼寫做速度。curl
要製做一個宏,在normal模式下按下q,而後按下其餘的按鍵來「命名」宏(一般我使用q)。vim將會開始記錄你的鍵盤操做,vim將會記錄你的鍵盤操做,知道你按下了q來保存宏。你能夠在normal模式下使用@-letter來重放,因此我一般使用@-q。你也能夠在@重放命令前加個數字,這樣,你能夠一遍又一遍重複執行你的宏(就像許多vim使用者,已經很是習慣來這樣作了)。若是你很是習慣使用vim的花哨的操做命令(例如,使用/搜索來定位),而後你只須要一些小小的聯繫,你就能夠很快地操做大量的宏了,你會將你的還在依靠鼠標進行操做的同事遠遠甩在後面了。socket
沒有特定輸入sudo命令而運行,將給出沒有權限的錯誤。那麼,你不須要重寫整個命令,僅僅輸入'!!'就能夠抓取最後的命令。
咱們大多數都熟悉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
這個命令對於管理員和開發者很是有用。爲了使天天的任務自動化,管理員須要經過輸入vi、vim、nano等打開編輯器。
僅僅從命令行快速的敲擊「Ctrl-x-e」,就能夠在編輯器中開始工做了。
「nl命令」添加文件的行數。一個叫作'one.txt'的文件,其每行的內容是(Fedora、Debian、Arch、Slack和Suse),給每行添加行號。
「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」表示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
那麼如何獲得你的外部IP地址呢?使用google?那麼這個命令就在你的終端輸出你的外部IP地址。
# curl ifconfig.me
注意:你可能沒有按照curl包,你須要 apt/yum來按照包。