
Git
常見的版本控制工具主要有svn和Git
Git是一個開源的分布式版本控制工具,它的開發(fā)者就是大名鼎鼎的Linux操作系統(tǒng)的作者Linus Torvalds。Git被開發(fā)出來的初衷是為了更好地管理Linux內(nèi)核,而現(xiàn)在卻早已被廣泛應(yīng)用于全球各種大中小型的項目中。
Git的各種命令是你應(yīng)該掌握的核心技能,不管你是在哪個操作系統(tǒng)上,使用命令來操作Git肯定都是通用的。而圖形化的操作應(yīng)該是在你能熟練掌握命令用法的前提下,進(jìn)一步提升你工作效率的手段。
如果你使用的是Windows操作系統(tǒng),就從開始里面找到Git Bash并打開。
1.配置一下你的身份
然后我們就可以創(chuàng)建代碼倉庫了,倉庫(Repository)是用于保存版本管理所需信息的地方,所有本地提交的代碼都會被提交到代碼倉庫中,如果有需要還可以在推送到遠(yuǎn)程倉庫中。
我們嘗試著給BroadcastBestPractice項目建立一個倉庫。
先進(jìn)入到BroadcastBestPractice項目的目錄下面。
git init
只需要一行命令就可以完成創(chuàng)建代碼倉庫的操作。
倉庫創(chuàng)建完成后,會在BroadcastBestPractice項目的根目錄下,生成一個隱藏的.git文件夾,這個文件夾就是用來記錄本地所有的Git操作的,可以通過ls -al命令查看一下
2.提交本地代碼
代碼倉庫建立完之后就可以提交代碼了,其實提交代碼的方法也非常簡單,只需要使用add和commit命令就可以了。
add用于把想要提交的代碼先添加進(jìn)來。
commit則是真正地去執(zhí)行提交操作。
git add build.gradle:添加文件。
git add app:添加目錄。
git add .:一次性把所有文件都添加進(jìn)來。
git commit -m "First commit"
注意;commit命令的后面,我們一定要通過-m參數(shù)來加上提交的描述信息,沒有描述信息的提交被認(rèn)為是不合法的。
Git時間 --版本控制工具進(jìn)階
準(zhǔn)備工作
準(zhǔn)備工作就是要給一個項目創(chuàng)建代碼倉庫 ,打開Git Bash,進(jìn)入到這個項目的根目錄下面,然后執(zhí)行g(shù)it init命令。
忽略文件
build目錄下的文件都是編譯項目時自動生成的,我們不應(yīng)該將這部分文件添加到版本控制當(dāng)中。
Git提供了一種可配性很強的機制來允許用戶將指定的文件或目錄排除在版本控制之外,它會檢查代碼倉庫的目錄下是否存在一個名為.gitignore的文件,如果存在的話,就去一行行讀取這個文件中的內(nèi)容,并把每一行指定的文件或目錄排除在版本控制之外。注意.gitignore中指定的文件或目錄是可以使用“*”通配符的。
我們并不需要自己去創(chuàng)建.gitignore文件,Android Studio在創(chuàng)建項目的時候會自動幫我們創(chuàng)建出兩個.gitignore文件,一個在根目錄下面,一個在app模塊下面。
首先看一下根目錄下面的.gitignore文件
這是Android Studio自動生成的一些默認(rèn)配置,通常情況下,這部分內(nèi)容都是不用添加到版本控制當(dāng)中的,除了*.iml表示指定任意以.iml結(jié)尾的文件,其他都是指定的具體的文件名或目錄名,上面配置中的所有內(nèi)容都不會被添加到版本控制當(dāng)中,因為基本都是一些由IDE自動生成的配置。
再來看一下app模塊下面的.gitignore文件
由于app模塊下面基本都是我們編寫的代碼,因此默認(rèn)情況下只有其中的build目錄不會被添加到版本控制當(dāng)中。
當(dāng)然,我們完全可以對以上兩個文件進(jìn)行任意的修改,來滿足特定的需求。
/build
/src/test
/src/androidTest
然后在依次執(zhí)行:
git add .
git commit -m "First commit."
查看修改內(nèi)容
在進(jìn)行了第一次代碼提交之后,我們后面還可能會對項目不斷地進(jìn)行維護(hù)或添加新功能等。比較理想的情況是每當(dāng)完成了一小塊功能,就執(zhí)行一次提交。但是如果某個功能牽扯到的代碼比較多,有可能寫到后面的時候我們就已經(jīng)忘記前面修改了什么東西了。遇到這種情況時不用擔(dān)心,Git全都幫你記著呢!
查看文件修改情況的方法非常簡單,只需要使用status命令就可以了。
git status
然后Git會提示目前項目中沒有任何可提交的文件,因為我們剛剛才提交過嘛。
//values.put("price",22.85);
values.put("price",55.55);
這里僅僅是在添加數(shù)據(jù)的時候,將書的價格由22.85改成了55.55。然后重新輸入git status命令。
可以看到,Git提醒我們MainActivity.java這個文件已經(jīng)發(fā)生了更改,那么如何才能看到更改的內(nèi)容呢?這就需要借助diff命令了。
git diff
這樣可以查看到所有文件的更改內(nèi)容,如果你只想查看MainActivity.java這個文件的更改內(nèi)容
git diff app/src/main/java/com/example/providertest/MainActivity.java
減號代表刪除的部分
加號代表添加的部分
從圖中我們就可以明顯的看到,書的價格由22.85被修改成了55.55
撤銷未提交的修改
只要代碼還未提交,所有修改的內(nèi)容都是可以撤銷的
上一小節(jié)中我們修改了MainActivity里一本書的價格,現(xiàn)在如果想要撤銷這個修改就可以使用checkout命令,
git checkout app/src/main/java/com/example/providertest/MainActivity.java
執(zhí)行了這個命令之后,我們對MainActivity.java這個文件所做的一切修改就應(yīng)該都被撤銷了。
重新運行git status命令檢查一下。
可以看到,當(dāng)前項目中沒有任何可提交的文件,說明撤銷操作確實是成功了。
不過這種撤銷方式只適用于那些還沒有執(zhí)行過add命令的文件,如果某個文件已經(jīng)被添加過了,這種方式就無法撤銷其更改的內(nèi)容。
首先仍然是將MainActivity中那本書的價格改成55.55,輸入git add .
這樣就把所有修改的文件都進(jìn)行了添加,可以輸入git status來檢查一下。
再執(zhí)行一遍checkout命令,你會發(fā)現(xiàn)MainActivity仍然是處于已添加狀態(tài),所修改的內(nèi)容無法撤銷掉。
對于已添加的文件我們應(yīng)該先對其取消添加,然后才可以撤回提交。取消添加使用的是reset命令。
git reset HEAD app/src/main/java/com/example/providertest/MainActivity.java
在運行一遍git status命令,你就會發(fā)現(xiàn)MainActivity.java這個文件重新變回了未添加狀態(tài),當(dāng)時就可以使用checkout命令來將修改的內(nèi)容進(jìn)行撤銷了。
查看提交記錄
當(dāng)ProviderTest這個項目開發(fā)了幾個月之后,我們可能已經(jīng)執(zhí)行過上百次的提交操作了,這個時候估計你早就已經(jīng)忘記每次提交都修改了哪些內(nèi)容。不過沒關(guān)系,忠實的Git一直都幫我們清清楚楚地記錄著呢!可以使用log命令查看歷史提交信息。
git log
每次提交記錄都會包含提交id,提交人,提交日期以及提交描述這4個信息。那么我們再次將書架修改成55.55,
git add .
git commit -m "Change price."
當(dāng)提交記錄非常多的時候,如果我們只想查看其中一條記錄,我們在命令中指定該記錄的id,并加上-1參數(shù)表示我們只想看到一行記錄。
git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1
如果想要查看這條提交記錄具體修改了什么內(nèi)容,可以在命令中加入-p參數(shù)
git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1 -p
Git時間---版本控制工具的高級用法
分支的用法
分支是版本控制工具中比較高級且比較重要的一個概念,它主要的作用就是在現(xiàn)有代碼的基礎(chǔ)上開辟一個分叉口,使得代碼可以在主干線和分支線上同時進(jìn)行開發(fā),且相互之間不會影響。
分支的英文名是branch,如果想要查看當(dāng)前的版本庫當(dāng)中有哪些分支,可以使用git branch這個命令。
由于目前LBSTest項目中還沒有創(chuàng)建過任何分支,因此只有一個master分支存在,這也就是前面所說的主干線。接下來我們嘗試創(chuàng)建一個分支:
可以看到果然有一個叫做version1.0的分支出現(xiàn)了。你會發(fā)現(xiàn),master分支的前面有一個"*"號,說明目前我們的代碼還是在master分支上的,只需要使用checkout命令就能切換到version1.0分支上。
再次輸入git branch來進(jìn)行檢查。
我們已經(jīng)成功把代碼切換到version1.0這個分支上了。
需要注意的是,在version1.0分支上修改并提交的代碼將不會影響到master分支。同樣的道理,在master分支上修改并提交的代碼也不會影響到version1.0分支。因此,如果我們在version1.0分支上修改了一個bug,在master分支上這個bug是仍然存在的。這時將修改的代碼一行行復(fù)制到master分支上顯然不是一種聰明的做法,最好的辦法就是使用merge命令來完成合并操作。
僅僅這樣簡單的兩行命令,就可以把在version1.0分支上修改并提交的內(nèi)容合并到master分支上了。當(dāng)然,在合并分支的時候還有可能出現(xiàn)代碼沖突的情況,這個時候你就需要靜下心來慢慢地找出并解決這些沖突,Git在這里就無法幫助到你了。
最后,當(dāng)我們不再需要version1.0這個分支的時候,可以使用如下命令將這個分支刪除掉:
11.5.2 與遠(yuǎn)程版本庫協(xié)作
如果你是一個人在開發(fā),那么使用版本控制工具就遠(yuǎn)遠(yuǎn)無法發(fā)揮出它真正強大的功能。所有版本控制工具最重要的一個特點就是可以使用它來進(jìn)行團(tuán)隊合作開發(fā)。
比如說現(xiàn)在有一個遠(yuǎn)程版本庫的Git地址是https://github.com/example/test.git,就可以使用如下命令將代碼下載到本地:
git clone https://github.com/example/test.git
之后你在這份代碼的基礎(chǔ)上進(jìn)行了一些修改和提交,需要借助push命令來完成把本地修改的內(nèi)容同步到遠(yuǎn)程版本庫上。
git push origin master
其中origin部分指定的是遠(yuǎn)程版本庫的Git地址,master部分指定的是同步到哪一個分支上,上訴命令就完成了將本地代碼同步到https://github.com/example/test.git這個版本庫的master分支上的功能。
知道了將本地的修改同步到遠(yuǎn)程版本庫上的方法,接下來我們看一下如何將遠(yuǎn)程版本庫上的修改同步到本地。Git提供了兩種命令來完成此功能,分別是fetch和pull,fetch的語法規(guī)則和pull是差不多的。
git fetch origin master
執(zhí)行這個命令后,就會將遠(yuǎn)程版本庫上的代碼同步到本地,不過同步下來的代碼并不會合并到任何分支上去,而是會存放到一個origin/master分支上,這時我們可以通過diff命令來查看遠(yuǎn)程版本庫上到底修改了哪些東西:
git diff origin/master
之后再調(diào)用merge命令將origin/master分支上的修改合并到主分支上即可。
git merge origin/master
而pull命令則是相當(dāng)于將fetch和merge這兩個命令放在一起執(zhí)行了,它可以從遠(yuǎn)程版本庫上獲取最新的代碼并且合并到本地。
git pull origin master
14.2 Git時間---將代碼托管到GitHub上
首先是自動跳轉(zhuǎn)到GitHub的個人主頁

可以點擊Start a project 按鈕來創(chuàng)建一個版本庫。

這里將版本庫命名mengweather,然后選擇一個添加Android項目類型的.gitignore文件,并使用Apache License 2.0來作為軟件的開源協(xié)議。
接著點擊Create repository按鈕,mengweather這個版本庫就創(chuàng)建完成了。版本庫主頁地址是https://github.com/WuMeng-1993/mengweather
GitHub已經(jīng)自動幫我們創(chuàng)建了.gitignore,LICENSE文件,其中README.md文件中的內(nèi)容可以修改天氣軟件版本庫主頁的描述。
創(chuàng)建好版本庫之后,我們要創(chuàng)建項目了。
在Android Studio新建一個Android項目。
接下來的一步非常重要,我們需要將遠(yuǎn)程版本庫克隆到本地。首先需要知道遠(yuǎn)程版本庫的Git地址,點擊Clone or download按鈕就能夠看到了。

進(jìn)入到MengWeather文件下,接著輸入git clone git地址 來把遠(yuǎn)程版本庫克隆到本地。

看到圖中所給的文字提示就表示克隆成功了,可以進(jìn)入到mengweather目錄,并使用ls - al命令查看一下。

現(xiàn)在我們需要將這個目錄中的所有文件全部復(fù)制粘貼到上一層目錄中,這樣就能將整個MengWeather工程目錄添加到版本控制中去了。注意.git是一個隱藏目錄,在復(fù)制的時候千萬不要漏掉。另外,上一層目錄中也有一個.gitignore文件,我們直接將其覆蓋即可。復(fù)制完之后可以把MengWeather目錄刪除掉。
最終的MengWeather的目錄結(jié)構(gòu)如下:

接下來我們應(yīng)該把MengWeather項目中現(xiàn)有的文件提交到GitHub上面。
先將所有文件添加到版本控制中:
git add .
然后在本地執(zhí)行提交操作:
git commit -m "First commit."
最后將提交的內(nèi)容同步到遠(yuǎn)程版本庫,也就是GitHub上面:
git push origin master
注意,在最后一步的時候GitHub要求輸入用戶名和密碼來進(jìn)行身份校驗,這里輸入我們注冊時填入的用戶名和密碼就可以了。

這樣就完成同步了。
