當前位置:
首頁 > 最新 > Android Studio中的13條Git實踐

Android Studio中的13條Git實踐

Git是一個開源、分散式的版本控制系統,與集中式版本控制系統(如SVN)最大的區別在於每個開發者都會有一個本地倉庫,代碼可以提交到本地,不需要依賴遠程代碼倉庫。Git可用的圖形化界面有很多,除了自帶的Git GUI,還有第三方的SourceTree、TortoiseGit等。Android Studio中也自帶了Git插件,已經基本上能夠滿足工作需求。接下來,我們一起探索Android Studio中Git的使用。

1 創建遠程倉庫

通常一個項目需要創建一個遠程代碼倉庫。我們可以使用GitHub、GitLab、碼雲和碼市等一些代碼託管平台,或者自己也可以使用Gitblit、GitLab等部署一個代碼伺服器。這裡我們在GitHub上創建一個名為GitTest的項目。

我們創建一個空倉庫,不要添加README、.gitignore、license,後續項目有需要再添加進來。因為本地代碼一開始是不存在這些文件的,如果遠程倉庫不是空倉庫,多出了那幾個文件,本地代碼將推送不上來。

2 . gitignore

打開Android Studio創建一個項目,在項目目錄下存在一個.gitignore文件,它是Git的忽略配置文件,在裡面配置不需要進行版本控制的文件或目錄,Git不會跟蹤這些文件或目錄的變化,該文件默認的配置如下:

*.iml

.gradle

/local.properties

/.idea/workspace.xml

/.idea/libraries

.DS_Store

/build

/captures

.externalNativeBuild

同樣,在app模塊下也有一個.gitignore文件,裡面配置忽略了app模塊下的build目錄:

/build

我們可以手動修改這些.gitignore文件來配置忽略的文件和目錄,另外還可以安裝.ignore插件,更加方便地進行操作。

安裝這個插件之後,就可以選擇我們想要忽略的文件或者目錄,點擊右鍵,在彈出的菜單選項中選擇「Add to .gitignore file」,就能在.gitignore文件中增加一行忽略配置。

3 . 提交和推送

下載安裝完Git之後,可以檢查一下在Android Studio中的Git路徑配置是否正確。使用快捷鍵「Ctrl + Alt + S」打開設置,在對話框左側選擇Version Control→Git,打開Git配置,單擊Test按鈕,測試Git路徑是否正確。

Git路徑配置正確後,就可以單擊Android Studio菜單欄VCS→Enable Version Control Integration,在彈出的對話框中,選擇Git。這時就會在項目根目錄下生成一個.git文件夾,Git代碼倉庫創建完成,Android Studio左側視窗中的大部分文件將會變成暗紅色,暗紅色表示這些文件還沒有被Git跟蹤,沒有變成暗紅色的文件是被忽略的文件。

Git管理代碼分為工作區間、暫存區和版本庫三個區域,我們在工作區間寫代碼,寫完之後需要將創建的文件或修改的代碼添加到暫存區,然後才能提交到版本庫,我們不能把工作區間的修改直接提交到版本庫。

接下來就可以完成第一次代碼提交,用滑鼠選中項目根目錄,並單擊滑鼠右鍵,在彈出菜單選項中選擇Git→Add,這時之前暗紅色的文件就會變成綠色,表示這些文件已經被Git跟蹤,添加進Git的暫存區,只有添加進暫存區的文件才能完成提交,實際上這個操作等價於執行git add命令。

然後同樣選擇項目根目錄,單擊滑鼠右鍵,操作Git→Commit Directory,提交目錄,這時就會彈出一個對話框來確認提交內容,我們必須輸入提交信息,如圖

表明這次提交所做的工作,然後將滑鼠放在按鈕Commit上,這時會彈出Commit(提交)、Commit and Push(提交並推送)、Create Patch(創建補丁)三個選項,我們可以選擇「Commit」提交代碼到本地後面再進行推送,也可以選擇「Commit and Push」提交並推送。選擇提交並推送時,會彈出對話框,讓我們設置遠程代碼倉庫的地址。

遠程倉庫默認的名字是origin,URL就是我們之前創建遠程倉庫的地址,配置好之後,單擊Push按鈕進行推送,代碼就會上傳到遠程代碼倉庫。提交之後,文件又變回普通的黑色。

當我們再次修改代碼進行提交時,就不用上述這麼麻煩了,可以直接單擊工具欄中的提交按鈕,完成第二次提交和推送即可。提交和推送對應Git命令為:git commit和git push。

4 . 分支

分支由一個個提交按時間順序串聯起來,分支與分支之間就像平行線,合併兩個分支才會出現交叉的情況。創建Git倉庫時,默認創建的分支是主分支master分支,當我們第一次推送時,實際上就是將本地master分支推送到遠程代碼倉庫,這時遠程代碼倉庫也有了一個分支,叫origin/master。在Android Studio右下角的狀態欄裡面有一個Git:master選項,表示當前所在分支為master分支,單擊它會彈出一個對話框,如圖所示。

我們可以單擊「New Branch」創建一個新的分支,命名為develop,創建完成之後,我們就切換到新的分支了。這裡需要注意的是,這個新分支只有本地代碼倉庫有,如果想要把該分支保存遠程代碼倉庫,還需要執行推送操作:VCS→Git→Push。

我們也可以選擇對話框裡面的分支,完成分支的切換、刪除等操作。

如上圖所示,當前分支是develop分支,單擊Local Branches中的master分支,也就是本地的master分支,如果在彈出的選項中選擇Checkout,我們就從當前的develop分支切換到master分支,如果選擇Delete就刪除了本地master分支,但是遠程的master分支並沒有刪除。如果想要刪除遠程master分支,則選擇Remote Branches中的origin/master分支進行刪除操作,同樣地,刪除了遠程master分支,本地master分支不會被刪除。

5 . 獲取(Fetch)

Fetch就是獲取當前分支對應的遠程分支最新的提交記錄,可以簡單地理解為同步遠程分支的更新。因為在團隊開發中,一個分支可能有多個開發者提交推送,那麼我們本地保存的遠程分支的提交記錄就有可能不是最新的,所以可以通過Fetch來進行更新。操作為:單擊菜單欄VCS→Git→Fetch。操作之後可以在Android Studio底部的Version Control中查看提交Log,就可以看到遠程master分支,即origin/master分支其他開發者的提交記錄,如下圖,可以看出來origin/master分支比本地master分支多出一個提交記錄。獲取對應的Git命令為git fetch。

6 . 拉取(Pull)

Pull就是獲取當前本地分支對應遠程分支的更新,然後將這些更新合併到本地分支上。實際上就是Fetch之後再Merge,操作為:單擊菜單欄VCS→Git→Pull。操作之後的效果如下。

本地master分支和origin/master分支都處於同一個提交記錄上,也就是本地master分支合併了origin/master分支的一個提交記錄。拉取對應的Git命令為git pull。

7 . 衍合(Rebase)

上節描述的拉取實際上是一種理想情況,origin/master分支和本地master分支只存在一個提交的差別,即origin/master分支比master分支多一個提交,那麼合併起來是非常輕鬆的。但在實際工作中,通常是本地master分支多了幾個提交是origin/master分支沒有的,而origin/master分支也有其他開發者的提交是本地master分支沒有的,這種情況怎麼處理呢?

假設本地master分支多了一個第三次提交,而origin/master分支多了一個其他開發者的提交。這時本地master分支是無法將第三次提交推送到遠程代碼倉庫的。如果強行推送,則會彈出一個拒絕的對話框。

對話框中會提示在推送之前需要先合併遠程分支的變化。也就是本地master分支需要先合併origin/master分支的其他開發者的提交,然後才能進行推送。

如果選擇Merge,就會合併遠程分支的提交,然後再進行推送,結果如下。

從上圖中可以看出來,從第二次提交開始出現了分叉,叉出來的分支實際上是origin/master分支,到最後本地master和遠程master又合到了一個提交。當然這樣也沒有多大問題,但如果分支較多,提交記錄較多,出現分叉太多則會讓整體提交記錄的閱讀變得困難,在出現一些問題時難以梳理。為了避免出現分叉,我們可以選擇「拒絕對話框」中的Rebase按鈕進行衍合。衍合的作用就是將遠程分支的最新的提交作為起點,再將本地分支新的提交添加在後面,衍合之後提交的記錄就是一條直線,如下。

雖然Rebase能夠讓提交記錄更加整潔,但當Rebase多個提交出現衝突時,很可能每個提交都要解決一次衝突,而使用Merge只需要解決一次衝突即可。

8 . Git Flow

Git Flow是團隊使用Git的一套流程和規範,主要規定了各個分支的作用。

master分支:master分支為主分支,該分支隨時可以發布正式版本,所以對於穩定性的要求最高。

develop分支:develop分支從master分支拉出,所有新的功能和修改都會提交到該分支。

feature分支:feature分支從develop分支拉出,在一個feature分支上完成一個功能的開發,然後合併到develop分支,feature分支的命名最好可以描述該分支完成的功能。

release分支:當一個開發周期快要結束,所有feature分支都合併到develop分支後,就要開始準備發布版本了,這時需要從develop分支拉出一個release分支,release分支可命名為release-(版本號),然後使用release分支上的代碼做產品測試,將bug的修復提交到release分支。當release分支測試完成後,需要合併到master分支和develop分支。

hotfix分支:當產品上線後出現重大bug,需要緊急修復並發布新版本時,可以從master分支拉出一個hotfix分支,可命名為hotfix-(版本號),在hotfix完成bug修改提交後,再將hotfix分支合併到master分支和develop分支,最後在master分支發布一個新的版本。

SourceTree提供了Git Flow的GUI的支持,Android Studio自帶的Git插件雖然不支持,但我們可以自己完成這些分支的創建和合併等操作,另外,也可以安裝Git Flow Integration插件。

9 . 分支合併

如果使用Git Flow進行開發管理,那麼在開發過程中會存在大量的分支合併操作,比如當一個feature分支完成開發就要合併到develop分支上。首先,我們切換到本地develop分支,因為develop分支是公共分支,其他開發者也會在上面合併代碼,所以有必要拉取一下遠程develop分支,確保本地develop和遠程develop分支同步。這時再選擇要合併的feature分支,單擊右鍵,選擇Merge,完成合併操作。

當然合併的時候可能出現代碼衝突,如果出現代碼衝突則會彈出一個對話框,如圖。

我們一般來說會單擊Merge,檢查一下衝突的地方如下圖。左邊為develop分支的修改,中間為合併後的結果,右邊為feature分支的修改,按照實際情況進行取捨,保證中間的結果是我們想要的。

這裡需要注意的是,develop分支在合併feature分支時,不要選擇Rebase on去衍合feature分支。這裡有一條衍合的黃金原則:公共分支(master和develop)不要去衍合其他分支,否則會存在潛在的風險,具體原因可查看https://www.atlassian.com/git/tutorials/merging-vs-rebasing# the-golden-rule-of-rebasing。

10 . 移動HEAD

HEAD指向的是某個分支某次提交,HEAD在哪裡,那麼我們在Android Studio中看到的代碼就是某個提交的代碼狀態。有時候我們需要切換到某個提交下面查看當時的代碼狀態是怎麼樣的,那麼就可以移動HEAD到那次提交上。在Android Studio的提交記錄中,有一個黃色的小標籤表示HEAD所在的位置。下圖中,HEAD當前指向的是feature分支的「完成一個feature開發」的提交上,如果想要移動到之前某一個提交,則選擇要移動到的提交記錄上,單擊滑鼠右鍵,在彈出的菜單選項中選擇「Checkout Revision」即可。

11 貯藏(Stash)

在開發中可能遇到這樣的情況,我們在一個分支上做開發,這時突然接到任務要切換到其他分支修復一個bug,但當前分支的開發並沒有做好,所以還不能提交,如果強行切換分支,那麼我們的修改將會丟失,這可怎麼處理呢?我們可以先將修改進行保存,也就是Stash,等處理完其他任務切換回來時,再將之前保存的修改應用即可。

例如,我們在feature分支上做了一些修改但並沒有提交,這時切換到develop分支,可以選擇菜單欄VCS→Git→Stash Changes,這時會彈出一個對話框。我們可以在Message編輯框描述一下保存的內容,然後點擊Create Stash去創建一個儲藏,就可以順利切換到develop分支。

當從develop分支切回feature分支,想要恢復之前feature分支的修改時,選擇菜單欄VCS→Git→UnStash Changes,彈出的對話框如下,選擇之前保存的Stash應用即可。

12 重置(Reset)

在開發過程中,由於某些原因,我們想要撤銷之前的提交記錄,回到之前的某個提交記錄上,我們可以選擇重置。例如,我們在feature分支做了一個提交「待重置」,然後想重置到上一次提交「完成一個feature開發」,這時可以用滑鼠選中「完成一個feature」開發的提交,單擊右鍵,如下,在彈出的選項中選擇「Rest Current Branch to Here...」

彈出一個對話框,我們有四種選擇:Soft、Mixed、Hard、Keep。無論選擇哪個,「待重置」這個提交記錄都將刪除,但這個提交修改的文件內容不一定會刪除。

Soft

文件內容不會變化,之前提交記錄的修改還是在暫存區,可以直接再提交一次。

Mixed

文件內容不會變化,之前提交記錄的修改不在暫存區,需要添加到暫存區才能提交。

Hard

文件會回滾到我們選定的提交記錄的代碼狀態,之前提交記錄的修改和還沒來得及提交的修改都會丟失。

Keep

文件會回滾到我們選定的提交記錄的代碼狀態,之前提交記錄的修改會丟失,但還沒來得及的提交的修改可以儲藏(Stash)起來,待重置之後反儲藏(Unstash)恢復。

事實上在Android Studio中進行操作,Soft和Mixed沒有太大區別,因為我們單擊提交按鈕時,不在暫存區的修改會自動添加到暫存區然後進行提交。但如果使用Git命令行,則必須先使用git add,然後再使用git commit。

13 . 遴選(Cherry Pick)

遴選(Cherry Pick)就是將某個分支某個提交的修改應用到當前分支,作為一次新的提交。Cherry Pick直譯過來為摘櫻桃,非常形象生動。例如,我們在feature分支上想要「摘取」一個develop分支的提交,可以使用滑鼠選擇develop分支,單擊右鍵,在彈出的選項中選擇Cherry Pick。

GIF

相關圖書

《Android應用開發進階》

您可以複製這條信息¥BkhT0GTOXVr¥後打開淘寶天貓APP了解本書詳情。


您閱讀的專業智庫

喜歡請分享至朋友圈


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 博文視點Broadview 的精彩文章:

5本書抓住AR/VR浪潮

TAG:博文視點Broadview |