Git大法好——1.Git的引入以及概念解析
標(biāo)簽:Git
引言
在前面學(xué)習(xí)安卓基礎(chǔ)入門(mén)的時(shí)候渤愁,簡(jiǎn)單的講解了一下Git的簡(jiǎn)單使用愚争,幾個(gè)基本的命令這樣,
讓讀者對(duì)Git有了初步的認(rèn)識(shí)德绿,而現(xiàn)在越來(lái)越多的開(kāi)發(fā)團(tuán)隊(duì)采用Git作為版本控制工具辕录,當(dāng)然
還有一些公司依舊用著SVN或者其他的版本控制工具,不過(guò)也會(huì)相信慢慢過(guò)渡缓熟,比如開(kāi)發(fā)Android
的兩款主流IDE:Eclipse正在慢慢地被Android Studio替代累魔!寫(xiě)Git系列的教程摔笤,初衷是想
幫助一些剛接觸版本控制,或者想從SVN轉(zhuǎn)到Git上的朋友垦写,能夠快速吕世,系統(tǒng)的掌握Git的使用!
而本節(jié)要講解的內(nèi)容Git的一些概念性的東西梯投!內(nèi)容如下:
- 1.Git的引入(團(tuán)隊(duì)協(xié)作中版本管理的一點(diǎn)點(diǎn)改進(jìn))
- 2.Git的四個(gè)組成部分(工作區(qū)命辖,暫存區(qū),本地倉(cāng)庫(kù)分蓖,遠(yuǎn)程倉(cāng)庫(kù))
- 3.Git中文件的幾個(gè)狀態(tài)
- 4.Git的下載安裝
以上就是本節(jié)要講解的內(nèi)容概要尔艇!下面我們來(lái)對(duì)一點(diǎn)點(diǎn)的學(xué)習(xí)Git吧!
1.Git的引入
不知道你有沒(méi)有和別人一起開(kāi)發(fā)過(guò)同一個(gè)項(xiàng)目咆疗,沒(méi)有也關(guān)系漓帚,我們舉個(gè)例子來(lái)體驗(yàn)版本控制的變化:
假如開(kāi)發(fā)團(tuán)隊(duì)有小豬,B神午磁,基神三個(gè)Android開(kāi)發(fā)人員尝抖,而我們現(xiàn)在需要一起協(xié)作完成一個(gè)XX的APP,
簡(jiǎn)單的分工后迅皇,我負(fù)責(zé)A模塊昧辽,B神負(fù)責(zé)B模塊,基神負(fù)責(zé)C模塊登颓,分工完后搅荞,我們要面對(duì)的問(wèn)題就是
我們?nèi)绾我黄痖_(kāi)發(fā)這個(gè)項(xiàng)目?我們通過(guò)一個(gè)個(gè)方案暴露的問(wèn)題框咙,一步步引入Git~
方案1:我先做完A模塊咕痛,然后B神再在A模塊的基礎(chǔ)上來(lái)做B模塊,最后再由基神完成C模塊喇嘱。
這樣是可以茉贡,但假如這樣做的話,效率會(huì)很低者铜,很多時(shí)間都花在等待上腔丧,開(kāi)發(fā)周期也會(huì)非常的長(zhǎng),
而且和一個(gè)人完成整個(gè)項(xiàng)目沒(méi)什么區(qū)別作烟,而這種也是大學(xué)做小組形式的課程設(shè)計(jì)的一種合作形式愉粤。
方案2:并行的開(kāi)發(fā),就是自己寫(xiě)自己的拿撩,等三個(gè)人都完成后衣厘,再進(jìn)行整合。
同樣也是可以的压恒,但是等到最后再整合头滔,這個(gè)整合的人是誰(shuí)好怖亭?相信此時(shí)的代碼量會(huì)非常的龐大,
記得小豬以前有一個(gè)XX門(mén)診管理系統(tǒng)的小組課程設(shè)計(jì)坤检,項(xiàng)目很小,邏輯也很簡(jiǎn)單期吓,然而整合卻花了
大概一周的時(shí)間早歇,然后還各種莫名其妙的Bug(最后不了了之)...同樣這也是大學(xué)小組課程設(shè)計(jì)的
另一種合作形式。我們需要想辦法減少代碼的合并難度讨勤,比如每天合并一次大家編寫(xiě)的代碼箭跳,這樣
做還有另一個(gè)好處就是可以清楚的知道每一個(gè)人的當(dāng)天的工作進(jìn)度,于是乎我們衍生出方案3潭千。
方案3(SVN):將工程代碼托管到某個(gè)服務(wù)器上谱姓,每天開(kāi)始工作時(shí),先把服務(wù)器的代碼同步
到本地刨晴,然后再進(jìn)行開(kāi)發(fā)屉来,然后工作結(jié)束后,把代碼提交到服務(wù)器狈癞,此時(shí)可能需要解決沖突
(服務(wù)器上的代碼和本地的代碼有不同的地方)問(wèn)題茄靠,沖突解決后,再次提交代碼蝶桶。
上面的這種方案其實(shí)就是SVN版本控制系統(tǒng)的工作流程慨绳,SVN是一種集中式的版本控制系統(tǒng),
集中式體現(xiàn)在:我們需要一個(gè)中央的服務(wù)器真竖,工作的時(shí)候我們需要先從這個(gè)中央服務(wù)器獲取到
項(xiàng)目當(dāng)前的最新版本脐雪,然后才開(kāi)始干活,做完后恢共,再把自己的修改推送給中央服務(wù)器战秋!
同樣也暴露了一個(gè)明顯的缺點(diǎn):
需要聯(lián)網(wǎng),我們才能夠使用SVN旁振,而且會(huì)受網(wǎng)絡(luò)速度的限制获询,內(nèi)網(wǎng)還可以,外網(wǎng)的話拐袜,
上傳速度可能會(huì)很慢吉嚣。另外還有,依賴于中央服務(wù)器蹬铺,假如某天服務(wù)器宕機(jī)了尝哆,那么誰(shuí)也
無(wú)法提交代碼...
當(dāng)然優(yōu)點(diǎn)也是有的:易于管理,權(quán)限管理機(jī)制甜攀,可以確保安全性秋泄。
現(xiàn)在還有一些公司使用SVN進(jìn)行項(xiàng)目版本管理琐馆,而且大部分大學(xué)開(kāi)設(shè)的課程講解的也是SVN,
關(guān)于SVN的使用不在此講解恒序,有興趣的可自行查閱相關(guān)文獻(xiàn)~
方案4(Git):我們可以將工程托管到服務(wù)器上(比如Github)瘦麸,將它作為遠(yuǎn)程倉(cāng)庫(kù),
我們一般會(huì)在服務(wù)端建立兩個(gè)分支:master分支(保存穩(wěn)定版)歧胁,developer分支(平時(shí)提交的
代碼)滋饲,然后開(kāi)發(fā)人員根據(jù)不同的任務(wù),建立本地分支喊巍,在該分支上進(jìn)行開(kāi)發(fā)屠缭,工作完成后
將代碼push到developer分支上,假如有沖突崭参,則要先解決沖突呵曹,而后還可能需要merge或者
rebase。(PS:關(guān)于分支的內(nèi)容何暮,后面會(huì)細(xì)講奄喂,別急~)
相比起SVN,Git的優(yōu)勢(shì)有以下幾點(diǎn):支持離線提交郭卫,更加強(qiáng)大的分支管理等砍聊;
Git是一個(gè)快速的分布式的版本控制系統(tǒng),和其他的版本控制系統(tǒng)的差別在于Git直接記錄快照贰军,
而不是差異比較玻蝌!差異比較的版本控制系統(tǒng)只關(guān)心文件內(nèi)容的具體差異,然后每次記錄哪些文件做
了更新词疼,以及更新了哪些行的內(nèi)容俯树!當(dāng)我們想切換到以前某個(gè)版本的時(shí)候,我們需要merge贰盗,而
Git在每次commit時(shí)许饿,都會(huì)完整的存儲(chǔ)當(dāng)前版本所有修改的文件,而不是只存儲(chǔ)diff舵盈,
所以想切換都某個(gè)歷史版本只需簡(jiǎn)單的reset即可陋率!
上面我們通過(guò)簡(jiǎn)單的例子引入了Git這個(gè)東東,可能你對(duì)Git還是有點(diǎn)陌生秽晚,有點(diǎn)畏懼瓦糟,沒(méi)事,
我們一步步來(lái)赴蝇,把關(guān)鍵點(diǎn)給掌握了菩浙,就可以解鎖更多姿勢(shì)了~
2.Git的四個(gè)組成部分
我們首先要知道Git由四部分組成,他們分別是:
- 工作區(qū)——Working Directory
- 暫存區(qū)——Stage(Index)
- 本地歷史倉(cāng)庫(kù)——Repository
- 遠(yuǎn)程倉(cāng)庫(kù)——Remote
下面我們一一來(lái)介紹這四個(gè)部分:
首先是工作區(qū),這個(gè)就不用說(shuō)了劲蜻,我們當(dāng)前的工作空間陆淀;而另外三個(gè)部分,我決定舉一個(gè)
形象化的例子來(lái)幫助大家理解先嬉,網(wǎng)購(gòu)的例子轧苫,比如我們?cè)诠渲池垼?br>
---> 看到了心儀的物品,我們可以把商品添加到購(gòu)物車(chē)(暫存區(qū))疫蔓,我們可能會(huì)頻繁的
添加商品(add)或者移除商品(checkout)浸剩,在這個(gè)過(guò)程中我們可以隨便嗨,反正還沒(méi)
給錢(qián)鳄袍;
---> 接著我們挑的七七八八了,接著我們就要提交我們的訂單了吏恭,點(diǎn)擊提交訂單(commit)拗小,
接著會(huì)生成一個(gè)商品的訂單列表(快照),我們還可以在提交的時(shí)候添加點(diǎn)備注信息樱哼,比如
要什么顏色(commit -m "顏色")哀九,好的,此時(shí)訂單提交了搅幅,但是我們還沒(méi)支付(Push)阅束,
我們可以在自己的賬戶未支付訂單列表(本地倉(cāng)庫(kù))中找到我們的這個(gè)訂單訂單(快照),
也可以看到自己以前的一些訂單記錄茄唐;
---> 再接著我們選擇這個(gè)還沒(méi)付款的訂單息裸,進(jìn)行支付(Push),付款完成后沪编,商家(遠(yuǎn)程倉(cāng)庫(kù))
就會(huì)收到這個(gè)訂單呼盆,然后發(fā)貨...
相信上面的這個(gè)例子對(duì)你理解Git的四個(gè)部分會(huì)有所幫助,回到正題蚁廓,我們簡(jiǎn)單概括下這四個(gè)部分
在日常協(xié)作中是如何發(fā)揮作用的:
工作區(qū)和暫存區(qū):
我們寫(xiě)代碼的地方就是工作區(qū)访圃,代碼寫(xiě)完后,我們可以把他提交到暫存區(qū)相嵌,提交到暫存區(qū)后腿时,我們
可以對(duì)自己的代碼進(jìn)行更改,修改文件內(nèi)容饭宾,刪除或者增加文件批糟,只需一個(gè)git checkout xx即可讓
暫存區(qū)內(nèi)容覆蓋當(dāng)前工作區(qū)的內(nèi)容,或者說(shuō)還原捏雌!
暫存區(qū)和本地倉(cāng)庫(kù):
我們可以把暫存區(qū)的內(nèi)容提交到我們的本地倉(cāng)庫(kù)跃赚,此時(shí)會(huì)在倉(cāng)庫(kù)中生成一個(gè)快照,我們可以為這個(gè)
快照打一個(gè)TAG信息,比如這個(gè)快照叫"完成了UI部分"這樣纬傲,提交后暫存區(qū)中的內(nèi)容就會(huì)被清空满败,
此時(shí)我們可以調(diào)用reset指令,制定某個(gè)快照叹括,然后還原到暫存區(qū)算墨!
工作區(qū)和本地倉(cāng)庫(kù):
我們可以直接走checkout某個(gè)版本的指令,直接讓工作空間還原成某個(gè)本地倉(cāng)庫(kù)中的某個(gè)快照汁雷。
本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù):
我們可以將本地的某個(gè)快照push推送到遠(yuǎn)程倉(cāng)庫(kù)净嘀,push時(shí)可能還需處理一些沖突;
也可以從拉取遠(yuǎn)程倉(cāng)庫(kù)到本地侠讯,比如我們經(jīng)常從Github上clone一些開(kāi)源項(xiàng)目~
工作區(qū)和遠(yuǎn)程倉(cāng)庫(kù):
這兩者的協(xié)作一般是pull挖藏,即同步遠(yuǎn)程倉(cāng)庫(kù)的代碼到工作空間而已~
我們把上面的協(xié)作內(nèi)容化成一個(gè)流程圖,可以幫助我們更好的理解:
3.Git中文件的幾個(gè)狀態(tài)
分大類(lèi)的話厢漩,兩種狀態(tài):Tracked(已跟蹤)和Untracked(未跟蹤)膜眠,區(qū)分的依據(jù)是:
該文件是否已經(jīng)加入版本控制?當(dāng)我們?cè)陧?xiàng)目中新增一個(gè)文件溜嗜,這個(gè)文件此時(shí)就處于Untracked狀態(tài)宵膨!
接著我們可以調(diào)用git add指令將該文件加入暫存區(qū),那么此時(shí)該文件此時(shí)處于Tracked狀態(tài)炸宵,又或者說(shuō)
這個(gè)文件已經(jīng)被我們的版本控制系統(tǒng)所跟蹤了辟躏,而且他處于Staged(暫存)狀態(tài)!接著土全,當(dāng)我們把
暫存區(qū)的文件commit后捎琐,此時(shí)該文件處于Unmodified(未修改)狀態(tài);此時(shí)假如我們編輯下該文件涯曲,
文件又會(huì)變成Modified(修改)狀態(tài)野哭,接著git add又處于Staged(暫存)狀態(tài),然后commit...
文件的變化周期流程圖如下:
這里這樣說(shuō)幻件,可能你有些不太了解拨黔,沒(méi)事,打開(kāi)Android Studio對(duì)某個(gè)文件做下上述操作绰沥,從文件列表
就可以看到明顯的顏色變化篱蝇,比如Untracked是紅色,git add后變成藍(lán)色徽曲,git commit后變成普通顏色零截,
關(guān)于指令我們下一節(jié)講,你到時(shí)自己留意下就知道了~
4.Git的下載安裝
好了秃臣,關(guān)鍵的概念也就是上面這兩點(diǎn)涧衙,接下來(lái)就是Git的一個(gè)下載安裝了哪工!
Windows系統(tǒng):
到Git For Windows或者git-for-windows.github.io上下載,然后是傻瓜式的下一步Linux系統(tǒng):
到Download for Linux and Unix下載弧哎,假如你是和我一樣的Ubuntu的話直接在Terminal鍵入:
sudo apt-get install gitMac系統(tǒng):
到Installing on Mac下載
安裝完Git后雁比,我們就可以打開(kāi)Git命令行:
Windows在任意位置右鍵,點(diǎn)擊Git Bash打開(kāi)Git命令行
Ubuntu下直接打開(kāi)Terminal就可以撤嫩,Terminal的快捷鍵是:ctrl + alt + t
這里說(shuō)下為什么要使用命令行:
秀偎捎,裝比必備,啪啪啪敲一堆指令序攘,逼格報(bào)表茴她;
減少跨平臺(tái)使用Git的成本:
比如你熟悉了Win下某個(gè)Git的GUI工具,但是加入某一天你要遷移到Linux上程奠,全是命令
行丈牢,你怎么玩...或者需要換另一個(gè)新的GUI工具,你又需要花時(shí)間去熟悉這個(gè)工具的使用瞄沙。
當(dāng)然還是看自己吧赡麦,也沒(méi)一定要命令行,你也可以用圖形化工具帕识,比如后面也會(huì)講下在
Android Studio上使用Git!