轉載自 http://blog.csdn.net/jarelzhou/article/details/8256139git
官方教程:http://tortoisegit.org/docs/tortoisegit/ (英文版)github
不少人有一種習慣吧,什麼軟件都要最新的,最好的。其實吧,軟件就是工具,生產力工具,爲的是提升咱們的生產力。若是現有的工具已經能夠知足生產力要求了,就沒有必要換了。生產效率高低應當是選擇工具的第一位。算法
開源世界的版本控制系統,經歷了這麼幾代:windows
第一代,CVS,開創性的產品,至今不少古老項目仍在使用,但存在很多設計上的缺陷。緩存
第二代,SVN,在CVS基礎上大幅度改進,很快就取代了CVS的地位,如今的項目數量仍然很是龐大,並且SVN的缺陷不算多,不少商業項目彷佛沒有遷移到下一代版本控制系統的打算。好比Chrome就是使用SVN的。服務器
第三代,Hg與Git。提及這兩個,有種既生瑜,何生亮的感腳。這兩個項目幾乎是同時啓動的,目標都是爲Linux kernel提供一個開源可靠的分佈式版本控制系統,一樣優秀,只不過Git是Linus親自帶隊作的,因而Git就成了Linux的選擇。除此以外,Eclipse從本來的SVN轉移到了Git,而Firefox與Python則使用Hg,國內的金山軟件也使用Hg,而Cocos2d則是Git,孰優孰劣,很差說。eclipse
總的來講吧,前兩代因爲集中式管理的缺陷,如今用的確定會愈來愈少,不過老項目每每不會輕易換。Git勝在功能強大,分支完善,敗在設計複雜,難以理解。Hg勝在清晰易懂,功能完善,敗在不利於從SVN遷移,相應的社區活躍度不如Github。ssh
咱們暫時會使用git,也許之後也會嘗試另外一個。分佈式
也許你已經看到了TortoiseSVN、TortoiseGit與TortoiseHg這三個項目,你也許想知道這三個是什麼東西。事實上,SVN、Git與Hg都是命令行的程序,對於大多數人來講,尤爲是Windows平臺下,難以上手,門檻較大,而這三個項目正是解決這個問題。TortoiseXXX會在Windows的右鍵菜單下添加絕大多數的版本控制功能,免去了命令行的麻煩。可是說實話,右鍵菜單的效率和命令行的效率哪個高,很差說,不過TortoiseXXX仍是下降了門檻,對於初學者有很大的幫助,畢竟不是誰都能熟記那麼多的命令的。工具
我指的是Windows下。因爲Git歷來沒有官方的windows版(能夠理解,linus作的嘛),windows下有兩種非官方使用途徑,一個是Cygwin,另外一個是msysGit。Cygwin比較兇殘,直接把Gnu工具集轉移到了windows上,不過不推薦,cygwin這個東西,若是不作嵌入式,不須要交叉編譯,用不着這麼兇殘,msysGit就足夠了,也更簡單。目前是1.8.0。
TortoiseGit同時支持兩種使用Git的方式。它只是一個殼,實際調用的仍是Git自己。這兩個軟件安裝也沒有什麼好說的,除了安裝路徑以外,其餘的所有默認就OK。
TortoiseGit安裝後,請設置好你的姓名郵箱,這將會記錄到版本信息中。開始菜單找到tortoisegit的settings就能夠了,不用細說吧?
Git的身份驗證不是密碼,而是密鑰。一般咱們會有一個Git服務器,而咱們的電腦就是工做機,咱們須要一個RSA密鑰來確認身份。密鑰分爲兩個:私有的和公開的,實際上是這樣,公開的存放在服務器上,而私有的放在你手裏,覈對的時候經過一系列複雜算法就能夠匹配了。私有密鑰絕對不要被其餘人看到,這是一個項目中,確認每一個人身份的標識。
密鑰能夠用命令行生成一個。不過咱們有TortoiseGit,看一下TortoiseGit的開始菜單,是否是有一個叫Puttygen的東西?密鑰這個東西有不少工具均可以生成,Puttygen就是個圖形化的工具。使用很簡單,只要運行Puttygen,把右下角的數值改爲4096(這個是最長的)而後點擊「Generate」就能夠了。點擊以後它會要求你隨機移動鼠標,直到進度條滿爲止。
生成完以後呢?千萬不要關閉這個窗口!要是手賤關了,那麼……再來一遍吧。你要在passphrase和下面的確認框輸入密碼,這個密碼你本身寫咯,不過記着哦。寫好以後,點「save private key」保存就行。
Public key是填在服務器上的,咱們以github爲例,若是是別的代碼託管網站,或者你本身搭建,原理都同樣。打開你的Github帳戶,Edit YourProfile,而後SSH keys,而後add,而後把putty生成的public key貼進去就好了。
Github是開源社區目前最活躍的項目託管網站,相似的網站還有SourceForge,bitbucket,google code等,每一個網站支持的版本控制系統不同,主要就是SVN、Git與Hg,github僅支持Git,其餘協議須要很麻煩的插件來擴展,通常不多會用。
儘管Git自己是分佈式的,但咱們一般仍然須要一箇中心的做爲標準的服務器,方便協同開發。Github就是起到了這個做用。
一般咱們這樣進行協同開發:項目有幾個成員,建立者在Github上建立項目,並把其餘人添加到項目中。項目組成員能夠直接向中心庫提交代碼,而其餘人若是想參與進來,就須要用「fork」建立一個項目的分支副本,而後向原始項目提交合並申請,非項目組成員的提交是須要批准才能合併的。這也是一般的開源軟件的開發模式:核心成員主導方向,全部開發人員均可以參與進來。
固然了,非開源項目就沒有那麼麻煩,只要項目成員向中心庫提交代碼就好了。
不要着急,咱們在正式使用以前,須要對Git的基本工做流程有一個清晰的理解。
Git是分佈式的,所以,服務器上的庫和你本地的庫實際上是同等的,兩邊的庫都是具備完整的歷史版本信息的。事實上,若是沒有服務器,那麼成員之間也是能夠直接進行代碼同步的,只不過這樣會很混亂。這一點和SVN與CVS這樣的集中式系統是很不一樣的。
咱們先研究本地的單一分支庫。
文件的兩種基本狀態:被追蹤,和不被追蹤。
緣由很簡單,項目中有咱們須要進行控制的代碼文件,也有不須要的臨時文件。若是咱們新添加了一個文件,那麼它默認是不被追蹤的,你須要主動去添加到追蹤文件中(add操做)。
對於被追蹤的文件,有三種狀態,已修改(modified),已暫存(staged),已提交(commit)。
已修改:你把原有的庫中的某個文件進行了修改,此時因爲文件的校驗值發生了變化,Git會檢測到你作了修改。此時咱們須要作暫存的操做。
已暫存:在修改以後,你能夠把修改暫時寫入緩衝區,在積累了幾回修改足夠構成一次提交以後,再一次性提交(commit)到本地庫。其實上面講的「add」操做,完整的應該說是什麼?應該是「add files to stage」。
已提交:注意這個提交是提交到本地庫,由於本地也有一套完整的代碼庫。
暫存的歷史不會被記錄,只有commit到庫中的信息纔會被記錄到版本信息庫中,之後能夠隨時回滾查看。
可能有的時候你會以爲,中間的那個暫存區要來幹嗎?不少餘嘛。小項目固然徹底無所謂,可是若是項目大了,那麼版本的歷史信息會很複雜的。這個時候,沒必要要的版本過多,也很差。暫存區就是用來防止一些沒必要要的commit。
分支是git的最突出的一個地方。
其實概念很簡單,看名字就知道了,不過爲何要分支?
好比一個項目,如今要同時開發A功能和B功能,怎麼處理?
其實也很簡單,好比有一箇中心庫,而後你克隆到本地,作了一些修改,commit到版本A,而我呢,commit到版本B,而後呢?合併嗎?合併的結果是什麼,合併以後,若是代碼一點問題都沒有,若是A和B兩個功能咱們不須要再回溯,那麼什麼都不是問題。可是每每現實中,若是A忽然發生了問題怎麼辦。
分支就要用上了:咱們有一個主幹分支,而後分別開一個A分支和B分支,你作你的,我作個人,而後確認無誤以後,合併到主幹。那這樣,若是發生問題,是否是就比原來要容易解決多了?不然你都不知道問題出在了哪裏。
真正開發的時候,每每至少會有兩個長期的分支(develop,master),最新的進度在develop中,而master則是穩定可靠的隨時能夠發佈的版本。固然,develop中的代碼也是可運行的完整代碼,不能有殘缺的代碼。開發中會有不少臨時的分支,用來開發一些新功能,在確認無問題以後,合併到develop中,而後刪除臨時分支。Develop中的代碼不必定是合適發佈的,多是實驗性的,在develop中的某個版本到了比較成熟的時候,去和master合併。
當master中有bug了怎麼辦?那就新開一個bugfix分支,解決掉master的bug,同時再和master與develop合併(develop通常也會存在一樣的bug嘛),而後刪除臨時分支。
咱們在開始工做前,先從服務器上拉去最新的版本,而後開發,而後把本身的版本合併到服務器上去。
創建倉庫的操做須要在網站上進行。咱們一般是在服務器上創建倉庫(repository),而後克隆(clone)到本地。若是你想在本地直接創建倉庫(init),那麼一般是本地的單人代碼庫,或者是局域網內部共享的庫,或者你就是代碼服務器的管理員。
Github上創建倉庫的操做很簡單,打開網站,右上角右數第三個按鈕就是了(看圖)。你只須要輸入項目名字,以及創建「.gitignore」文件就行。這個文件其實就是咱們明確指明不須要版本跟蹤的文件,上文已經提到過了。一般這個文件是咱們本身寫的,可是github已經爲咱們的各類常見項目提供了現成的樣板,更加方便。
通常不會有什麼問題,你填寫完以後「create repository」就好了,咱們會看到這樣的頁面:
這樣就建立成功了。能夠看到,如今初始的庫中,有一個master分支,而且有了一次commit,做爲初始化的操做。你也能夠在本地創建倉庫查看,實際上是同樣的。不過咱們一般不在本地創建倉庫,若是你須要協同開發的話,由於你不能讓服務器去克隆你電腦上的倉庫,只能是你去克隆服務器的倉庫。固然了,若是你不打算用服務器的話,那是另一回事了。
能夠看到上面有項目的三種協議的地址:http,ssh,以及git協議的。這三種協議各有優缺點,都是指向同一個項目的。你還能夠下載zip壓縮包,或者用github的windows客戶端進行方便的克隆。這個客戶端作的不錯,不過它只能用在github上面,其餘的代碼託管平臺不能用,這個就很差了。咱們仍是用msysgit+tortoisegit的方式,對命令行熟悉的童鞋能夠考慮直接上命令行啦。又扯開去了,不說了。
咱們用ssh的協議爲例。ssh的倉庫地址大概是長這個樣子:
git@github.com:jarelzhou/testproject.git
在你想要放本地倉庫的地方,右鍵,git clone…
聽說本地倉庫不建議放在eclipse的workspace中,不知爲什麼。題外話了,這樣可能會形成項目間的混亂。
右鍵以後,看到這樣的界面,url中填寫以前github提供的ssh地址,putty key記得選擇以前咱們建立的private key。
而後會要你輸入passphrase,這也是以前設置好的:
建立中:
而後是這個警告窗口,這個窗口只會出現一次,之後就不會有了,這是要你覈對sshkey的,你能夠覈對一下:
若是沒錯的話,點「Yes」就好了。過了一小會兒,會出來提示成功:
這個關掉就能夠了。
此時倉庫信息中已經有了本來倉庫的位置了,再也不須要額外的設置。
有沒有看到,倉庫已經克隆下來啦?被版本控制的目錄會打上綠勾,若是沒有的話你能夠刷新一下看看,windows的圖標緩存有bug,並且至今沒有解決,刷新若是尚未的話可能得註銷一下了。
咱們如今來嘗試給這個測試的項目添一點東西。好比添加一個main.cpp:
保存以後看到目錄變成了這個樣子:
發現有一個~結尾的存檔文件,不該該被跟蹤的。右鍵文件,選擇ignore便可。添加到忽略列表以後,你再刷新,就能夠看到,main.cpp~這個文件上的圖標消失了。
而main.cpp這個文件是咱們要添加到控制中的。右鍵,Tortoisegit-》add,它就從未跟蹤狀態到被跟蹤狀態,並且是被添加到了stage中。
有一種說法,.gitignore自己也應該被忽略,不過這樣的話可能你們添加的文件不一致,因此咱們仍是不忽略了。
這個時候,咱們來commit一下,記錄到本地版本庫中。右鍵,commit便可。注意,git要求每次commit必須輸入描述信息。
點OK就能夠了。此時目錄中全部文件又變成了綠勾的狀態。
咱們已經在本地作了修改,並commit到了本地的庫。Git不容許直接commit到遠程庫,只容許兩個庫之間的同步操做,而沒有commit的修改,是沒有記錄到倉庫中的。如今,咱們來推送(push)到服務器端。
仍舊是強大的右鍵……tortoisegit把幾乎所有的操做放到了右鍵菜單中去。選擇push:
點OK就好了。而後又是一個烏龜翻跟斗的動畫:
推送完了以後,關掉這個窗口就好了。
如今咱們回到github的網站,刷新一下,看看,是否是文件被推送上去啦?
除此以外,還有pull操做,是從服務器端拉取最新的版本庫,由於可能項目組的其餘成員已經作了修改,你須要把其餘人的改動同步下來。
咱們如今只有一個分支,更合理的設置是兩個常設分支,而後按需出現的臨時分支。創建分支的方法:右鍵,create branch,設置好這個分支是從哪一個狀態分叉出來的,默認是當前的工做狀態,你也能夠設成其餘的。切換工做分支是checkout/switch。
在同步的時候,咱們一般是每一個分支單獨同步的,你須要推送什麼分支,就選擇哪一個分支,不要推送錯了。Pull的時候,也是這樣。Tortoisegit提供了拉取/推送所有分支的選項,不過你在作這個操做以前,必需要清楚你在作什麼。
寫到這裏,windows下tortoisegit的大概操做就說完了。你能夠發現,我其實並無過多地去描述tortoisegit怎麼操做,我更多的是在講,git的設計,以及一種比較清晰的工做流程。這種工做流程不只僅是tortoisegit,這在你用命令行的git,甚至是其餘的版本控制系統,都是差很少的。工具不重要,重要的是如何去用工具提升咱們的效率。
寫這篇文章到最後,我也把整個的過程理了一遍,對git也有了更深的理解。仍是寫下來比較清楚。