歡迎訪(fǎng)問(wèn)我的個(gè)人博客轉(zhuǎn)發(fā)請(qǐng)注明出處:http://www.wensibo.top/2017/03/12/GitOnAS/
</br>
前言
本文較長(zhǎng),圖片很多很多,流量黨慎入
使用Git已經(jīng)有一段時(shí)間了,但是之前都是使用Git Bash,在Android Studio上使用Git一開(kāi)始不是很習(xí)慣,就像用慣了SVN來(lái)使用Git一樣,琢磨了一段時(shí)間的Android Studio,也看了我覺(jué)得為數(shù)不多但是很有質(zhì)量的介紹AS的書(shū)籍 《Android Studio實(shí)戰(zhàn) 快速、高效地構(gòu)建Android應(yīng)用》,強(qiáng)烈安利大家哦!所以就寫(xiě)了這篇文章跟大家一起學(xué)習(xí)如何在Android Studio高效地使用Git。另外如果大家想要拿來(lái)學(xué)習(xí)的話(huà)可以直接fork我的項(xiàng)目 。
另外一點(diǎn)需要說(shuō)明的就是本文中大量使用Android Studio的快捷鍵,如果你不熟悉,可以看看我的另外一篇文章 。
安裝Git
我使用的是Windows,所以我這里只能介紹Windows下安裝Git的過(guò)程了。
點(diǎn)這里選擇符合你的版本,直接安裝就行了。
安裝完成之后,在開(kāi)始菜單中找到Git-->Git Bash,如果出現(xiàn)類(lèi)似下面的對(duì)話(huà)框的話(huà)就證明安裝成功了。

安裝成功之后,需要配置一下你的信息,直接在上面的命令行中輸入以下命令:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意:
1.將上方的Your Name換成你自己的名字,隨意起都行。
2.將上方的email@example.com換成你自己的郵箱。
3.講一下git config命令的--global參數(shù),用了這個(gè)參數(shù),表示你這臺(tái)機(jī)器上所有的Git倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉(cāng)庫(kù)指定不同的用戶(hù)名和Email地址。
Android Studio配置Git
使用快捷鍵Ctrl+Alt+S打開(kāi)Settings,接著點(diǎn)擊Version Control --> Git在Path To Git Executable上輸入Git的存放位置,如下圖:

之后點(diǎn)擊旁邊的Test按鈕,如果出現(xiàn)如下的成功提示,說(shuō)明Git配置成功。

接著按照下圖配置你的Github賬號(hào)密碼,輸入完成之后點(diǎn)擊Test按鈕,如果賬號(hào)密碼都正確的話(huà)就會(huì)提示成功,那么就可以繼續(xù)往下走了:

創(chuàng)建本地倉(cāng)庫(kù)
不管你是剛剛新建的項(xiàng)目,亦或是已經(jīng)寫(xiě)好的項(xiàng)目,進(jìn)行的操作都是一樣的。
這里我以新建一個(gè)名為MyGit的項(xiàng)目為例子,如果你想練習(xí),也可以到這里fork一下。
對(duì)于一個(gè)已經(jīng)新建好的項(xiàng)目,找到菜單欄上的VCS,按照下圖進(jìn)行操作:

選擇項(xiàng)目的根目錄為git初始化的目錄:

初始化之后你會(huì)發(fā)現(xiàn)原本文件的文件名都是白色的,現(xiàn)在變成了棕色,這表示文件已經(jīng)被git跟蹤了,但是并沒(méi)有添加到倉(cāng)庫(kù)中:

忽略文件
我們知道,在git初始化一個(gè)倉(cāng)庫(kù)的時(shí)候會(huì)自動(dòng)生成一個(gè).gitignore文件,這個(gè)文件用來(lái)忽略那些不用加入到倉(cāng)庫(kù)的文件,在我們這個(gè)工程中總共生成了兩個(gè).gitignore文件,分別是在項(xiàng)目根目錄下,以及在app文件夾下。我們可以對(duì)這些文件進(jìn)行編輯,表示我們需要忽略哪些文件,但是一般情況下,我們選擇默認(rèn)就好,除非你有需要就進(jìn)行適當(dāng)?shù)男薷模?/p>

添加文件
添加文件就如git命令中的git add,在Android Studio中add的方式有四種,但是都是大同小異,讓我來(lái)一一舉例:
1.選中項(xiàng)目的根目錄,右鍵選中Git,再選中Add,如下圖:

2.選中項(xiàng)目根目錄,點(diǎn)擊菜單欄中的VCS菜單,選中Git-->Add,如下圖:

3.使用快捷鍵
Alt+9,或者點(diǎn)擊屏幕下方的Version Control工具按鈕打開(kāi)版本控制的窗口,可以看到應(yīng)該是如下圖的樣子,該窗口有兩個(gè)下拉欄,一個(gè)是Default,用來(lái)記錄已經(jīng)添加的文件,另一個(gè)是Unversioned files,用來(lái)記錄已經(jīng)被跟蹤但是未添加的文件。

右鍵Unversioned files,選中Git-->Add,如下圖:

4.使用快捷鍵
Ctrl+Alt+A
add之后文件名變成了綠色,這是代表已經(jīng)添加進(jìn)倉(cāng)庫(kù)為文件,接下來(lái)就可以commit文件了,使用快捷鍵Ctrl+K或者選中工程根目錄右鍵Git-->Commit Directory可以調(diào)出commit窗口,如下所示,在其中選擇你想要提交的文件,填寫(xiě)提交的信息,在Author文本框中可以填寫(xiě)提交此次提交的操作者名字,如果不填寫(xiě)的話(huà),就會(huì)默認(rèn)是之前配置Github賬號(hào)的用戶(hù)名??梢钥吹剑峤恢笪募匦伦兓亓耸煜さ?strong>白色。

提交成功之后,你可以使用快捷鍵
Alt+9,或者點(diǎn)擊屏幕下方的Version Control工具按鈕,切換到Log菜單查看Log日志,如下圖所示:
如何clone項(xiàng)目
使用Git clone項(xiàng)目到本地中是很簡(jiǎn)單的,在Android Studio中也是如此,首先找到你喜歡的項(xiàng)目,fork到你自己的倉(cāng)庫(kù)之后,點(diǎn)擊Clone or Download按鈕,復(fù)制地址,如下圖所示:

接下來(lái)回到Android Studio,按照下圖的操作可以打開(kāi)clone的對(duì)話(huà)框,在地址欄中粘貼剛才復(fù)制的地址,點(diǎn)擊Test按鈕,測(cè)試是否可以通過(guò),如果成功,那么久可以點(diǎn)擊Clone導(dǎo)入項(xiàng)目了。


** 回到我們最開(kāi)始講的MyGit項(xiàng)目,首先我們需要模仿一下在日常開(kāi)發(fā)中使用Git的情形,例如我們經(jīng)常會(huì)在分支上進(jìn)行工作,所以熟練地掌握分支工作的流程以及技巧是十分重要的,接下來(lái)我會(huì)使用具體的例子跟大家一起了解如何在Android Studio上使用分支進(jìn)行開(kāi)發(fā)。
以下舉得例子將會(huì)圍繞Git的一種工作模式,即:Git Flow,如果你對(duì)此不是很了解,那么推薦你阮一峰老師的文章 。**
Git flow
Git flow是廣泛采用的一種工作流程

他的主要特點(diǎn)有兩個(gè):
1.首先,項(xiàng)目存在兩個(gè)長(zhǎng)期分支
- 主分支master
- 開(kāi)發(fā)分支dev
前者用于存放對(duì)外發(fā)布的版本,任何時(shí)候在這個(gè)分支拿到的,都是穩(wěn)定的分布版;后者用于日常開(kāi)發(fā),存放最新的開(kāi)發(fā)版。
2.其次,項(xiàng)目存在三種短期分支
- 功能分支(feature branch)
- 補(bǔ)丁分支(hotfix branch)
- 預(yù)發(fā)分支(release branch)
新增功能1——顯示Hello World
正如我們?cè)诮榻BGit flow介紹的,master分支只是用于產(chǎn)品的發(fā)布,在平時(shí)的開(kāi)發(fā)中是不會(huì)使用它的,而只會(huì)使用dev分支,但是如果我們有了新的功能,一般是會(huì)在dev分支中在創(chuàng)建一條該功能的分支,所以我們應(yīng)該這樣做。
創(chuàng)建dev、feature-1分支,并且我們需要轉(zhuǎn)到feature-1分支上
在Android Studio中,我們可以很方便的管理分支,在主界面的右下角,點(diǎn)擊Git可以出現(xiàn)當(dāng)前的分支,默認(rèn)為master,我們選中New Branch,如下圖所示:

在彈出的對(duì)話(huà)框中我們輸入
feature-1,點(diǎn)擊OK,這樣我們不僅新建了feature-1分支,并且正處于該分支中,接下來(lái)按照同樣的方法創(chuàng)建dev分支,如果不出意外的話(huà),我們現(xiàn)在應(yīng)該是處于dev分支上,但是因?yàn)槲覀儸F(xiàn)在要開(kāi)發(fā)功能1,所以必須轉(zhuǎn)換到feature-1分支上,按照下圖的操作,我們能夠回到feature-1分支上。
接下來(lái)打開(kāi)Log,我們應(yīng)該能夠看到如下的情景:

可以看到我們現(xiàn)在有三個(gè)分支:master、dev、feature-1,但是AS提示我們應(yīng)該有四條分支,其實(shí)HEAD就是當(dāng)前活躍分支的游標(biāo)。形象的記憶就是:你現(xiàn)在在哪兒,HEAD 就指向哪兒,所以 Git 才知道你在那兒!不過(guò) HEAD 并非只能指向分支的最頂端,實(shí)際上它可以指向任何一個(gè)節(jié)點(diǎn),它就是 Git 內(nèi)部用來(lái)追蹤當(dāng)前位置的標(biāo)記。我們可以使用下面的圖來(lái)演示當(dāng)前分支的情況:

完成功能1
/**
* feature-1
* display HelloWorld
* @param view
*/
public void feature1(View view) {
if (btn_feature_1.getText().toString().equals("功能1")) {
btn_feature_1.setText(R.string.feature_1_dis);
} else {
btn_feature_1.setText(R.string.feature_1);
}
}
好了,功能1編寫(xiě)完成,那么就提交吧!老方法:Ctrl+K進(jìn)行提交,按照下圖填寫(xiě)提交信息,每一次的提交信息最好能夠詳細(xì)并且格式規(guī)范,這樣以后再查看Log的時(shí)候就會(huì)比較方便。

點(diǎn)擊Commit按鈕提交完畢之后,可以看到現(xiàn)在的log圖變成了下圖:

我們可以打開(kāi)Log圖的右側(cè),他列出了目前正在被Git跟蹤的所有文件,我們選中MainActivity.java,點(diǎn)擊上邊的第二個(gè)按鈕
Show Diff(顯示差異):
在彈出的界面中可以顯示該文件的當(dāng)前版本和master分支中的該文件的差異,我們可以使用
Esc快捷鍵退出該界面,如下圖所示:
將feature-1分支合并到dev分支上
如下圖所示,選中dev分支并選擇checkout:

你會(huì)發(fā)現(xiàn)現(xiàn)在代碼回到了最開(kāi)始的狀態(tài),現(xiàn)在選中feature-1分支并選中merge,準(zhǔn)備將feature-1分支合并到dev分支上:

再來(lái)重新看一下Log圖,他長(zhǎng)下面這樣,可以看到現(xiàn)在feature-1分支已經(jīng)與dev分支合并,并且現(xiàn)在他們是處于同一狀態(tài)的:

最后的最后,我們需要?jiǎng)h除已經(jīng)完成任務(wù)的feature-1分支,以免分支過(guò)多管理混亂。

新增功能2——顯示Hello Android
同樣的道理,我們可以按照如下的步驟這樣做:
1.遷出dev分支,并且新建分支feature-2之后遷出feature-2分支,具體的步驟我就不再演示了,跟上面的是一樣的。
2.開(kāi)始擼代碼。
/**
* feature-2
* display HelloAndroid
* @param view
*/
public void feature2(View view) {
if (btn_feature_2.getText().toString().equals("功能2")) {
btn_feature_2.setText(R.string.feature_2_dis);
} else {
btn_feature_2.setText(R.string.feature_2);
}
}
3.使用快捷鍵Ctrl+K提交feature-2的修改,并填寫(xiě)提交信息。

4.切換回dev分支并且合并feature-2分支之后刪除feature-2分支。
如果不出錯(cuò)的話(huà),你的Log應(yīng)該是下面這樣的:

在dev分支上增加功能3——Hello Java
同樣的道理,這里我就不再一一演示,如果按照上面的步驟做的話(huà),最后的Log應(yīng)該是這樣的:

重點(diǎn)來(lái)了,老板說(shuō)了,新開(kāi)發(fā)的功能3不喜歡,需要?jiǎng)h除了功能3,咋辦呢?
這里就需要講到Git的回退了,在Android Studio中提供了兩種回退的方式:Git revert以及Git reset。
Git revert
Git revert可以將版本回退到上一步,但是會(huì)新增一個(gè)提交,他的流程就像下面這幅圖一樣:

1.首先打開(kāi)Log,找到功能3的提交,右鍵選擇復(fù)制哈希碼(Copy Revision Number),如下圖所示:

2.打開(kāi)Android Studio的終端Terminal,他就在Version Control的旁邊,之后輸入以下命令按回車(chē)鍵:
git revert 9c834d8c66598fb132a0cc8e4c1f8c341d058f3e
那一段很復(fù)雜的數(shù)字字母就是我們剛才復(fù)制的哈希碼
如下圖所示:

3.之后終端會(huì)列出此次提交的具體信息,如果確認(rèn)要回退,請(qǐng)輸入
:q保存此次操作并且退出會(huì)話(huà)現(xiàn)在你可以看到,他確實(shí)增加了一次提交,并且回到了上一版的內(nèi)容,Log應(yīng)該是這樣的:

Git reset
相比之下,Git reset就要干脆的多,與Git revert的功能一樣,它也可以將代碼恢復(fù)到上一個(gè)版本,但是不會(huì)新增一次提交,他的流程如下:

因?yàn)槲覀冃枰獎(jiǎng)h除功能3,并且讓Log看起來(lái)并沒(méi)有revert的這一次提交,所以我們應(yīng)該在dev分支上后退兩步,確實(shí)是這樣的對(duì)吧!
1.點(diǎn)擊菜單欄上的VCS-->Git-->Reset HEAD,打開(kāi)對(duì)話(huà)框,在To Commit文本框中輸入HEAD~2,就像下圖這樣:


2.點(diǎn)擊Reset按鈕之后,你可以發(fā)現(xiàn)Log變了,變回原來(lái)那個(gè)熟悉的畫(huà)面了:

master分支上被修改了
突然你發(fā)現(xiàn)你的同事在master分支上提交了兩次,分別是增加了功能1和功能4,但是其中的功能1很顯然HelloWorld被寫(xiě)成了WorldHello,例如這樣的:
/**
* feature-1
* display WorldHello
* @param view
*/
public void feature1(View view) {
btn_feature_1.setText(R.string.feature_1_dis);
}
/**
* feature-4
* display Hello
* @param view
*/
public void feature4(View view) {
btn_feature_4.setText(R.string.feature_4_dis);
}
提交更改,之后Log應(yīng)該是這樣的:

我們依舊用演示圖表示當(dāng)前分支的發(fā)展情況:

Rebase
老板說(shuō)了,master分支只要功能4不需要功能1,而dev分支上的功能1、2全部都要合并到master分支上。那么這個(gè)時(shí)候我們就可以使用rebase了。
git rebase用于把一個(gè)分支的修改合并到當(dāng)前分支?,F(xiàn)在我們切換到master分支,將dev上的做修改加入到master中,所以我們選擇rebase,在Android Studio中提供了功能十分強(qiáng)大的rebase。
1.點(diǎn)擊菜單欄上的VCS-->Git-->Rebase,如下圖所示:

2.在彈出的對(duì)話(huà)框中,我們?cè)贠nto的下拉欄中選中dev分支,表示我們需要將master分支rebase到該分支下。

3.點(diǎn)擊
Rebase之后,你會(huì)發(fā)現(xiàn)Android Studio彈出對(duì)話(huà)框,顯示master分支的兩次提交,需要我們做出選擇,如下圖所示:
4.因?yàn)槲覀儾恍枰猰aster分支上的功能1但是需要功能4,所以在功能1的提交上我們選擇skip(跳過(guò)這個(gè)提交),在提交4上選擇pick(挑選此次這個(gè)提交),點(diǎn)擊
Start Rebasing,我們可以看到又有對(duì)話(huà)框彈出,此次是讓我們對(duì)每個(gè)文件進(jìn)行挑選,如下圖所示:
5.對(duì)于每一個(gè)文件,你可以選擇接受你的那一部分,或者接受另一只分支上的內(nèi)容,又或者你可以點(diǎn)擊Merge對(duì)文件進(jìn)行篩選。我們點(diǎn)擊
Merge按鈕,可以看到有三個(gè)文件呈現(xiàn)在屏幕上。其中中間的文件是最后的結(jié)果,左邊的為當(dāng)前分支master分支,右邊的為dev分支,你還可以發(fā)現(xiàn)在修改過(guò)的每一行中都存在一個(gè)X >>符號(hào),點(diǎn)擊X表示不需要這一行的修改,點(diǎn)擊>>表示接受這一行的修改,我們甚至還可以像在編輯器中那樣復(fù)制、粘貼、編輯內(nèi)容,我們最終作出的選擇如下圖所示,之后可以點(diǎn)擊Apply進(jìn)行保存,如果你不想保存,那就點(diǎn)擊Abort終止此次修改:
6.對(duì)于剩下的兩個(gè)文件也做相同的處理,之后我們可以看到master分支已經(jīng)有了dev分支的功能1和功能2和自身的功能4,并且去掉了自己之前的功能1,可以看一下Log,如下所示:

我們依舊使用演示圖來(lái)表示最后的分支情況:

推送到遠(yuǎn)程倉(cāng)庫(kù)
推送很簡(jiǎn)單,你可以導(dǎo)航到菜單欄VCS-->Import Into Version Control -->Share Project on Github,如下圖所示:

在彈出的對(duì)話(huà)框中填寫(xiě)遠(yuǎn)程倉(cāng)庫(kù)的名稱(chēng),點(diǎn)擊Share:

之后你就可以在你的Github上面看到這一次的推送了。
本地所做的修改如何同步到遠(yuǎn)程倉(cāng)庫(kù)
現(xiàn)在我需要在工程中加入一些文件,例如說(shuō)我新建了一個(gè)screenshots文件夾,并在其中添加了這篇文章需要用到的截圖,那么如何將這些文件一起同步到遠(yuǎn)程倉(cāng)庫(kù)呢?其實(shí)很簡(jiǎn)單。
1.使用快捷鍵Alt+9或者點(diǎn)擊工具按鈕打開(kāi)Version Control,右鍵Unversioned Files,選擇Git-->Add,將所有文件加入Git中,如下圖:

2.右鍵Default,選擇Commit所有的文件之后填寫(xiě)提交信息,如下圖:

3.使用快捷鍵
Ctrl+Shift+K或者右鍵工程根目錄,選擇push項(xiàng)目,如下圖所示:
4.在彈出的對(duì)話(huà)框中點(diǎn)擊
Push按鈕,就可以將所做的修改同步到遠(yuǎn)程倉(cāng)庫(kù)了,如下圖:
5.對(duì)于修改過(guò)的文件想要同步到遠(yuǎn)程倉(cāng)庫(kù),按照同樣的步驟就行了,這里不再贅述了。
后記
這篇文章有點(diǎn)長(zhǎng),圖也很多,我也寫(xiě)了很久,有的時(shí)候思路不清晰也混了(尷尬臉),所以難免會(huì)有錯(cuò)誤,還請(qǐng)大家批評(píng)指正,大家互相學(xué)習(xí),希望你能夠?qū)W到更多Android Studio的知識(shí)。