Git
常見(jiàn)的版本控制工具主要有svn和Git
Git是一個(gè)開(kāi)源的分布式版本控制工具扣蜻,它的開(kāi)發(fā)者就是大名鼎鼎的Linux操作系統(tǒng)的作者Linus Torvalds逆巍。Git被開(kāi)發(fā)出來(lái)的初衷是為了更好地管理Linux內(nèi)核,而現(xiàn)在卻早已被廣泛應(yīng)用于全球各種大中小型的項(xiàng)目中莽使。
Git的各種命令是你應(yīng)該掌握的核心技能锐极,不管你是在哪個(gè)操作系統(tǒng)上,使用命令來(lái)操作Git肯定都是通用的芳肌。而圖形化的操作應(yīng)該是在你能熟練掌握命令用法的前提下灵再,進(jìn)一步提升你工作效率的手段。
如果你使用的是Windows操作系統(tǒng)亿笤,就從開(kāi)始里面找到Git Bash并打開(kāi)翎迁。
1.配置一下你的身份
然后我們就可以創(chuàng)建代碼倉(cāng)庫(kù)了,倉(cāng)庫(kù)(Repository)是用于保存版本管理所需信息的地方净薛,所有本地提交的代碼都會(huì)被提交到代碼倉(cāng)庫(kù)中汪榔,如果有需要還可以在推送到遠(yuǎn)程倉(cāng)庫(kù)中。
我們嘗試著給BroadcastBestPractice項(xiàng)目建立一個(gè)倉(cāng)庫(kù)肃拜。
先進(jìn)入到BroadcastBestPractice項(xiàng)目的目錄下面痴腌。
git init
只需要一行命令就可以完成創(chuàng)建代碼倉(cāng)庫(kù)的操作。
倉(cāng)庫(kù)創(chuàng)建完成后爆班,會(huì)在BroadcastBestPractice項(xiàng)目的根目錄下衷掷,生成一個(gè)隱藏的.git文件夾,這個(gè)文件夾就是用來(lái)記錄本地所有的Git操作的柿菩,可以通過(guò)ls -al命令查看一下
2.提交本地代碼
代碼倉(cāng)庫(kù)建立完之后就可以提交代碼了戚嗅,其實(shí)提交代碼的方法也非常簡(jiǎn)單,只需要使用add和commit命令就可以了枢舶。
add用于把想要提交的代碼先添加進(jìn)來(lái)懦胞。
commit則是真正地去執(zhí)行提交操作。
git add build.gradle:添加文件凉泄。
git add app:添加目錄躏尉。
git add .:一次性把所有文件都添加進(jìn)來(lái)。
git commit -m "First commit"
注意;commit命令的后面后众,我們一定要通過(guò)-m參數(shù)來(lái)加上提交的描述信息胀糜,沒(méi)有描述信息的提交被認(rèn)為是不合法的颅拦。
Git時(shí)間 --版本控制工具進(jìn)階
準(zhǔn)備工作
準(zhǔn)備工作就是要給一個(gè)項(xiàng)目創(chuàng)建代碼倉(cāng)庫(kù) ,打開(kāi)Git Bash,進(jìn)入到這個(gè)項(xiàng)目的根目錄下面教藻,然后執(zhí)行g(shù)it init命令距帅。
忽略文件
build目錄下的文件都是編譯項(xiàng)目時(shí)自動(dòng)生成的,我們不應(yīng)該將這部分文件添加到版本控制當(dāng)中括堤。
Git提供了一種可配性很強(qiáng)的機(jī)制來(lái)允許用戶將指定的文件或目錄排除在版本控制之外碌秸,它會(huì)檢查代碼倉(cāng)庫(kù)的目錄下是否存在一個(gè)名為.gitignore的文件,如果存在的話悄窃,就去一行行讀取這個(gè)文件中的內(nèi)容讥电,并把每一行指定的文件或目錄排除在版本控制之外。注意.gitignore中指定的文件或目錄是可以使用“*”通配符的轧抗。
我們并不需要自己去創(chuàng)建.gitignore文件,Android Studio在創(chuàng)建項(xiàng)目的時(shí)候會(huì)自動(dòng)幫我們創(chuàng)建出兩個(gè).gitignore文件恩敌,一個(gè)在根目錄下面,一個(gè)在app模塊下面横媚。
首先看一下根目錄下面的.gitignore文件
這是Android Studio自動(dòng)生成的一些默認(rèn)配置潮剪,通常情況下,這部分內(nèi)容都是不用添加到版本控制當(dāng)中的分唾,除了*.iml表示指定任意以.iml結(jié)尾的文件抗碰,其他都是指定的具體的文件名或目錄名,上面配置中的所有內(nèi)容都不會(huì)被添加到版本控制當(dāng)中绽乔,因?yàn)榛径际且恍┯蒊DE自動(dòng)生成的配置弧蝇。
再來(lái)看一下app模塊下面的.gitignore文件
由于app模塊下面基本都是我們編寫(xiě)的代碼,因此默認(rèn)情況下只有其中的build目錄不會(huì)被添加到版本控制當(dāng)中折砸。
當(dāng)然看疗,我們完全可以對(duì)以上兩個(gè)文件進(jìn)行任意的修改,來(lái)滿足特定的需求睦授。
/build
/src/test
/src/androidTest
然后在依次執(zhí)行:
git add .
git commit -m "First commit."
查看修改內(nèi)容
在進(jìn)行了第一次代碼提交之后两芳,我們后面還可能會(huì)對(duì)項(xiàng)目不斷地進(jìn)行維護(hù)或添加新功能等。比較理想的情況是每當(dāng)完成了一小塊功能去枷,就執(zhí)行一次提交怖辆。但是如果某個(gè)功能牽扯到的代碼比較多,有可能寫(xiě)到后面的時(shí)候我們就已經(jīng)忘記前面修改了什么東西了删顶。遇到這種情況時(shí)不用擔(dān)心竖螃,Git全都幫你記著呢!
查看文件修改情況的方法非常簡(jiǎn)單逗余,只需要使用status命令就可以了特咆。
git status
然后Git會(huì)提示目前項(xiàng)目中沒(méi)有任何可提交的文件,因?yàn)槲覀儎倓偛盘峤贿^(guò)嘛录粱。
//values.put("price",22.85);
values.put("price",55.55);
這里僅僅是在添加數(shù)據(jù)的時(shí)候腻格,將書(shū)的價(jià)格由22.85改成了55.55画拾。然后重新輸入git status命令。
可以看到菜职,Git提醒我們MainActivity.java這個(gè)文件已經(jīng)發(fā)生了更改碾阁,那么如何才能看到更改的內(nèi)容呢?這就需要借助diff命令了些楣。
git diff
這樣可以查看到所有文件的更改內(nèi)容,如果你只想查看MainActivity.java這個(gè)文件的更改內(nèi)容
git diff app/src/main/java/com/example/providertest/MainActivity.java
減號(hào)代表刪除的部分
加號(hào)代表添加的部分
從圖中我們就可以明顯的看到宪睹,書(shū)的價(jià)格由22.85被修改成了55.55
撤銷(xiāo)未提交的修改
只要代碼還未提交愁茁,所有修改的內(nèi)容都是可以撤銷(xiāo)的
上一小節(jié)中我們修改了MainActivity里一本書(shū)的價(jià)格,現(xiàn)在如果想要撤銷(xiāo)這個(gè)修改就可以使用checkout命令亭病,
git checkout app/src/main/java/com/example/providertest/MainActivity.java
執(zhí)行了這個(gè)命令之后鹅很,我們對(duì)MainActivity.java這個(gè)文件所做的一切修改就應(yīng)該都被撤銷(xiāo)了。
重新運(yùn)行git status命令檢查一下罪帖。
可以看到促煮,當(dāng)前項(xiàng)目中沒(méi)有任何可提交的文件,說(shuō)明撤銷(xiāo)操作確實(shí)是成功了整袁。
不過(guò)這種撤銷(xiāo)方式只適用于那些還沒(méi)有執(zhí)行過(guò)add命令的文件菠齿,如果某個(gè)文件已經(jīng)被添加過(guò)了,這種方式就無(wú)法撤銷(xiāo)其更改的內(nèi)容坐昙。
首先仍然是將MainActivity中那本書(shū)的價(jià)格改成55.55绳匀,輸入git add .
這樣就把所有修改的文件都進(jìn)行了添加,可以輸入git status來(lái)檢查一下炸客。
再執(zhí)行一遍checkout命令疾棵,你會(huì)發(fā)現(xiàn)MainActivity仍然是處于已添加狀態(tài),所修改的內(nèi)容無(wú)法撤銷(xiāo)掉痹仙。
對(duì)于已添加的文件我們應(yīng)該先對(duì)其取消添加是尔,然后才可以撤回提交。取消添加使用的是reset命令开仰。
git reset HEAD app/src/main/java/com/example/providertest/MainActivity.java
在運(yùn)行一遍git status命令拟枚,你就會(huì)發(fā)現(xiàn)MainActivity.java這個(gè)文件重新變回了未添加狀態(tài),當(dāng)時(shí)就可以使用checkout命令來(lái)將修改的內(nèi)容進(jìn)行撤銷(xiāo)了众弓。
查看提交記錄
當(dāng)ProviderTest這個(gè)項(xiàng)目開(kāi)發(fā)了幾個(gè)月之后梨州,我們可能已經(jīng)執(zhí)行過(guò)上百次的提交操作了,這個(gè)時(shí)候估計(jì)你早就已經(jīng)忘記每次提交都修改了哪些內(nèi)容田轧。不過(guò)沒(méi)關(guān)系暴匠,忠實(shí)的Git一直都幫我們清清楚楚地記錄著呢!可以使用log命令查看歷史提交信息傻粘。
git log
每次提交記錄都會(huì)包含提交id,提交人每窖,提交日期以及提交描述這4個(gè)信息帮掉。那么我們?cè)俅螌?shū)架修改成55.55,
git add .
git commit -m "Change price."
當(dāng)提交記錄非常多的時(shí)候窒典,如果我們只想查看其中一條記錄蟆炊,我們?cè)诿钪兄付ㄔ撚涗浀膇d,并加上-1參數(shù)表示我們只想看到一行記錄瀑志。
git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1
如果想要查看這條提交記錄具體修改了什么內(nèi)容涩搓,可以在命令中加入-p參數(shù)
git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1 -p
Git時(shí)間---版本控制工具的高級(jí)用法
分支的用法
分支是版本控制工具中比較高級(jí)且比較重要的一個(gè)概念,它主要的作用就是在現(xiàn)有代碼的基礎(chǔ)上開(kāi)辟一個(gè)分叉口劈猪,使得代碼可以在主干線和分支線上同時(shí)進(jìn)行開(kāi)發(fā)昧甘,且相互之間不會(huì)影響。
分支的英文名是branch,如果想要查看當(dāng)前的版本庫(kù)當(dāng)中有哪些分支战得,可以使用git branch這個(gè)命令充边。
由于目前LBSTest項(xiàng)目中還沒(méi)有創(chuàng)建過(guò)任何分支,因此只有一個(gè)master分支存在常侦,這也就是前面所說(shuō)的主干線浇冰。接下來(lái)我們嘗試創(chuàng)建一個(gè)分支:
可以看到果然有一個(gè)叫做version1.0的分支出現(xiàn)了。你會(huì)發(fā)現(xiàn)聋亡,master分支的前面有一個(gè)"*"號(hào)肘习,說(shuō)明目前我們的代碼還是在master分支上的,只需要使用checkout命令就能切換到version1.0分支上坡倔。
再次輸入git branch來(lái)進(jìn)行檢查井厌。
我們已經(jīng)成功把代碼切換到version1.0這個(gè)分支上了。
需要注意的是致讥,在version1.0分支上修改并提交的代碼將不會(huì)影響到master分支仅仆。同樣的道理,在master分支上修改并提交的代碼也不會(huì)影響到version1.0分支垢袱。因此墓拜,如果我們?cè)趘ersion1.0分支上修改了一個(gè)bug,在master分支上這個(gè)bug是仍然存在的请契。這時(shí)將修改的代碼一行行復(fù)制到master分支上顯然不是一種聰明的做法咳榜,最好的辦法就是使用merge命令來(lái)完成合并操作。
僅僅這樣簡(jiǎn)單的兩行命令爽锥,就可以把在version1.0分支上修改并提交的內(nèi)容合并到master分支上了涌韩。當(dāng)然,在合并分支的時(shí)候還有可能出現(xiàn)代碼沖突的情況氯夷,這個(gè)時(shí)候你就需要靜下心來(lái)慢慢地找出并解決這些沖突臣樱,Git在這里就無(wú)法幫助到你了。
最后,當(dāng)我們不再需要version1.0這個(gè)分支的時(shí)候雇毫,可以使用如下命令將這個(gè)分支刪除掉:
11.5.2 與遠(yuǎn)程版本庫(kù)協(xié)作
如果你是一個(gè)人在開(kāi)發(fā)玄捕,那么使用版本控制工具就遠(yuǎn)遠(yuǎn)無(wú)法發(fā)揮出它真正強(qiáng)大的功能。所有版本控制工具最重要的一個(gè)特點(diǎn)就是可以使用它來(lái)進(jìn)行團(tuán)隊(duì)合作開(kāi)發(fā)棚放。
比如說(shuō)現(xiàn)在有一個(gè)遠(yuǎn)程版本庫(kù)的Git地址是https://github.com/example/test.git,就可以使用如下命令將代碼下載到本地:
git clone https://github.com/example/test.git
之后你在這份代碼的基礎(chǔ)上進(jìn)行了一些修改和提交枚粘,需要借助push命令來(lái)完成把本地修改的內(nèi)容同步到遠(yuǎn)程版本庫(kù)上。
git push origin master
其中origin部分指定的是遠(yuǎn)程版本庫(kù)的Git地址飘蚯,master部分指定的是同步到哪一個(gè)分支上馍迄,上訴命令就完成了將本地代碼同步到https://github.com/example/test.git這個(gè)版本庫(kù)的master分支上的功能。
知道了將本地的修改同步到遠(yuǎn)程版本庫(kù)上的方法局骤,接下來(lái)我們看一下如何將遠(yuǎn)程版本庫(kù)上的修改同步到本地攀圈。Git提供了兩種命令來(lái)完成此功能,分別是fetch和pull庄涡,fetch的語(yǔ)法規(guī)則和pull是差不多的。
git fetch origin master
執(zhí)行這個(gè)命令后搬设,就會(huì)將遠(yuǎn)程版本庫(kù)上的代碼同步到本地穴店,不過(guò)同步下來(lái)的代碼并不會(huì)合并到任何分支上去,而是會(huì)存放到一個(gè)origin/master分支上拿穴,這時(shí)我們可以通過(guò)diff命令來(lái)查看遠(yuǎn)程版本庫(kù)上到底修改了哪些東西:
git diff origin/master
之后再調(diào)用merge命令將origin/master分支上的修改合并到主分支上即可泣洞。
git merge origin/master
而pull命令則是相當(dāng)于將fetch和merge這兩個(gè)命令放在一起執(zhí)行了,它可以從遠(yuǎn)程版本庫(kù)上獲取最新的代碼并且合并到本地默色。
git pull origin master
14.2 Git時(shí)間---將代碼托管到GitHub上
首先是自動(dòng)跳轉(zhuǎn)到GitHub的個(gè)人主頁(yè)
可以點(diǎn)擊Start a project 按鈕來(lái)創(chuàng)建一個(gè)版本庫(kù)球凰。
這里將版本庫(kù)命名mengweather,然后選擇一個(gè)添加Android項(xiàng)目類(lèi)型的.gitignore文件,并使用Apache License 2.0來(lái)作為軟件的開(kāi)源協(xié)議腿宰。
接著點(diǎn)擊Create repository按鈕呕诉,mengweather這個(gè)版本庫(kù)就創(chuàng)建完成了。版本庫(kù)主頁(yè)地址是https://github.com/WuMeng-1993/mengweather
GitHub已經(jīng)自動(dòng)幫我們創(chuàng)建了.gitignore吃度,LICENSE文件甩挫,其中README.md文件中的內(nèi)容可以修改天氣軟件版本庫(kù)主頁(yè)的描述。
創(chuàng)建好版本庫(kù)之后椿每,我們要?jiǎng)?chuàng)建項(xiàng)目了伊者。
在Android Studio新建一個(gè)Android項(xiàng)目。
接下來(lái)的一步非常重要间护,我們需要將遠(yuǎn)程版本庫(kù)克隆到本地亦渗。首先需要知道遠(yuǎn)程版本庫(kù)的Git地址,點(diǎn)擊Clone or download按鈕就能夠看到了汁尺。
進(jìn)入到MengWeather文件下法精,接著輸入git clone git地址 來(lái)把遠(yuǎn)程版本庫(kù)克隆到本地。
看到圖中所給的文字提示就表示克隆成功了,可以進(jìn)入到mengweather目錄亿虽,并使用ls - al命令查看一下菱涤。
現(xiàn)在我們需要將這個(gè)目錄中的所有文件全部復(fù)制粘貼到上一層目錄中,這樣就能將整個(gè)MengWeather工程目錄添加到版本控制中去了洛勉。注意.git是一個(gè)隱藏目錄粘秆,在復(fù)制的時(shí)候千萬(wàn)不要漏掉。另外收毫,上一層目錄中也有一個(gè).gitignore文件攻走,我們直接將其覆蓋即可。復(fù)制完之后可以把MengWeather目錄刪除掉此再。
最終的MengWeather的目錄結(jié)構(gòu)如下:
接下來(lái)我們應(yīng)該把MengWeather項(xiàng)目中現(xiàn)有的文件提交到GitHub上面昔搂。
先將所有文件添加到版本控制中:
git add .
然后在本地執(zhí)行提交操作:
git commit -m "First commit."
最后將提交的內(nèi)容同步到遠(yuǎn)程版本庫(kù),也就是GitHub上面:
git push origin master
注意输拇,在最后一步的時(shí)候GitHub要求輸入用戶名和密碼來(lái)進(jìn)行身份校驗(yàn)摘符,這里輸入我們注冊(cè)時(shí)填入的用戶名和密碼就可以了。
這樣就完成同步了策吠。