標籤:blog http ar os 使用 sp for 檔案 on
轉載自 http://blog.csdn.net/jarelzhou/article/details/8256139
官方教程:http://tortoisegit.org/docs/tortoisegit/ (英文版)
為什麼選擇Git效率
很多人有一種習慣吧,什麼軟體都要最新的,最好的。其實吧,軟體就是工具,生產力工具,為的是提高我們的生產力。如果現有的工具已經可以滿足生產力要求了,就沒有必要換了。生產效率高低應當是選擇工具的第一位。
曆史
開源世界的版本控制系統,經曆了這麼幾代:
第一代,CVS,開創性的產品,至今很多古老項目仍在使用,但存在不少設計上的缺陷。
第二代,SVN,在CVS基礎上大幅度改進,很快就取代了CVS的地位,現在的項目數量仍然非常龐大,而且SVN的缺陷不算多,很多商業項目似乎沒有遷移到下一代版本控制系統的打算。比如Chrome就是使用SVN的。
第三代,Hg與Git。說起這兩個,有種既生瑜,何生亮的感腳。這兩個項目幾乎是同時啟動的,目標都是為Linux kernel提供一個開源可靠的分布式版本控制系統,同樣優秀,只不過Git是Linus親內建隊做的,於是Git就成了Linux的選擇。除此之外,Eclipse從原本的SVN轉移到了Git,而Firefox與Python則使用Hg,國內的金山軟體也使用Hg,而Cocos2d則是Git,孰優孰劣,不好說。
總的來說吧,前兩代由於集中式管理的缺陷,現在用的肯定會越來越少,不過老項目往往不會輕易換。Git勝在功能強大,分支完善,敗在設計複雜,難以理解。Hg勝在清晰易懂,功能完善,敗在不利於從SVN遷移,相應的社區活躍度不如Github。
我們暫時會使用git,也許以後也會嘗試另一個。
TortoiseXXX是什麼東西
也許你已經看到了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的那點事
Github是開源社區目前最活躍的項目託管網站,類似的網站還有SourceForge,bitbucket,google code等,每個網站支援的版本控制系統不一樣,主要就是SVN、Git與Hg,github僅支援Git,其他協議需要很麻煩的外掛程式來擴充,一般很少會用。
儘管Git本身是分布式的,但我們通常仍然需要一個中心的作為標準的伺服器,方便協同開發。Github就是起到了這個作用。
通常我們這樣進行協同開發:項目有幾個成員,建立者在Github上建立項目,並把其他人添加到項目中。項目群組成員可以直接向中心庫提交代碼,而其他人如果想參與進來,就需要用“fork”建立一個項目的分支副本,然後向原始項目提交合并申請,非項目群組成員的提交是需要批准才能合并的。這也是通常的開源軟體的開發模式:核心成員主導方向,所有開發人員都可以參與進來。
當然了,非開源項目就沒有那麼麻煩,只要項目成員向中心庫提交代碼就行了。
Git工作流程
不要著急,我們在正式使用之前,需要對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嘛),然後刪除臨時分支。
我們在開始工作前,先從伺服器上拉去最新的版本,然後開發,然後把自己的版本合并到伺服器上去。
正式開始建立github倉庫
建立倉庫的操作需要在網站上進行。我們通常是在伺服器上建立倉庫(repository),然後複製(clone)到本地。如果你想在本地直接建立倉庫(init),那麼通常是本地的單人程式碼程式庫,或者是區域網路內部共用的庫,或者你就是代碼伺服器的管理員。
Github上建立倉庫的操作很簡單,開啟網站,右上方右數第三個按鈕就是了(看圖)。你只需要輸入項目名字,以及建立“.gitignore”檔案就行。這個檔案其實就是我們明確指明不需要版本跟蹤的檔案,上文已經提到過了。通常這個檔案是我們自己寫的,但是github已經為我們的各種常見項目提供了現成的樣板,更加方便。
一般不會有什麼問題,你填寫完之後“create repository”就行了,我們會看到這樣的頁面:
這樣就建立成功了。可以看到,現在初始的庫中,有一個master分支,並且有了一次commit,作為初始化的操作。你也可以在本地建立倉庫查看,其實是一樣的。不過我們通常不在本地建立倉庫,如果你需要協同開發的話,因為你不能讓伺服器去複製你電腦上的倉庫,只能是你去複製伺服器的倉庫。當然了,如果你不打算用伺服器的話,那是另外一回事了。
可以看到上面有項目的三種協議的地址:http,ssh,以及git協議的。這三種協議各有優缺點,都是指向同一個項目的。你還可以下載zip壓縮包,或者用github的windows用戶端進行方便的複製。這個用戶端做的不錯,不過它只能用在github上面,其他的代碼託管平台不能用,這個就不好了。我們還是用msysgit+tortoisegit的方式,對命令列熟悉的童鞋可以考慮直接上命令列啦。又扯開去了,不說了。
複製倉庫到本地
我們用ssh的協議為例。ssh的倉庫地址大概是長這個樣子:
[email protected]: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也有了更深的理解。還是寫下來比較清楚。
Windows Git+TortoiseGit簡易使用教程