1 Git的誕生
很多人都知道,Linus在1991年創(chuàng)建了開源的linux,從此,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了。
Linus雖然創(chuàng)建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux編寫代碼,那Linux的代碼是如何管理的呢?
事實(shí)是,在2002年以前,世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus,然后由Linus本人通過手工方式合并代碼!
你也許會想,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢?不是有CVS、SVN這些免費(fèi)的版本控制系統(tǒng)嗎?因?yàn)長inus堅(jiān)定地反對CVS和SVN,這些集中式的版本控制系統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用。有一些商用的版本控制系統(tǒng),雖然比CVS、SVN好用,但那是付費(fèi)的,和Linux的開源精神不符。
不過,到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了,社區(qū)的弟兄們也對這種方式表達(dá)了強(qiáng)烈不滿,于是Linus選擇了一個商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權(quán)Linux社區(qū)免費(fèi)使用這個版本控制系統(tǒng)。
安定團(tuán)結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集,不免沾染了一些梁山好漢的江湖習(xí)氣。開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實(shí)也不只他一個),被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯!),于是BitMover公司怒了,要收回Linux社區(qū)的免費(fèi)使用權(quán)。
Linus可以向BitMover公司道個歉,保證以后嚴(yán)格管教弟兄們,嗯,這是不可能的。實(shí)際情況是這樣的:
Linus花了兩周時間自己用C寫了一個分布式版本控制系統(tǒng),這就是Git!一個月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會一下。
Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開源項(xiàng)目免費(fèi)提供Git存儲,無數(shù)開源項(xiàng)目開始遷移至GitHub,包括jQuery,php,Ruby等等。
歷史就是這么偶然,如果不是當(dāng)年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒有免費(fèi)而超級好用的Git了。
git與github的交互:
2 安裝git bash工具
要使用git及與github交互,需要使用一個命令行工具bit bash,下載并安裝它。
3 初始化本地庫
通過clone遠(yuǎn)程倉庫或本地創(chuàng)始化,會創(chuàng)建一個.git文件夾(隱藏屬性)。
工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū),而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD。
4 修改本地庫
先對readme.txt做個修改。
然后,在工作區(qū)新增一個LICENSE文本文件(內(nèi)容隨便寫)。
用git status可以查看狀態(tài)。
5 添加文件到暫存區(qū)
使用兩次命令git add,把readme.txt和LICENSE都添加。
現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了:
6 將暫存區(qū)的修改提交到分支
git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支。
一旦提交后,如果你又沒有對工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的。
現(xiàn)在版本庫變成了這樣,暫存區(qū)就沒有任何內(nèi)容了:
7分支管理
分支在實(shí)際中有什么用呢?假設(shè)你準(zhǔn)備開發(fā)一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進(jìn)度的巨大風(fēng)險。
現(xiàn)在有了分支,就不用怕了。你創(chuàng)建了一個屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。
在實(shí)際開發(fā)中,我們應(yīng)該按照幾個基本原則進(jìn)行分支管理:
首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個時候,比如1.0版本發(fā)布時,再把dev分支合并到master上,在master分支發(fā)布1.0版本;
你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。
所以,團(tuán)隊(duì)合作的分支看起來就像這樣:
8 添加遠(yuǎn)程庫
首先,登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創(chuàng)建一個新的倉庫。
9 本地倉庫關(guān)聯(lián)遠(yuǎn)程庫
$ git remote add origin https://github.com:michaelliao/learngit.git
或者:
$ git remote add origin git@github.com:michaelliao/learngit.git
10 本地庫的所有內(nèi)容推送到遠(yuǎn)程庫
$ git push -u origin master
推送成功后,可以立刻在GitHub頁面中看到遠(yuǎn)程庫的內(nèi)容已經(jīng)和本地一模一樣。
把本地master分支的最新修改推送至GitHub,現(xiàn)在,你就擁有了真正的分布式版本庫!
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時候,再把本地提交推送一下就完成了同步,真是太方便了!
ref
https://github.com/wwuhn/Doc/blob/master/github%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.docx
-End-