為什麼要引入Git:
1)用簡單一點的例子來講:
一個公司有幾個甚至十幾個人共同合作開發一款項目的時候,公司對項目代碼有明确規範,不可能再像學校做的小項目一樣,你覺得哪個同學的代碼寫的不好,或者和你的代碼有沖突,’Duang’直接給别人改掉或删掉,也就是想怎麼改就怎麼改。這種情況對于十幾個人合作的項目來說肯定是不行的。這個時候就需要版本的控制
2)版本控制:
舉一個簡單的例子,如果你用Microsoft Word寫過長篇大論,那你一定有這樣的經曆:
想删除一個段落,又怕将來想恢複找不回來怎麼辦?有辦法,先把目前檔案“另存為……”一個新的Word檔案,再接着改,改到一定程度,再“另存為……”一個新檔案,這樣一直改下去,最後你的Word文檔變成了這樣:

過了一周,你想找回被删除的文字,但是已經記不清删除前儲存在哪個檔案裡了,隻好一個一個檔案去找,真麻煩。
看着一堆亂七八糟的檔案,想保留最新的一個,然後把其他的删掉,又怕哪天會用上,還不敢删,真郁悶。
更要命的是,有些部分需要你的其他同僚幫助填寫,于是你把檔案Copy到U盤裡給她(也可能通過Email發送一份給她),然後,你繼續修改Word檔案。一天後,同僚再把Word檔案傳給你,此時,你必須想想,發給她之後到你收到她的檔案期間,你作了哪些改動,得把你的改動和她的部分合并,真困難。
于是你想,如果有一個軟體,不但能自動幫我記錄每次檔案的改動,還可以讓同僚協作編輯,這樣就不用自己管理一堆類似的檔案了,也不需要把檔案傳來傳去。如果想檢視某次改動,隻需要在軟體裡瞄一眼就可以,豈不是很友善?
這個軟體用起來就應該像這個樣子,能記錄每次檔案的改動:
版本 | 使用者 | 說明 | 日期 |
---|---|---|---|
1 | 張三 | 删除了第一段簡介 | 2015/4/18 13:25 |
2 | 張三 | 增加了第二,三,四,五段的内容 | 2015/4/19 12:30 |
3 | 李四 | 修改了第三段合同金額資料 | 2015/4/20 09:09 |
4 | 王五 | 修改了第四段關于後續維護的條款 | 2015/5/01 11:22 |
這樣,你可以在這個版本管理工具上清楚的看到每次不同的人在同一檔案上所做的修改說明,并且可以選擇下載下傳你需要的版本下來再進行維護。
3)Git的誕生:
下面這段文字,大家就當看故事一樣看一下就行了。介紹這段,主要其實就是說明一個問題,為什麼很多同學一入手Git感覺很高深難用.因為Git是機遇Linux系統的,是以對于用慣了傻瓜的window的同學來說,Linux系統相當的陌生,Git也就顯得不是那麼友好了。
Linus在1991年建立了開源的Linux,從此,Linux系統不斷發展,已經成為最大的伺服器系統軟體了。
Linus雖然建立了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地為Linux編寫代碼,那Linux的代碼是如何管理的呢?
事實是,在2002年以前,世界各地的志願者把源代碼檔案通過diff的方式發給Linus,然後由Linus本人通過手工方式合并代碼!
你也許會想,為什麼Linus不把Linux代碼放到版本控制系統裡呢?不是有CVS、SVN這些免費的版本控制系統嗎?因為Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。
不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續通過手工方式管理了,社群的弟兄們也對這種方式表達了強烈不滿,于是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權Linux社群免費使用這個版本控制系統。
安定團結的大好局面在2005年就被打破了,原因是Linux社群牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協定(這麼幹的其實也不隻他一個),被BitMover公司發現了(監控工作做得不錯!),于是BitMover公司怒了,要收回Linux社群的免費使用權。
Linus可以向BitMover公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:
Linus花了兩周時間自己用C寫了一個分布式版本控制系統,這就是Git!一個月之内,Linux系統的源碼已經由Git管理了!牛是怎麼定義的呢?大家可以體會一下。
Git迅速成為最流行的分布式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
4)集中式和分布式版本控制系統有什麼差別:
集中式的版本控制:Linus一直痛恨的CVS及SVN都是集中式的版本控制系統,版本庫是集中存放在中央伺服器的,而幹活的時候,用的都是自己的電腦,是以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器。中央伺服器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在區域網路内還好,帶寬夠大,速度夠快,可如果在網際網路上,遇到網速慢的話,可能送出一個10M的檔案就需要5分鐘,這還不得把人給憋死啊。
分布式版本控制系統:其根本沒有“中央伺服器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了檔案A,你的同僚也在他的電腦上改了檔案A,這時,你們倆之間隻需把各自的修改推送給對方,就可以互相看到對方的修改了。
【總結:分布式版本控制系統的安全性要高很多,因為每個人電腦裡都有完整的版本庫,某一個人的電腦壞掉了不要緊,随便從其他人那裡複制一個就可以了。而集中式版本控制系統的中央伺服器要是出了問題,所有人都沒法幹活了。分布式版本控制系統通常也有一台充當“中央伺服器”的電腦,但這個伺服器的作用僅僅是用來友善“交換”大家的修改,沒有它大家也一樣幹活,隻是交換修改不友善而已。 】
以上的種種原因使得Git這個工具産生-------->
1、GitHub 與 Git 的關系
1)、Git是一款免費、開源的分布式版本控制系統,他是著名的 Linux 發明者 Linus Torvalds 開發的。說到版本控制系統,估計很多人都用過 SVN ,隻不過 Git 是新時代的産物,如果你還在用 SVN 來管理你的代碼,那就真的有些落伍了。不管是學習 GitHub ,還是以後想從事程式設計行業,Git 都可以算是必備技能了,是以從現在開始建議你先去學習熟悉下 Git 。通俗來說它是用來進行版本控制的,就是用來儲存項目的地方。
但是項目要是運作,還是需要你本地的環境,它隻不過是用來儲存代碼罷了。
【SVN:SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較于RCS、CVS,它采用了分支管理系統,它的設計目标就是取代CVS。網際網路上很多版本控制服務已從CVS遷移到Subversion。Svn是一種集中式檔案版本管理系統,】
【分布式版本控制 (DVCS) 是一種不需要中心伺服器的管理檔案版本的方法,但是它也可以使用中心伺服器。它的真正價值在于,它允許開發人員組實作他們選擇的幾乎任何工作流,允許開發人員以各種新的方式工作它能夠完成很多事情,比如傳統的集中式模型,或兩個開發人員在咖啡館通過無線連接配接協同工作,等等。】
2)、GitHub 上面說了,主要提供基于 git 的版本托管服務。也就是說現在 GitHub 上托管的所有項目代碼都是基于 Git 來進行版本控制的,是以 Git 隻是 GitHub 上用來管理項目的一個工具而已,GitHub 的功能可遠不止于此!5 GitHub 的影響力
3)GitHub如何操作?
可以通過用戶端進行代碼送出,更新。
也可以通過指令來進行操作。
2 GitHub 有什麼用:
學習優秀的開源項目開源社群,我們的軟體開發才能變得越來越容易,越來越快速。試想你在做項目時,如果每一子產品都要自己去寫,如網絡庫、圖檔加載庫、ORM庫等等,自己寫的好不好是一回事,時間與資源是很大的成本。對于大公司可能會有人力與資源去發明一套自己的輪子,但是對于大部分網際網路創業公司來說時間就是一切。而且你在使用開源項目的過程也可以學習他們優秀的設計思想、實作方式,這是最好的學習資料,也是一份提升自己能力的絕佳方式!
3 GitHub網站以及一些簡單的GitHub工具的使用步驟:
1)首先當然是注冊一個賬戶,點選 Sign Up注冊
2.分别填入昵稱,郵箱,登入密碼,确認密碼
3.選擇Free(預設)完成注冊 <如果你看不懂上面的英文,你可以把網頁翻譯成中文>
4.點選 Finish sign up 完成注冊,直接跳轉到郵箱驗證(非常重要)
5.點選Send verification email,GitHub會發送驗證郵件到你的郵箱,進入你的郵箱,按照預設連結激活注冊。注意這一步非常重要,如果不激活郵箱驗證,後面的操作将都不會産生效果
注意:其實這些操作都可以通過git shell指令行來完成,隻是我們這裡結合着GitHub網站和可視化工具
二、GitHub for Windows
1、下載下傳安裝 1)下載下傳位址: https://windows.github.com/
2)輕按兩下進行安裝
3).安裝好之後桌面出現下面的圖示,GitHub就傻瓜的圖形界面,Git Shell是指令行的版本,我們這裡直接使用圖形界面就ok
4)如果第一次進入軟體,會直接提示讓你登入,輸入你剛剛在GitHub注冊的賬戶即可
6)登入之後建立倉庫
點選左上角:
進行建立倉庫,如下圖:
建立好之後,如下圖:
表示這個一個全新的Repository,在自己的電腦上也出現了相應的目錄
接下來釋出這個倉庫,點選右上角Publish Repository釋出倉庫,同時要求填寫倉庫相應描述
右上角變為Syn表示已經釋出成功,右鍵單擊View on GitHub就能直接通過浏覽器進入GitHub網站看到我們釋出的新倉庫了。
送出同步檔案7)倉庫建立好之後,相當于就是我們的第一個版本,你可以在網站左上角看到有一個 1 commit這就表示是我們第一次送出,比如我們現在往倉庫裡面(這裡指myFirstReposity檔案夾裡面)新加一些“測試.doc”檔案,馬上可以看到在工具上多出了一項UnCommited changes
下一步打開GitHub程式,會發現界面有所改變,之後按照提示填寫内容,然後點選
送出即可,如下圖所示:
送出之後如下圖所示,然後點選右上角
進行同步
同步完之後在浏覽器中檢視,這時項目的送出次數已經變成了”2“,如下圖所示:
點選
可以檢視先前的版本,如下圖所示:
修改項目
1)計算機中修改先前建立的空白文檔”測試.doc“,路下圖所示:
修改儲存之後,在軟體中再一次進行送出同步操作,如下圖所示:
同步之後再浏覽器中檢視,送出次數已經變成了3次,之後可以分别下載下傳第二次與第三次送出的文檔,可以比較看出我們修改的内容。
另外,你可以對你自己的資料進行修改
更進一步的了解GitHub:
1、GitHub網站也隻是Git的殼而已,你其實可以不用把它想成一個網站,它隻是一個分布式版本控制軟體伺服器的殼。是以我們主要注冊之後,自己的代碼可以往伺服器上傳。
2、Git這種分布式版本控制又像是一個交友平台。什麼意思呢?比如你注冊了一個交友平台,想認識一些陌生人,你會上傳一些自己的漂亮的照片,自己的簡介,自己的心情,自己的興趣愛好等等去結交一些志同道合的人。别人看到了,會聯系你,如果覺得你好,可能還會把你介紹給其他人。而其人沒有直接看到你的人,又通過别人認識了你。這其實Git的中心思想
3、上面一直在說Repository倉庫,其實你就可以了解為你的項目,一個倉庫就是你的一個項目。是以上面的那些步驟,不過是自己在往項目裡面送出。如果是團隊合作又怎麼做的呢?其實很簡單,就像上面所的,就像交友一樣。
【注意:我們下面所說的另一個使用者相當于另外一個人和另外一台電腦了】
1、在網站上操作Fork(叉)
1)現在我們用另外一個使用者登入GitHub賬戶,找到之前to-striver使用者上傳的叫做myFirstRepository的倉庫
2.現在你找到了這個倉庫,可以将這個倉庫直接加入到你的賬戶當中,點選右上角的Fork,這個倉庫就加入進來了
3.下圖可以明顯看到現在這個新使用者已經Fork了YIFer建立的這份項目
5)同樣将Frok的檔案儲存到本地目錄。
6)當然這裡就可以和之前一樣,這個新使用者同樣可以送出修改檔案,步驟和之前一樣。但是注意一點,這個使用者送出修改的檔案,隻是相當于在他自己Fork的目錄下。簡單來說,意思就是你把檔案拷貝了一份,然後你在拷貝的這份檔案上面進行修改什麼的,對源檔案是沒有影響的
Pull Requests(拉請求)
7)如果新使用者希望自己修改的東西對YIFer的代碼有影響那麼就必須送出申請,讓to-strive使用者接受,這個就是pull requests.在工具的右上角,點選create pull requests
9)送出成功,可以直接點選連結,檢視這次pull requests
10)如果是to-strive使用者,接收到别人的pull requests之後,就會在網站上看到,注意紅色框部分
11)點選進入,可以看到具體别人送出的pull requests
12)點選檢視這次送出,如果可行,選擇合并 Merge pull request
13)合并成功
為什麼要建立分支:
1)當一個項目有很多個子產品,那麼我們可以根據子產品打出分支,然後讓每個開發在對應的子產品的分支上面進行開發。最後再由一個人進行分支合并即可。
2)成功發送一個合并請求之後,圖示會發生改變:
之後點選會跳轉至網頁确定真正合并:
當我們執行了删除掉已經不用的分支之後,遠端庫上将不再有這個分支,此時在用戶端此分支上執行sync操作之後,會發現 sync按鈕又變回了publish按鈕。此時這個分支是一個本地庫分支;
總結一些術語
Git 術語
術語 | 定義 |
---|---|
倉庫 | 一個倉庫包括了所有的版本資訊、所有的分支和标記資訊. |
Repository | 在Git中倉庫的每份拷貝都是完整的。倉庫讓你可以從中 |
取得你的工作副本。 | |
一個分支意味着一個獨立的、擁有自己曆史資訊的代碼線 | |
分支 | (code line)。你可以從已有的代碼中生成一個新的分支 |
Branches | ,這個分支與剩餘的分支完全獨立。預設的分支往往是叫 |
master。使用者可以選擇一個分支,選擇一個分支叫做 | |
checkout. | |
标記 | 一個标記指的是某個分支某個特定時間點的狀态。通過标 |
Tags | 記,可以很友善的切換到标記時的狀态,例如2009年1月25 |
号在testing分支上的代碼狀态 | |
送出 | 送出代碼後,倉庫會建立一個新的版本。這個版本可以在 |
Commit | 後續被重新獲得。每次送出都包括作者和送出者,作者和 |
送出者可以是不同的人 | |
URL | URl用來辨別一個倉庫的位置 |
用來表示代碼的一個版本狀态。Git通過用SHA1 hash算法 | |
修訂 | 表示的id來辨別不同的版本。每一個 SHA1 id都是160位長 |
Revision | ,16進制辨別的字元串.最新的版本可以通過HEAD來擷取. |
之前的版本可以通過"HEAD~1"來擷取,以此類推。 |