新興技術是一個將開發模式和習慣做法帶入主流的催化劑。有人稱這是一種"真愛無價"現 象,這是一部80年代的電影名字,講述一個書獃子想成為時尚人的故事,“租借”他高中暗戀的對象做其女朋友。最近的一個例子似乎就是Git的興起。Git是一個開源的版本控制系統, 大幅度改善了正規化源代碼管理的情況。我曾經用過其他的方式,比如CVS和Subversion就用了很多年,但Git讓源代碼管理成為了我工作流程中更 加自然而然的一部分——甚至非常有趣。
但跟許多其他的技術一樣,Git較淺的學習曲線促進了它的廣泛應用,而同時它也提供了許多的功能和選項,很容易讓初學者不知所措。現在我也算比較 熟悉這個系統了,因此我維護了一個相關經驗技巧的列表,可以很有效地幫助我管理我的Git項目。現在我將重點講述我認為對新手最有用的那些。
Git要求你在提交最近一個變更集之前顯式地將新跟蹤的文件添加到倉庫。 因此提交變更集的典型命令序列通常是這個樣子:
%>git add .
%>git commit -m "Latest commit message"
為了節省預備步驟並將添加與提交文件的操作放到一起,可以使用-a標誌:
%>git commit -a -m "Latest commit message"
然而,在許多情況下你不應該使用這種快捷方式。稍後在本文中我將演示至少一個例子來說明為什麼。
跟許多流行的命令行工具一樣,Git允許你將自己的用戶設置保存到一個叫.gitconfig的配置文件。在這個文件中,典型的用法是定義你自己的名 字和e-mail地址,因為它們是你跟倉庫交互有關的。但你也可以在這裡定義別名以節省時間。比如, 我的.gitconfig文件就包含了這樣一些常用命令的別名:
[alias]
st = status
co = checkout
cm = commit
pom = push origin master
如果你碰巧忘記了自己定義的別名,可以通過下面這個命令來快速查閱你的配置文件:
%>git config -l
有時候你可能同時在多個文件說做了改動,但只想在即將進行的一次提交中選擇性地添加一部分。為了達到這個目的你可以使用互動式添加功能。比如,假設我創建了兩個新文件:ShopController.php
和ForumController.php,但我只想添加前面那個。
這時候我可以通過給git add傳遞-i選項來啟動互動式添加器:
%>git add -i
這裡你將會碰到詢問菜單,其中提供了幾種選擇:
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
通過選擇 4
,你可以互動式地選擇你想要添加的文件:
What now> 4
1: application/controllers/ForumController.php
2: application/controllers/ShopController.php
Add untracked>>
初始化一個新的Git倉庫以後,最先要做的就是創建一個.gitignore文件。該文件的作用是過濾那些你Git倉庫中不想被跟蹤的文件和目錄。 比如,當我在一個新的Zend框架項目上工作的時候,典型的做法是丟棄那些項目文檔,網站圖片,和來自倉庫的notes.txt文件,也就意味著我 的.gitignore文件看起來是這麼一副模樣:
docs
public/images
notes.txt
在開發最熱火朝天的時候,你可能忘記將一個新創建而不想包含到倉庫的文件添加到.gitignore文件。你可以用rm命令從即將提交的變更列表 中刪除這些文件(被稱為未暫存文件):
%>git rm --cached schema-notes.txt
成為未暫存狀態的時候,你就可以將該文件添加到.gitignore了,然後再重新做一次提交。
在當前版本中對一個文件作過修改以後,我常常需要檢查一個文件早期版本的內容,但又不想真正恢復這個文件。你可以用show命令帶上一個指向該文件 的參數來輕鬆完成這個事情:
%>git show HEAD^:application/controllers/AboutController.php
插入符號(^
)代表查看時需要回退的修訂版的數目。因此上面這個例子會顯示AboutController.php的上 一個修訂版。如果你要查看3次修訂之前的版本,就要使用3個插入符號,像這樣:
%>git show HEAD^^^:application/controllers/AboutController.php
另外,你也可以使用提交的哈希值來引用文件。比如,如果你想查看5個修訂版之前的AboutController.php文件的內容,你必須先執行 git log來查看提交的哈希值,然後使用哈希值的前5個字元來獲取文件內容:
%>git show 23aa985:application/controllers/AboutController.php
我是一個對拼寫一絲不苟的人,但是在比較匆忙地提交最新變更集的時候消息中偶爾會多出一兩個不想要的字母。你可以很容易地用amend命令編輯最近 一次提交的消息:
%>git commit --amend
執行這個命令會講最近的提交消息載入到編輯器中,你可以編輯並保存這些消息。
編程工作的偶然中斷是不可避免的,這常常會導致你處於這麼樣一個位置:尚不到可以提交變更的狀態,而又必須立即修復並提交一個跟當前工作無關的問題。你可以用stash命令一股腦地保存下當前的所有變更,同時將你的基礎逆轉到之前的那個提交點,這時候你就可以修改並進行新的提交。一旦完成,你可以回到你存儲的狀態。比如,假設我正在一個項目的README文件的一個新區段上工作,突然發現了一個很嚴重的拼寫錯誤。我可以這樣來存儲我的當前變更:
%>git stash save
重新打開README,我將會發現那個新的區段消失了,因為我已經回到了上一個提交點。這時候我可以修復那個拼寫錯誤並 提交變更。然後再執行下面這個命令回到我的原始狀態:
%>git stash pop
有很少的幾種基於Web的界面可以用來瀏覽Git倉庫,但是你知不知道一個叫instaweb的東東已經集成到了本地發布裡面?要在瀏覽器裡面閱讀你的代碼倉庫,執行下面這個命令即可:
%>git instaweb --httpd apache2
將apache2傳遞給
--httpd開關會告訴Git使用運行在本機的Apache作為Web伺服器。
雖然也支持幾種其他的伺服器,但默認使用的是lighthttpd。
偶爾可能發生一個團隊成員(當然不是你自己)引入一些未經測試的代碼到倉庫里而破壞構建的事情。自然,你想要將該問題歸咎到某個人。但是誰引入了這個錯誤呢?可以用blame命令來查找:
%>git blame application/controllers/AboutController.php
23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 11) public function indexAction()
23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 12) { 0e9e9f49 (Jason Gilmore 2010-06-03 13:32:47 -0400 13)
echo "Missing semicolon" 23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 14) }
哇靠,好強大!
Git的確是一個有著豐富功能的珍貴寶物,它讓源代碼管理變成了一件輕而易舉的事。你有沒有發現什麼Git的有用功能、技巧和竅門?請在評論中告訴我們!
Jason Gilmore是EasyPHPWebsites.com的創始人。 他還是好些暢銷書的作者,包括"Easy PHP Websites with the Zend Framework", "Easy PayPal with PHP"和"Beginning PHP and MySQL, Third Edition"等。
來源:http://www.developer.com/features/article.php/3886146/10-Git-Tips-and-Tricks-for-Beginners.htm
[火星人 ] 對初學者有用的10個Git技巧已經有338次圍觀