Git大法好——1.Git的引入以及概念解析
標(biāo)簽:Git
引言
在前面學(xué)習(xí)安卓基礎(chǔ)入門的時(shí)候,簡單的講解了一下Git的簡單使用,幾個(gè)基本的命令這樣,
讓讀者對(duì)Git有了初步的認(rèn)識(shí),而現(xiàn)在越來越多的開發(fā)團(tuán)隊(duì)采用Git作為版本控制工具,當(dāng)然
還有一些公司依舊用著SVN或者其他的版本控制工具,不過也會(huì)相信慢慢過渡,比如開發(fā)Android
的兩款主流IDE:Eclipse正在慢慢地被Android Studio替代!寫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ū),本地倉庫,遠(yuǎn)程倉庫)
- 3.Git中文件的幾個(gè)狀態(tài)
- 4.Git的下載安裝
以上就是本節(jié)要講解的內(nèi)容概要!下面我們來對(duì)一點(diǎn)點(diǎn)的學(xué)習(xí)Git吧!
1.Git的引入
不知道你有沒有和別人一起開發(fā)過同一個(gè)項(xiàng)目,沒有也關(guān)系,我們舉個(gè)例子來體驗(yàn)版本控制的變化:
假如開發(fā)團(tuán)隊(duì)有小豬,B神,基神三個(gè)Android開發(fā)人員,而我們現(xiàn)在需要一起協(xié)作完成一個(gè)XX的APP,
簡單的分工后,我負(fù)責(zé)A模塊,B神負(fù)責(zé)B模塊,基神負(fù)責(zé)C模塊,分工完后,我們要面對(duì)的問題就是
我們?nèi)绾我黄痖_發(fā)這個(gè)項(xiàng)目?我們通過一個(gè)個(gè)方案暴露的問題,一步步引入Git~
方案1:我先做完A模塊,然后B神再在A模塊的基礎(chǔ)上來做B模塊,最后再由基神完成C模塊。
這樣是可以,但假如這樣做的話,效率會(huì)很低,很多時(shí)間都花在等待上,開發(fā)周期也會(huì)非常的長,
而且和一個(gè)人完成整個(gè)項(xiàng)目沒什么區(qū)別,而這種也是大學(xué)做小組形式的課程設(shè)計(jì)的一種合作形式。
方案2:并行的開發(fā),就是自己寫自己的,等三個(gè)人都完成后,再進(jìn)行整合。
同樣也是可以的,但是等到最后再整合,這個(gè)整合的人是誰好?相信此時(shí)的代碼量會(huì)非常的龐大,
記得小豬以前有一個(gè)XX門診管理系統(tǒng)的小組課程設(shè)計(jì),項(xiàng)目很小,邏輯也很簡單,然而整合卻花了
大概一周的時(shí)間,然后還各種莫名其妙的Bug(最后不了了之)...同樣這也是大學(xué)小組課程設(shè)計(jì)的
另一種合作形式。我們需要想辦法減少代碼的合并難度,比如每天合并一次大家編寫的代碼,這樣
做還有另一個(gè)好處就是可以清楚的知道每一個(gè)人的當(dāng)天的工作進(jìn)度,于是乎我們衍生出方案3。
方案3(SVN):將工程代碼托管到某個(gè)服務(wù)器上,每天開始工作時(shí),先把服務(wù)器的代碼同步
到本地,然后再進(jìn)行開發(fā),然后工作結(jié)束后,把代碼提交到服務(wù)器,此時(shí)可能需要解決沖突
(服務(wù)器上的代碼和本地的代碼有不同的地方)問題,沖突解決后,再次提交代碼。
上面的這種方案其實(shí)就是SVN版本控制系統(tǒng)的工作流程,SVN是一種集中式的版本控制系統(tǒng),
集中式體現(xiàn)在:我們需要一個(gè)中央的服務(wù)器,工作的時(shí)候我們需要先從這個(gè)中央服務(wù)器獲取到
項(xiàng)目當(dāng)前的最新版本,然后才開始干活,做完后,再把自己的修改推送給中央服務(wù)器!
同樣也暴露了一個(gè)明顯的缺點(diǎn):
需要聯(lián)網(wǎng),我們才能夠使用SVN,而且會(huì)受網(wǎng)絡(luò)速度的限制,內(nèi)網(wǎng)還可以,外網(wǎng)的話,
上傳速度可能會(huì)很慢。另外還有,依賴于中央服務(wù)器,假如某天服務(wù)器宕機(jī)了,那么誰也
無法提交代碼...
當(dāng)然優(yōu)點(diǎn)也是有的:易于管理,權(quán)限管理機(jī)制,可以確保安全性。
現(xiàn)在還有一些公司使用SVN進(jìn)行項(xiàng)目版本管理,而且大部分大學(xué)開設(shè)的課程講解的也是SVN,
關(guān)于SVN的使用不在此講解,有興趣的可自行查閱相關(guān)文獻(xiàn)~
方案4(Git):我們可以將工程托管到服務(wù)器上(比如Github),將它作為遠(yuǎn)程倉庫,
我們一般會(huì)在服務(wù)端建立兩個(gè)分支:master分支(保存穩(wěn)定版),developer分支(平時(shí)提交的
代碼),然后開發(fā)人員根據(jù)不同的任務(wù),建立本地分支,在該分支上進(jìn)行開發(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è)歷史版本只需簡單的reset即可!
上面我們通過簡單的例子引入了Git這個(gè)東東,可能你對(duì)Git還是有點(diǎn)陌生,有點(diǎn)畏懼,沒事,
我們一步步來,把關(guān)鍵點(diǎn)給掌握了,就可以解鎖更多姿勢(shì)了~
2.Git的四個(gè)組成部分
我們首先要知道Git由四部分組成,他們分別是:
- 工作區(qū)——Working Directory
- 暫存區(qū)——Stage(Index)
- 本地歷史倉庫——Repository
- 遠(yuǎn)程倉庫——Remote
下面我們一一來介紹這四個(gè)部分:
首先是工作區(qū),這個(gè)就不用說了,我們當(dāng)前的工作空間;而另外三個(gè)部分,我決定舉一個(gè)
形象化的例子來幫助大家理解,網(wǎng)購的例子,比如我們?cè)诠渲池垼?br>
---> 看到了心儀的物品,我們可以把商品添加到購物車(暫存區(qū)),我們可能會(huì)頻繁的
添加商品(add)或者移除商品(checkout),在這個(gè)過程中我們可以隨便嗨,反正還沒
給錢;
---> 接著我們挑的七七八八了,接著我們就要提交我們的訂單了,點(diǎn)擊提交訂單(commit),
接著會(huì)生成一個(gè)商品的訂單列表(快照),我們還可以在提交的時(shí)候添加點(diǎn)備注信息,比如
要什么顏色(commit -m "顏色"),好的,此時(shí)訂單提交了,但是我們還沒支付(Push),
我們可以在自己的賬戶未支付訂單列表(本地倉庫)中找到我們的這個(gè)訂單訂單(快照),
也可以看到自己以前的一些訂單記錄;
---> 再接著我們選擇這個(gè)還沒付款的訂單,進(jìn)行支付(Push),付款完成后,商家(遠(yuǎn)程倉庫)
就會(huì)收到這個(gè)訂單,然后發(fā)貨...
相信上面的這個(gè)例子對(duì)你理解Git的四個(gè)部分會(huì)有所幫助,回到正題,我們簡單概括下這四個(gè)部分
在日常協(xié)作中是如何發(fā)揮作用的:
工作區(qū)和暫存區(qū):
我們寫代碼的地方就是工作區(qū),代碼寫完后,我們可以把他提交到暫存區(qū),提交到暫存區(qū)后,我們
可以對(duì)自己的代碼進(jìn)行更改,修改文件內(nèi)容,刪除或者增加文件,只需一個(gè)git checkout xx即可讓
暫存區(qū)內(nèi)容覆蓋當(dāng)前工作區(qū)的內(nèi)容,或者說還原!
暫存區(qū)和本地倉庫:
我們可以把暫存區(qū)的內(nèi)容提交到我們的本地倉庫,此時(shí)會(huì)在倉庫中生成一個(gè)快照,我們可以為這個(gè)
快照打一個(gè)TAG信息,比如這個(gè)快照叫"完成了UI部分"這樣,提交后暫存區(qū)中的內(nèi)容就會(huì)被清空,
此時(shí)我們可以調(diào)用reset指令,制定某個(gè)快照,然后還原到暫存區(qū)!
工作區(qū)和本地倉庫:
我們可以直接走checkout某個(gè)版本的指令,直接讓工作空間還原成某個(gè)本地倉庫中的某個(gè)快照。
本地倉庫和遠(yuǎn)程倉庫:
我們可以將本地的某個(gè)快照push推送到遠(yuǎn)程倉庫,push時(shí)可能還需處理一些沖突;
也可以從拉取遠(yuǎn)程倉庫到本地,比如我們經(jīng)常從Github上clone一些開源項(xiàng)目~
工作區(qū)和遠(yuǎn)程倉庫:
這兩者的協(xié)作一般是pull,即同步遠(yuǎn)程倉庫的代碼到工作空間而已~
我們把上面的協(xié)作內(nèi)容化成一個(gè)流程圖,可以幫助我們更好的理解:
3.Git中文件的幾個(gè)狀態(tà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),又或者說
這個(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...
文件的變化周期流程圖如下:
這里這樣說,可能你有些不太了解,沒事,打開Android Studio對(duì)某個(gè)文件做下上述操作,從文件列表
就可以看到明顯的顏色變化,比如Untracked是紅色,git add后變成藍(lán)色,git commit后變成普通顏色,
關(guān)于指令我們下一節(jié)講,你到時(shí)自己留意下就知道了~
4.Git的下載安裝
好了,關(guān)鍵的概念也就是上面這兩點(diǎn),接下來就是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后,我們就可以打開Git命令行:
Windows在任意位置右鍵,點(diǎn)擊Git Bash打開Git命令行
Ubuntu下直接打開Terminal就可以,Terminal的快捷鍵是:ctrl + alt + t
這里說下為什么要使用命令行:
秀,裝比必備,啪啪啪敲一堆指令,逼格報(bào)表;
減少跨平臺(tái)使用Git的成本:
比如你熟悉了Win下某個(gè)Git的GUI工具,但是加入某一天你要遷移到Linux上,全是命令
行,你怎么玩...或者需要換另一個(gè)新的GUI工具,你又需要花時(shí)間去熟悉這個(gè)工具的使用。
當(dāng)然還是看自己吧,也沒一定要命令行,你也可以用圖形化工具,比如后面也會(huì)講下在
Android Studio上使用Git!