一 Git配置和倉庫初始化
下面會(huì)介紹Git的使用优妙,每個(gè)小節(jié)里會(huì)講解各個(gè)功能在命令行中的實(shí)現(xiàn)方式鼠哥,并在每小節(jié)的最后介紹在Android Studio中的圖形界面里怎么使用對應(yīng)的功能嚷兔。
01 Git配置
在安裝完Git后浪秘,會(huì)有一個(gè)叫做Git Bash
的程序狈谊,打開之后會(huì)出現(xiàn)一個(gè)跟Linux命令行操作界面神似的命令行窗口,其中可以輸入各種Git指令和一些Linux指令丧裁。
在使用Git之前煎娇,需要進(jìn)行一步設(shè)置缓呛,在命令行中輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
這兩條指令就相當(dāng)于給自己的電腦取了個(gè)名字痰憎。在之后的每次提交(備份)中怒详,這兩個(gè)屬性都會(huì)被添加到那一次提交生成的提交對象中。在協(xié)同開發(fā)時(shí)善玫,大家可以通過這個(gè)名字來區(qū)分是誰完成了這個(gè)功能茅郎,是誰寫出了那個(gè)Bug或渤。
當(dāng)然Git中可以進(jìn)行的設(shè)置還有很多薪鹦,有興趣的可以查閱git config
這個(gè)命令。另外奔害,--global
這個(gè)參數(shù)表示電腦上的所有倉庫都會(huì)使用這個(gè)名字华临,當(dāng)然你也可以給每個(gè)倉庫指定不同的用戶名和Email地址端考。
在Android Studio中使用Git還需進(jìn)行如下配置却特。
在Android Studio中使用Git需要將安裝完成的Git.exe文件配置到Android Stdudio中裂明。具體步驟如下,首先點(diǎn)擊File->Settings
打開Settings對話框扳碍,接著點(diǎn)擊Version Control->Git
進(jìn)入相應(yīng)目錄,在Path to Git executable
中填入Git.exe
所在位置。之后點(diǎn)擊Test進(jìn)行測試液样,如果彈出成功信息鞭莽,則配置完成麸祷。
02 創(chuàng)建Git倉庫
在Git中阶牍,創(chuàng)建Git倉庫對應(yīng)的指令為git init
走孽,它會(huì)把當(dāng)前目錄初始化為一個(gè)Git倉庫。使用命令行的話盒齿,你可以先把Android工程建好边翁,再是一頓cd
和mkdir
和ls
來到相應(yīng)的目錄硕盹,執(zhí)行git init
來初始化倉庫瘩例,也可以先建立好倉庫,再把工程建在里面创淡,沒毛擦詹省!
如果用Android Studio初始化倉庫碧浊。
首先新建一個(gè)工程箱锐。再點(diǎn)擊VCS->Create Git Repository
劳较,會(huì)彈出一個(gè)對話框观蜗,讓你選擇Git倉庫的初始化目錄墓捻,一般都會(huì)選擇工程的根目錄。注意: 其實(shí)在Android Studio中也可以打命令行撤卢,在底部的Terminal欄目里輸入命令即可凸丸。但是因?yàn)楦鞣N別扭袱院,打命令行還是喜歡用Git bash忽洛。
點(diǎn)擊OK即可完成倉庫的創(chuàng)建欲虚。 在新建Git倉庫之后,會(huì)發(fā)現(xiàn)Android Studio底下多出了一個(gè)Version Control欄目欣喧。在其中可以進(jìn)行許多方便的Git操作唆阿,包括分支的圖形化顯示锈锤,文件狀態(tài)的瀏覽等。細(xì)心的同學(xué)應(yīng)該會(huì)發(fā)現(xiàn)其中的文件是紅色的浅辙,這里的顏色表示了文件的狀態(tài)——文件還沒有被加入到暫存區(qū)中(后面會(huì)具體講暫存區(qū))记舆。
二 用Git備份代碼
我們通常是這么備份代碼的泽腮。第一步盛正,在上一個(gè)備份點(diǎn)繼續(xù)開發(fā)屑埋。第二步,在想要備份的時(shí)候续崖,打個(gè)包严望,存到電腦上像吻,如果怕電腦中病毒癱瘓之類的复隆,可能還會(huì)發(fā)一份到云盤上挽拂,第三步亏栈,繼續(xù)在這一個(gè)備份點(diǎn)上開發(fā),……黎侈。在開發(fā)中蜓竹,考慮到包的大小和一些自動(dòng)生成的配置文件和編譯過程中產(chǎn)生的文件等,會(huì)在上述步驟中再添加一步嘶是。即在備份之前聂喇,把需要的改動(dòng)挑選出來希太,再進(jìn)行備份。
Git備份代碼誊辉,其實(shí)也就是這三步堕澄。
- 在上一個(gè)版本的基礎(chǔ)上繼續(xù)開發(fā)蛙紫,修改代碼坑傅。
- 用
git add
或者git rm
指令喷斋,將需要的改動(dòng)添加到暫存區(qū)(顧名思義星爪,一個(gè)暫存文件的區(qū)域)移必,對應(yīng)上面的挑選改動(dòng)操作崔泵。 - 用
git commit
指令,將暫存區(qū)中的改動(dòng)與上一個(gè)提交(備份)結(jié)合入篮,形成一個(gè)新的提交(備份)潮售,對應(yīng)上述操作中的備份操作酥诽。
注意:這里的改動(dòng)并不單單指對原文件的修改肮帐,也包括創(chuàng)建文件训枢,刪除文件。
01 在本地備份代碼
在Git中用git add
和git rm
操作來添加改動(dòng)到暫存區(qū)睦刃,并用git commit
來生成一個(gè)提交(備份)涩拙。接下來分別介紹添加文件吃环,修改,刪除這三種改動(dòng)添加到到暫存區(qū)的方法和生成一次提交的方法文留。
關(guān)于暫存區(qū)到底是個(gè)什么東西竭沫。
我們把平時(shí)看到的電腦上的目錄叫做工作區(qū),里面是我們實(shí)際操作的文件凝赛。而暫存里面一開始會(huì)包含上個(gè)提交時(shí)的所有文件冠绢,然后我們會(huì)通過git add
和git rm
操作來把工作區(qū)里的改動(dòng)添加到暫存區(qū)猖毫,比如添加新文件到暫存區(qū)吁断,把修改后的文件添加到暫存區(qū)以及刪除暫存區(qū)中的文件。當(dāng)最后提交時(shí)掷伙,Git把暫存區(qū)中的所有文件組織成一棵樹炎咖,再加入時(shí)間乘盼,作者等信息形成一個(gè)commit對象绸栅,再把commit對象與上一次提交生成的commit對象連接起來粹胯,就完成了一次新的提交辰企。(上述表述不是非常嚴(yán)謹(jǐn)額牢贸,大家別太較真潜索,意思懂了就行竹习。Git管理文件的方式與Unix的文件系統(tǒng)類似整陌,想具體了解可以去看Git官網(wǎng)的教程)
在新創(chuàng)建Git倉庫后泌辫,所有文件都還沒有加入到版本控制系統(tǒng)中,當(dāng)前倉庫是空的逃魄。這里有的同學(xué)就奇怪了伍俘?癌瘾?妨退?你不是用git init
在這個(gè)目錄下初始化了Git倉庫嗎咬荷,我這個(gè)目錄下好多文件呢幸乒,你怎么說他是空的呢。>厶啤8瞬椤亲桦!注意烙肺,當(dāng)前目錄下的文件并不屬于Git倉庫!I尘闪檬!在git init
之后购笆,會(huì)在當(dāng)前目錄下生成一個(gè).git
目錄(在windows里這個(gè)目錄隱藏的同欠,設(shè)置了顯示隱藏文件之后可以看到),里面有一個(gè)objects
目錄茎刚,這個(gè)目錄下的文件才是屬于Git倉庫的膛锭。剛初始化的倉庫的objects
目錄有兩個(gè)目錄初狰,一個(gè)info
跷究,一個(gè)pack
俊马,不過里面啥也沒有柴我,都是空的艘儒。
這時(shí)界睁,對于Git來說兵拢,存在了許多新建文件说铃。在命令行中輸入git status
可以查看倉庫的狀態(tài)腻扇,其中的Untracked files
中的內(nèi)容幼苛,就是我們還未添加的改動(dòng)——添加文件。
改動(dòng)類型一:添加文件
在上面的git status
中顯示的untracked files
均是在當(dāng)前版本中還未添加到暫存區(qū)里的文件济锄〖鼍可以用git add <file>
來將他們加入暫存區(qū)低滩。在加入之后用git status
查看倉庫的狀態(tài)恕沫。
$ git add app/src/main/java/com/bigboss/blelock/myapplication/MainActivity.java
$ git status
會(huì)發(fā)現(xiàn)婶溯,多了一段提示迄委,Changes to be committed
(等待提交的改動(dòng))叙身,其中顯示的就是new file
(新文件)信轿。這說明财忽,我們已經(jīng)將需要的改動(dòng)添加到暫存區(qū)了即彪。這個(gè)時(shí)候再去查看.git\objects
目錄祖凫,會(huì)發(fā)現(xiàn)多了一個(gè)文件。
添加完成后用git commit -m "提交信息"
將暫存區(qū)中的內(nèi)容生成一個(gè)提交(備份)宁仔。
$ git commit -m "添加了MainActivity"
用git log
指令可以查看當(dāng)前的提交歷史翎苫〖宓可以看到多了一個(gè)提交呐粘,提交信息就是我們剛才輸入的添加了MainActivity
作岖。從這里也可以看到痘儡,在第一步Git配置時(shí)沉删,設(shè)置的用戶名和郵箱都自動(dòng)添加到了提交信息中矾瑰。
改動(dòng)類型二:刪除文件
在我們刪除文件后脯倚,可以通過git rm <file>
來把暫存區(qū)中的文件也給刪掉推正,從而將改動(dòng)更新到暫存區(qū)植榕。在我們的第一個(gè)版本中尊残,我們添加了一個(gè)新的文件MainActivity.java
寝衫,下面我們把它刪除慰毅,并添加另一個(gè)activity_main.xml
文件(為了方便修改操作的演示)。
在把工作區(qū)中的MainActivity.java
刪除后东臀,運(yùn)行git status
惰赋,Git會(huì)很機(jī)智的告訴我們MainActivity.java
已經(jīng)被刪除了赁濒,但還沒有更新到暫存區(qū)流部。
我們用git rm <file>
將對MainActivity.java
的改動(dòng)更新到暫存區(qū),并添加activity_main.xml
到暫存區(qū)里果漾。
$ git rm app/src/main/java/com/bigboss/blelock/myapplication/MainActivity.java
$ git add app/src/main/res/layout/activity_main.xml
執(zhí)行完成后绒障,用git status
查看倉庫狀態(tài)户辱÷洌可以看到Changes to be commited
里有了deleted和new file兩條改動(dòng)信息必逆。
最后提交一下修改名眉。
$ git commit -m "刪除了MainActivity.java,添加了activity_main.xml"
$ git log
改動(dòng)類型三:修改文件
在我們修改了文件之后损拢,將修改更新到暫存區(qū)的操作也是git add <file>
探橱,這里可能有同學(xué)會(huì)覺得奇怪隧膏,為什么修改文件也用git add
胞枕,add
不是添加文件的意思嗎腐泻,其實(shí)從本質(zhì)上講Git對已修改文件的處理方式就是將修改后的文件整個(gè)加入到暫存區(qū)替換掉原文件派桩,那用add更新修改也就順理成章了铆惑。
現(xiàn)在我在activity_main.xml
的最后加一行modifyTest
员魏,運(yùn)行git status
會(huì)有下面的modified
提示。
我們用git add <file>
來把修改添加到暫存區(qū)虏束,然后查看倉庫狀態(tài)镇匀。
$ git add app/src/main/res/layout/activity_main.xml
$ git status
最后提交一下修改坑律。再用git log
查看一下提交歷史。
$ git commit -m "在activity_main.xml最后加了一行囊骤,modifyTest"
$ git log
提交歷史如下晃择,又生成了一個(gè)提交了哈。
更新所有改動(dòng)到暫存區(qū)并提交
大部分的時(shí)候也物,我們會(huì)把所有的改動(dòng)都更新到緩存區(qū)并提交,可以使用git commit -am "提交信息"
滑蚯,它會(huì)自動(dòng)把所有已經(jīng)跟蹤過的文件暫存起來一并提交浪蹂,包括修改和刪除抵栈,他是git add -u
和git commit -m "提交信息"
的結(jié)合。如果要把全部文件的添加坤次,修改古劲,刪除三種改動(dòng)全部添加到暫存區(qū)去,可以用git add -A
缰猴。
通常我們還需要忽略一些指定的文件产艾,比如在java編譯后生成的.class文件等,這可以通過配置.gitignore文件來完成滑绒。具體見.gitignore的使用這一節(jié)闷堡。
至此,添加三種改動(dòng)到暫存區(qū)的方式就講完了疑故,大家可以組合這三種操作完成各種各樣的任務(wù)杠览!
git status原理
在用git status
查看倉庫狀態(tài)時(shí),經(jīng)常會(huì)看到Untracked files
纵势,Changes not staged for commit
和Changes to be committed
三個(gè)標(biāo)題踱阿。大家大概能知道里面的內(nèi)容是什么意思,但有時(shí)還是會(huì)感到迷惑吨悍。接下來我們會(huì)介紹這三個(gè)標(biāo)題下內(nèi)容的由來扫茅。
這三個(gè)標(biāo)題中的內(nèi)容是根據(jù)三個(gè)文件樹產(chǎn)生的。這三個(gè)文件樹分別為工作區(qū)育瓜,暫存區(qū)和上一個(gè)提交中的文件區(qū)(倉庫剛初始化的時(shí)候葫隙,沒有提交,相當(dāng)于文件樹為空)躏仇。Untracked files
顯示的是工作區(qū)中存在而暫存區(qū)中沒有的文件恋脚,通常為新建的文件,而Changes not staged for commit
里是工作區(qū)中和暫存區(qū)中內(nèi)容不同的文件焰手,通常是因?yàn)樾薷牧宋募忝瑁@示為modified
,以及暫存區(qū)里存在但工作區(qū)里沒有的文件书妻,通常是因?yàn)閯h除了文件船响,顯示為deleted
。而Changes to be committed
里顯示的是暫存區(qū)里有躲履,但是上一次提交中沒有的內(nèi)容见间。
Android Studio中的相應(yīng)操作
先切換到Version Control欄目的子欄目local Changes中,在這里可以看到修改的文件工猜。在里面會(huì)看到兩個(gè)目錄米诉,一個(gè)是Defult,一個(gè)是Unversioned Files篷帅。前者中顯示的是Git命令行中Changes not staged for commit
欄目的對應(yīng)文件史侣,后者中顯示的是未添加到暫存區(qū)的文件拴泌。相比命令行的方式,圖形界面有更方便的方法來生成一個(gè)提交惊橱。用戶可以直接勾選所需添加的改動(dòng)蚪腐,然后直接提交。(Git會(huì)有一個(gè)暫存區(qū)的存在李皇,其中一個(gè)原因就是為了模擬挑選改動(dòng)的行為)削茁。在Android Studio中宙枷,點(diǎn)擊圖中框出的按鈕會(huì)彈出Commit Changes對話框掉房,來進(jìn)行提交操作。
之后可以在彈出的窗口中慰丛,選擇要更新到暫存區(qū)的文件卓囚,填寫提交信息,完成后就按下提交即可完成诅病。
在Version Control的Log子欄目下可以已圖形化的方式查看提交歷史哪亿,其中HEAD標(biāo)志了當(dāng)前所處的版本,master標(biāo)志了master分支的位置贤笆。
02 撤銷修改
撤銷修改有關(guān)的命令主要就是兩個(gè)蝇棉,git checkout -- <file>
和git reset HEAD <file>
,關(guān)于這兩個(gè)命令芥永,主要記住兩點(diǎn)篡殷。
-
git checkout -- <file>
是把工作目錄下的文件用暫存區(qū)里的文件代替 -
git reset HEAD <file>
是把暫存區(qū)里的文件用上一次提交時(shí)的文件代替。
先看一個(gè)例子來了解他們的區(qū)別埋涧。在上一次修改activity_main.xml
后板辽,這個(gè)文件內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bigboss.blelock.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
modifyTest
我們把最后一行modifyTest
刪掉,先不更新修改到暫存區(qū)棘催,然后執(zhí)行以下指令
$ git checkout -- app/src/main/res/layout/activity_main.xml
再回到activity_main.xml
中劲弦,會(huì)發(fā)現(xiàn)刪除的內(nèi)容又回來了。
這次我們再把最后一行modifyTest
刪掉醇坝,執(zhí)行以下指令邑跪,將修改更新到暫存區(qū)再執(zhí)行git checkout
。
$ git add app/src/main/res/layout/activity_main.xml
$ git checkout -- app/src/main/res/layout/activity_main.xml
再回到activity_main.xml
中呼猪,會(huì)發(fā)現(xiàn)刪除的內(nèi)容并沒有回來画畅。
為什么呢?因?yàn)?code>git checkout -- <file>撤銷修改是把暫存區(qū)對應(yīng)的文件替換工作目錄下的文件郑叠,所以沒有更新到暫存區(qū)的修改可以撤銷夜赵,而更新到暫存區(qū)的修改不能撤銷乡革。
如果要取消添加到暫存區(qū)的修改可以采用git reset HEAD <file>
,這個(gè)命令可以撤銷暫存區(qū)里對應(yīng)文件的修改嘁傀,但工作目錄中的文件不會(huì)改變,因?yàn)檫@個(gè)命令是用上一次提交中的文件替換暫存區(qū)的文件橙凳。如果想把工作目錄和暫存區(qū)中的文件都恢復(fù)到上次提交時(shí)的樣子岛啸,可以用git reset HEAD <file>
再git checkout -- <file>
坚踩。
在工作中瓤狐,如果你的工作還沒有添加到暫存區(qū)瞬铸,那么用git checkout -- <file>
即可,如果添加到了暫存區(qū)础锐,想要恢復(fù)嗓节,可以先git reset HEAD <file>
再git checkout -- <file>
。
Android Studio中的相應(yīng)操作
在Android Studio中撤銷修改非常簡單皆警,在Version Control中選中要撤銷修改的文件拦宣,鼠標(biāo)右鍵,在彈出的菜單中選擇Revert
即可撤銷修改耀怜,注意這邊的撤銷修改是恢復(fù)到上次提交時(shí)的樣子恢着,相當(dāng)于使用git reset <file>
和git checkout <file>
。
03 版本回退
在Git中你可以使用git reset commitID
把當(dāng)前版本回退到之前提交的任意一個(gè)版本中财破。是不是覺得很熟悉掰派!在上一節(jié)中使用過這樣一個(gè)指令,git reset HEAD <file>
左痢,這其實(shí)是同一個(gè)指令靡羡!在Git中,HEAD
表示最近一次提交俊性,而最近一次提交的上一次提交可以用HEAD^
略步,那上上一次呢?HEAD^^
趟薄,上上上一一次恩够?HEAD^^^
,那……你懂得扑媚。還記得git reset HEAD <file>
的作用嗎?用最近一次提交中的文件替代暫存區(qū)中的文件。仔細(xì)想一想,其實(shí)版本回退就把所有文件都替換掉就好了谎痢!在git reset
指令中,在不加<file>
這個(gè)參數(shù)后滨嘱,會(huì)把整個(gè)暫存區(qū)用對應(yīng)提交中的文件替換掉。
特別注意一下,git reset commitID
只是回退了暫存區(qū)中的文件锥咸,工作區(qū)中的文件是不會(huì)改變的。舉個(gè)栗子雪侥。目前我們的activity_main.xml
如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bigboss.blelock.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
modifyTest
我們回退到上一個(gè)版本,在上一個(gè)版本中我們的activity_main.xml
中還沒有添加最后一行从祝。
$ git reset HEAD^
執(zhí)行后,查看activity_main.xml
毒涧,發(fā)現(xiàn)并沒有改變!因?yàn)?code>git reset commitID回退的是暫存區(qū)的內(nèi)容捡偏,工作區(qū)的內(nèi)容是不變的。如果你不相信,可以用git status
查看一下倉庫狀態(tài)琉预,里面應(yīng)該會(huì)有一條Changes not staged for commit
,里面的內(nèi)容是modified: activity_main.xml
榨咐。如果想把工作區(qū)也回退到上一個(gè)版本中的樣子,可以在reset之后永淌,執(zhí)行git checkout -- .
將當(dāng)前目錄用暫存區(qū)的內(nèi)容替代±畹危或者可以直接使用git reset --hard commitID
,其中的--hard
參數(shù)會(huì)使工作區(qū)和暫存區(qū)都被恢復(fù)成上一次提交時(shí)的樣子芹助。
要回退的版本可以直接用提交的SHA1值指定。提交的SHA1值可以用git log
中看到。
用SHA1值來回退到上一個(gè)版本就像這樣。
git reset 952979b2057f6324f204130c88ab8d7452f33489
git reset
命令可以將當(dāng)前版本設(shè)置為任意一個(gè)提交,只要知道那個(gè)提交的SHA1值琉朽,就能用git reset
命令將它設(shè)置為當(dāng)前版本。現(xiàn)在我們要把當(dāng)前版本跳轉(zhuǎn)回去耕漱,回到那個(gè)添加了modifyTest的版本去,我們用git log
命令來查看這個(gè)版本的SHA1值若河,發(fā)現(xiàn)......并沒有!
git log
只會(huì)顯示當(dāng)前版本之前的提交歷史。不過還是有辦法的饲窿,我們用git reflog
指令,他記錄了HEAD
這個(gè)頭指針變動(dòng)的歷史。
用查找到的版本號進(jìn)行git reset
操作就可以回去了做鹰。
Android Studio中的相應(yīng)操作
在Android Studio中進(jìn)行版本地方法如圖所示,在Version Control的Log下饭尝,選中要跳轉(zhuǎn)的版本钥平,右鍵右鍵在彈出的菜單中,選擇Reset Current Branch to Here
即可立叛。
04 .gitignore文件的使用
一般在使用Git時(shí),會(huì)使用git add -A
將工作區(qū)里的所有文件都更新到暫存區(qū)庶柿,但是總有些文件是我們不想添加進(jìn)版本控制系統(tǒng)的(通常是一些自動(dòng)生成的文件,想編譯后產(chǎn)生的文件)审残,這時(shí)要么一個(gè)一個(gè)添加文件搅轿,要么先全部添加,再把不要的刪掉雀鹃,很不方便。而且在每次用git status
總會(huì)有大量的紅字傅瞻,提示我們有文件沒添加進(jìn)版本管理。使用.gitignore文件可以告訴Git哪些文件是不想納入版本管理的,讓Git把這些文件忽略掉。
在Android Studio中伸但,有兩個(gè).gitignore文件,一個(gè)是Project根目錄下的饵逐,一個(gè)是module下的倍权。對于Android項(xiàng)目,根目錄下的.gitignore文件可以如下配置默辨。
# Built application files
*.apk
*.ap_
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# Intellij
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/dictionaries
.idea/libraries
# Keystore files
*.jks
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
# Google Services (e.g. APIs or Firebase)
google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
module下的.gitignore
文件可以如下配置:
/build
*.iml
如果還有什么需要忽略的文件档叔,可以自行添加铃肯,添加的語法如上押逼,其中#
開頭的是注釋沾歪,*
表所有挫望,像*.iml
表示所有后綴為.iml
的文件。
配置前后用git status
查看文件狀態(tài)蛉幸,可以發(fā)現(xiàn)我們指定的忽略文件已經(jīng)被忽略了提陶。
如果一個(gè)文件已經(jīng)被檢入到了暫存區(qū)里面仲器,那么即使在.gitignore文件里添加這個(gè)文件名,Git也不會(huì)忽略他。所以最好在一開始的時(shí)候就把.gitignore給配置好肢扯。如果很不幸地出現(xiàn)了這種情況,用下面的指令把相應(yīng)的文件從暫存區(qū)里面刪除即可肛循。
# --cached參數(shù)表明只刪除暫存區(qū)里的文件累舷,不加時(shí)工作區(qū)和暫存區(qū)里的文件都會(huì)被刪除
$ git rm --cached FILENAME
既然已經(jīng)把不需要的文件都忽略了害捕,以后添加改動(dòng)和提交只需要把他們?nèi)由狭送讨停?zhí)行以下指令赴精。
$ git add .
$ git commit -m "添加了忽略規(guī)則"
現(xiàn)在再用git status
查看倉庫狀態(tài),顯示當(dāng)前沒有任何改動(dòng)谭确,工作樹(工作區(qū))是干凈的。其實(shí)早就想這么干的票渠,紅字看的真心難受逐哈。。问顷。
幫助: GitHub 有一個(gè)十分詳細(xì)的針對數(shù)十種項(xiàng)目及語言的 .gitignore 文件列表昂秃,你可以在
https://github.com/github/gitignore 找到它.
05 備份代碼到遠(yuǎn)程倉庫
由于電腦可能會(huì)中途報(bào)廢塞耕,我們可能需要個(gè)像云盤一樣的東西用來備份。又或者在好多個(gè)地方有好多臺電腦厚柳,今天在那里工作明天在這里工作烧董,我們就需要一個(gè)地方來中轉(zhuǎn)代碼岩遗。又或者需要進(jìn)行協(xié)同開發(fā)……
這里我們使用Github來創(chuàng)建遠(yuǎn)程倉庫暇番,當(dāng)然也可以采用別的Git倉庫托管服務(wù)剂公,像碼云,Bitbucket等涡上,當(dāng)然自己搭也是可以的,在Git官網(wǎng)上有詳細(xì)的教程禁偎。Github賬號是必須的,請自行注冊。既然要在網(wǎng)絡(luò)中傳輸數(shù)據(jù),那必然要涉及到協(xié)議度苔。目前Git傳輸數(shù)據(jù)最常用的兩種協(xié)議是SSH和HTTPS论熙。
使用SSH協(xié)議的方式
1. 配置SSH Key
在命令行中執(zhí)行以下命令拳昌,生成SSH Key寇壳。
$ ssh-keygen -t rsa -C "youremail@example.com" // 把郵箱替換成自己的
輸入后,他會(huì)讓我們輸入Key存放的位置掌栅,如果直接回車氢烘,那么默認(rèn)就是冒號前面那段路徑了钳榨,之后要根據(jù)這個(gè)路徑找到Key。
之后他還會(huì)叫你兩次輸入密碼癌淮,如果沒什么重要的東西,直接回車就好了。成功后應(yīng)該是下面這個(gè)樣子的眼五。
然后來到生成Key的目錄下面,有下圖所示的兩個(gè)文件肃续,打開后綴為.pub
的文件(這個(gè)是公鑰黍檩,另一個(gè)是私鑰),過會(huì)兒我們會(huì)要把它放到github的賬戶里始锚。
按下圖的步驟把SSH添加到賬戶里刽酱,按下Add SSH Key,就完成了SSH Key的配置瞧捌。
2. 創(chuàng)建遠(yuǎn)程倉庫
按下圖進(jìn)入創(chuàng)建遠(yuǎn)程倉庫頁面棵里。
按下圖創(chuàng)建一個(gè)遠(yuǎn)程倉庫。Github上的私人倉庫是要錢的姐呐,7美元一個(gè)月哈殿怜。雖然是倉庫公開的,但是因?yàn)橛衧sh key曙砂,別人是不能直接修改你的代碼的头谜,不過他們可以看到你的代碼。
點(diǎn)擊創(chuàng)建后鸠澈,就擁有自己的遠(yuǎn)程倉庫啦柱告!
3. 在本地添加遠(yuǎn)程倉庫
現(xiàn)在我們已經(jīng)創(chuàng)建好遠(yuǎn)程倉庫了,我們在本地倉庫把它添加上去笑陈,就可以把代碼備份到遠(yuǎn)程庫了际度。添加遠(yuǎn)程庫的命令如下。
git remote add <shortname> <url>
其中shortname
相當(dāng)于是url
的簡稱涵妥,以后用shortname
就可以代表url
乖菱。url
是遠(yuǎn)程倉庫的地址,可以在如下頁面中得到蓬网。
一般用origin
表示遠(yuǎn)程庫块请。在我們的倉庫里,執(zhí)行以下命令拳缠。
$ git remote add origin git@github.com:WoHohohoho/MyApplication.git
可以用git remote
來查看現(xiàn)有的遠(yuǎn)程庫墩新,上一個(gè)命令成功后再執(zhí)行可以看到多了一個(gè)origin
。
4. 把本地倉庫的內(nèi)容push到遠(yuǎn)程倉庫
在添加完遠(yuǎn)程庫后窟坐,可以用git push [remote-name] [branch-name]
命令來將本地倉庫中的內(nèi)容推送到遠(yuǎn)程倉庫上海渊。其中remote-name
是遠(yuǎn)程倉庫名绵疲,就是上一步中我們設(shè)置的shortname
,branch-name
是分支名臣疑,分支的具體內(nèi)容下面再介紹盔憨。git push
可以把本地的提交推送到遠(yuǎn)程倉庫中排宰,在執(zhí)行時(shí)亚茬,本地倉庫與遠(yuǎn)成倉庫會(huì)比較提交歷史,把遠(yuǎn)程倉庫沒有的提交挑選出來睦尽,然后發(fā)上去缺狠,完成更新问慎。
與git push
對應(yīng)的還有git pull [remote-name] [branch-name]
,push是推挤茄,而pull是拉如叼,當(dāng)我們在另一臺電腦上完成工作并推送提交到遠(yuǎn)程倉庫后,為了在原來的電腦上繼續(xù)工作穷劈,我們需要把遠(yuǎn)程倉庫中的更新拉下來笼恰,更新本地倉庫。
注意: 在使用
git pull
時(shí)歇终,要保證本地倉庫是最新的社证,即遠(yuǎn)程倉庫中所有的提交本地都需要有,不然Git會(huì)提示pull操作失敗评凝。在一個(gè)人開發(fā)時(shí)猴仑,因?yàn)樽约褐雷约旱拇a是否是最新的,所以簡單地使用push
和pull
就可以了肥哎。在多人開發(fā)中,由于別人也會(huì)向遠(yuǎn)程倉庫提交代碼疾渣,在每次push前需要先試探性的獲取遠(yuǎn)程的更新篡诽,沒有的話就直接push,有的話需要把更新合并到本地的代碼中榴捡,由于這涉及到分支和合并杈女,之后再詳細(xì)講。
倉庫初始化時(shí)吊圾,會(huì)默認(rèn)創(chuàng)建一個(gè)master
分支达椰,我們的版本現(xiàn)在都在這個(gè)分支上,現(xiàn)在我們把這個(gè)分支推送上去就好了项乒。
在我們的倉庫里輸入下列指令啰劲。
$ git push origin master
執(zhí)行完成后,遠(yuǎn)程倉庫里就存在了一份一模一樣的工程檀何。
以后每有更新蝇裤,用git push
將改動(dòng)更新到遠(yuǎn)程倉庫即可廷支。
使用HTTPS協(xié)議的方式
使用HTTPS協(xié)議操作起來比較簡單。只要從使用SSH協(xié)議的第三步開始栓辜,將遠(yuǎn)程倉庫的url
換成https
形式即可恋拍。
之后操作和SSH方式相同,不過在push
和之后會(huì)提到的fetch
(拉扰核Α)時(shí)施敢,會(huì)要求驗(yàn)證賬號和密碼,不過可以通過設(shè)置狭莱,來保存賬戶名和密碼僵娃,而且一些客戶端可以幫助存取賬戶名和密碼,十分方便贩毕。HTTPS雖然使用起來很方便悯许,但服務(wù)器搭建時(shí)配置HTTPS比配置SSH麻煩許多。
Android Studio中的相應(yīng)操作
可以直接在Android Studio連接Github辉阶,建立遠(yuǎn)程倉庫先壕,完成推送。首先需要在Android Studio中設(shè)置對應(yīng)Github的賬號和密碼谆甜。操作路徑為File->Settings->Version Control->Github
垃僚。其中
Clone git repositories using ssh
這個(gè)選項(xiàng)勾選了,就會(huì)使用ssh
協(xié)議规辱,不勾選就會(huì)使用https
協(xié)議谆棺。用Test
可以測試是否能夠連接上Github。使用ssh
協(xié)議的話罕袋,在創(chuàng)建之前需要配置SSH Key改淑,方式和前面相同。點(diǎn)擊之后浴讯,可能會(huì)要求你輸入密碼等朵夏,最后會(huì)彈出一個(gè)如下對話框,填寫信息榆纽,按下Share按鈕仰猖,就完成了創(chuàng)建遠(yuǎn)程倉庫,在本地添加遠(yuǎn)程倉庫奈籽,推送代碼到遠(yuǎn)程倉庫的一系列操作饥侵,十分方便。
Android Studio中的push操作和pull操作分別是
VCS->Git->Push
和VCS->Git->Pull
衣屏。
06 克隆
上一小節(jié)我們講了怎么創(chuàng)建一個(gè)遠(yuǎn)程倉庫并把本地倉庫同步到上面去躏升,這節(jié)會(huì)講如何將遠(yuǎn)程倉庫拷貝到本地來。以后狼忱,只要有一臺能聯(lián)網(wǎng)的電腦煮甥,我們就能繼續(xù)我們的工作盗温。
在Git中,可以用git clone <remote-url> <local-directory>
來克隆遠(yuǎn)程倉庫到本地成肘。接下來卖局,我們試著把上一節(jié)中創(chuàng)建的遠(yuǎn)程倉庫clone到本地來。
我們執(zhí)行以下命令双霍,其中remote-url
就是我們在創(chuàng)建遠(yuǎn)程倉庫時(shí)得到的遠(yuǎn)程倉庫的地址砚偶,local-directory
指明了我們要把倉庫放在這個(gè)目錄(文件夾)里,如果這個(gè)目錄不存在洒闸,Git會(huì)自動(dòng)幫我們新建染坯。
$ git clone git@github.com:WoHohohoho/MyApplication.git ~/Desktop/MyApplicationCloneVersion
執(zhí)行完成后,打開對應(yīng)目錄丘逸,會(huì)發(fā)現(xiàn)東西都已經(jīng)拷下來了单鹿,比U盤什么的方便多了。
Android Studio中的相應(yīng)操作
Android Studio中的Clone操作沿著VCS->Git->Clone
路徑可以找到深纲。之后填寫相關(guān)參數(shù)即可仲锄,點(diǎn)擊Clone即可。
下一篇: Git的點(diǎn)點(diǎn)滴滴湃鹊,附帶Android Studio中的操作(三):Git中的分支儒喊。