Git的點(diǎn)點(diǎn)滴滴,附帶Android Studio中的操作(二):用Git備份代碼

一 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工程建好边翁,再是一頓cdmkdirls來到相應(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í)也就是這三步堕澄。

  1. 在上一個(gè)版本的基礎(chǔ)上繼續(xù)開發(fā)蛙紫,修改代碼坑傅。
  2. git add或者git rm指令喷斋,將需要的改動(dòng)添加到暫存區(qū)(顧名思義星爪,一個(gè)暫存文件的區(qū)域)移必,對應(yīng)上面的挑選改動(dòng)操作崔泵。
  3. git commit指令,將暫存區(qū)中的改動(dòng)與上一個(gè)提交(備份)結(jié)合入篮,形成一個(gè)新的提交(備份)潮售,對應(yīng)上述操作中的備份操作酥诽。

注意:這里的改動(dòng)并不單單指對原文件的修改肮帐,也包括創(chuàng)建文件训枢,刪除文件。

01 在本地備份代碼

在Git中用git addgit rm操作來添加改動(dòng)到暫存區(qū)睦刃,并用git commit來生成一個(gè)提交(備份)涩拙。接下來分別介紹添加文件吃环,修改刪除這三種改動(dòng)添加到到暫存區(qū)的方法和生成一次提交的方法文留。

關(guān)于暫存區(qū)到底是個(gè)什么東西竭沫。
我們把平時(shí)看到的電腦上的目錄叫做工作區(qū),里面是我們實(shí)際操作的文件凝赛。而暫存里面一開始會(huì)包含上個(gè)提交時(shí)的所有文件冠绢,然后我們會(huì)通過git addgit 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 -ugit 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 commitChanges 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è)置的shortnamebranch-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是否是最新的,所以簡單地使用pushpull就可以了肥哎。在多人開發(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->PushVCS->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中的分支儒喊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市币呵,隨后出現(xiàn)的幾起案子怀愧,更是在濱河造成了極大的恐慌,老刑警劉巖余赢,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯义,死亡現(xiàn)場離奇詭異,居然都是意外死亡妻柒,警方通過查閱死者的電腦和手機(jī)扛拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛤奢,“玉大人,你說我怎么就攤上這事陶贼∑》罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵拜秧,是天一觀的道長痹屹。 經(jīng)常有香客問我,道長枉氮,這世上最難降的妖魔是什么志衍? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任暖庄,我火速辦了婚禮,結(jié)果婚禮上楼肪,老公的妹妹穿的比我還像新娘培廓。我一直安慰自己,他們只是感情好春叫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布肩钠。 她就那樣靜靜地躺著,像睡著了一般暂殖。 火紅的嫁衣襯著肌膚如雪价匠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天呛每,我揣著相機(jī)與錄音踩窖,去河邊找鬼。 笑死晨横,一個(gè)胖子當(dāng)著我的面吹牛洋腮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颓遏,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼徐矩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叁幢?” 一聲冷哼從身側(cè)響起滤灯,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曼玩,沒想到半個(gè)月后鳞骤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍判,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年豫尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷帖。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡美旧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贬墩,到底是詐尸還是另有隱情榴嗅,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布陶舞,位于F島的核電站嗽测,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肿孵。R本人自食惡果不足惜唠粥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一疏魏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晤愧,春花似錦大莫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贯吓,卻和暖如春懈凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悄谐。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工介评, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爬舰。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓们陆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親情屹。 傳聞我的和親對象是個(gè)殘疾皇子坪仇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 01 分支的實(shí)現(xiàn)原理 Git的分支特性常常被稱為“必殺技特性”椅文,因?yàn)榉种Ыo團(tuán)隊(duì)開發(fā)提供了很大的便利,而且在Git中...
    Happioo閱讀 1,140評論 0 1
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,665評論 9 163
  • 鳳凰 作者孫玉峰 你從天而降 你長的五彩 你不知是鳥還是雕 你長的什么樣子恐怕誰也沒見過 你說出話恐怕誰也沒聽過 ...
    雀兒_f162閱讀 222評論 0 0
  • 上午的時(shí)光已經(jīng)過去惜颇〗源蹋可感覺卻什么也沒有做,懶惰它總是這樣困擾著我凌摄,想要去學(xué)習(xí)羡蛾,而不是這樣讓時(shí)間簡單的過去。不...
    鹿鹿無畏閱讀 742評論 0 49
  • 就是心酸锨亏,沒有其他話要說痴怨。 反正這里沒人知道我,我現(xiàn)在就是心里難受器予。
    宮璃閱讀 228評論 0 0