Git時(shí)間

Git.jpg

Git

常見(jiàn)的版本控制工具主要有svn和Git

Git是一個(gè)開(kāi)源的分布式版本控制工具扣蜻,它的開(kāi)發(fā)者就是大名鼎鼎的Linux操作系統(tǒng)的作者Linus Torvalds逆巍。Git被開(kāi)發(fā)出來(lái)的初衷是為了更好地管理Linux內(nèi)核,而現(xiàn)在卻早已被廣泛應(yīng)用于全球各種大中小型的項(xiàng)目中莽使。

Git的各種命令是你應(yīng)該掌握的核心技能锐极,不管你是在哪個(gè)操作系統(tǒng)上,使用命令來(lái)操作Git肯定都是通用的芳肌。而圖形化的操作應(yīng)該是在你能熟練掌握命令用法的前提下灵再,進(jìn)一步提升你工作效率的手段。

如果你使用的是Windows操作系統(tǒng)亿笤,就從開(kāi)始里面找到Git Bash并打開(kāi)翎迁。

1.配置一下你的身份

image

然后我們就可以創(chuàng)建代碼倉(cāng)庫(kù)了,倉(cāng)庫(kù)(Repository)是用于保存版本管理所需信息的地方净薛,所有本地提交的代碼都會(huì)被提交到代碼倉(cāng)庫(kù)中汪榔,如果有需要還可以在推送到遠(yuǎn)程倉(cāng)庫(kù)中。
image

我們嘗試著給BroadcastBestPractice項(xiàng)目建立一個(gè)倉(cāng)庫(kù)肃拜。
先進(jìn)入到BroadcastBestPractice項(xiàng)目的目錄下面痴腌。
git init
只需要一行命令就可以完成創(chuàng)建代碼倉(cāng)庫(kù)的操作。

倉(cāng)庫(kù)創(chuàng)建完成后爆班,會(huì)在BroadcastBestPractice項(xiàng)目的根目錄下衷掷,生成一個(gè)隱藏的.git文件夾,這個(gè)文件夾就是用來(lái)記錄本地所有的Git操作的柿菩,可以通過(guò)ls -al命令查看一下

2.提交本地代碼

image

代碼倉(cāng)庫(kù)建立完之后就可以提交代碼了戚嗅,其實(shí)提交代碼的方法也非常簡(jiǎn)單,只需要使用addcommit命令就可以了枢舶。
add用于把想要提交的代碼先添加進(jìn)來(lái)懦胞。
commit則是真正地去執(zhí)行提交操作。

git add build.gradle:添加文件凉泄。
git add app:添加目錄躏尉。
git add .:一次性把所有文件都添加進(jìn)來(lái)。
git commit -m "First commit"
注意;commit命令的后面后众,我們一定要通過(guò)-m參數(shù)來(lái)加上提交的描述信息胀糜,沒(méi)有描述信息的提交被認(rèn)為是不合法的颅拦。

Git時(shí)間 --版本控制工具進(jìn)階

準(zhǔn)備工作

image

準(zhǔn)備工作就是要給一個(gè)項(xiàng)目創(chuàng)建代碼倉(cāng)庫(kù) ,打開(kāi)Git Bash,進(jìn)入到這個(gè)項(xiàng)目的根目錄下面教藻,然后執(zhí)行g(shù)it init命令距帅。

忽略文件

build目錄下的文件都是編譯項(xiàng)目時(shí)自動(dòng)生成的,我們不應(yīng)該將這部分文件添加到版本控制當(dāng)中括堤。

Git提供了一種可配性很強(qiáng)的機(jī)制來(lái)允許用戶將指定的文件或目錄排除在版本控制之外碌秸,它會(huì)檢查代碼倉(cāng)庫(kù)的目錄下是否存在一個(gè)名為.gitignore的文件,如果存在的話悄窃,就去一行行讀取這個(gè)文件中的內(nèi)容讥电,并把每一行指定的文件或目錄排除在版本控制之外。注意.gitignore中指定的文件或目錄是可以使用“*”通配符的轧抗。

我們并不需要自己去創(chuàng)建.gitignore文件,Android Studio在創(chuàng)建項(xiàng)目的時(shí)候會(huì)自動(dòng)幫我們創(chuàng)建出兩個(gè).gitignore文件恩敌,一個(gè)在根目錄下面,一個(gè)在app模塊下面横媚。

首先看一下根目錄下面的.gitignore文件

image

這是Android Studio自動(dòng)生成的一些默認(rèn)配置潮剪,通常情況下,這部分內(nèi)容都是不用添加到版本控制當(dāng)中的分唾,除了*.iml表示指定任意以.iml結(jié)尾的文件抗碰,其他都是指定的具體的文件名或目錄名,上面配置中的所有內(nèi)容都不會(huì)被添加到版本控制當(dāng)中绽乔,因?yàn)榛径际且恍┯蒊DE自動(dòng)生成的配置弧蝇。

再來(lái)看一下app模塊下面的.gitignore文件

image

由于app模塊下面基本都是我們編寫(xiě)的代碼,因此默認(rèn)情況下只有其中的build目錄不會(huì)被添加到版本控制當(dāng)中折砸。

當(dāng)然看疗,我們完全可以對(duì)以上兩個(gè)文件進(jìn)行任意的修改,來(lái)滿足特定的需求睦授。

/build
/src/test
/src/androidTest

然后在依次執(zhí)行:

git add .

image

git commit -m "First commit."

image
image

查看修改內(nèi)容

在進(jìn)行了第一次代碼提交之后两芳,我們后面還可能會(huì)對(duì)項(xiàng)目不斷地進(jìn)行維護(hù)或添加新功能等。比較理想的情況是每當(dāng)完成了一小塊功能去枷,就執(zhí)行一次提交怖辆。但是如果某個(gè)功能牽扯到的代碼比較多,有可能寫(xiě)到后面的時(shí)候我們就已經(jīng)忘記前面修改了什么東西了删顶。遇到這種情況時(shí)不用擔(dān)心竖螃,Git全都幫你記著呢!

查看文件修改情況的方法非常簡(jiǎn)單逗余,只需要使用status命令就可以了特咆。

image

git status
然后Git會(huì)提示目前項(xiàng)目中沒(méi)有任何可提交的文件,因?yàn)槲覀儎倓偛盘峤贿^(guò)嘛录粱。

//values.put("price",22.85);
values.put("price",55.55);

這里僅僅是在添加數(shù)據(jù)的時(shí)候腻格,將書(shū)的價(jià)格由22.85改成了55.55画拾。然后重新輸入git status命令。

image

可以看到菜职,Git提醒我們MainActivity.java這個(gè)文件已經(jīng)發(fā)生了更改碾阁,那么如何才能看到更改的內(nèi)容呢?這就需要借助diff命令了些楣。
git diff

這樣可以查看到所有文件的更改內(nèi)容,如果你只想查看MainActivity.java這個(gè)文件的更改內(nèi)容

git diff app/src/main/java/com/example/providertest/MainActivity.java

image

減號(hào)代表刪除的部分
加號(hào)代表添加的部分

從圖中我們就可以明顯的看到宪睹,書(shū)的價(jià)格由22.85被修改成了55.55

撤銷(xiāo)未提交的修改

只要代碼還未提交愁茁,所有修改的內(nèi)容都是可以撤銷(xiāo)的

上一小節(jié)中我們修改了MainActivity里一本書(shū)的價(jià)格,現(xiàn)在如果想要撤銷(xiāo)這個(gè)修改就可以使用checkout命令亭病,

git checkout app/src/main/java/com/example/providertest/MainActivity.java

image

執(zhí)行了這個(gè)命令之后鹅很,我們對(duì)MainActivity.java這個(gè)文件所做的一切修改就應(yīng)該都被撤銷(xiāo)了。
重新運(yùn)行git status命令檢查一下罪帖。

可以看到促煮,當(dāng)前項(xiàng)目中沒(méi)有任何可提交的文件,說(shuō)明撤銷(xiāo)操作確實(shí)是成功了整袁。

不過(guò)這種撤銷(xiāo)方式只適用于那些還沒(méi)有執(zhí)行過(guò)add命令的文件菠齿,如果某個(gè)文件已經(jīng)被添加過(guò)了,這種方式就無(wú)法撤銷(xiāo)其更改的內(nèi)容坐昙。

首先仍然是將MainActivity中那本書(shū)的價(jià)格改成55.55绳匀,輸入git add .

這樣就把所有修改的文件都進(jìn)行了添加,可以輸入git status來(lái)檢查一下炸客。

image

再執(zhí)行一遍checkout命令疾棵,你會(huì)發(fā)現(xiàn)MainActivity仍然是處于已添加狀態(tài),所修改的內(nèi)容無(wú)法撤銷(xiāo)掉痹仙。

對(duì)于已添加的文件我們應(yīng)該先對(duì)其取消添加是尔,然后才可以撤回提交。取消添加使用的是reset命令开仰。
git reset HEAD app/src/main/java/com/example/providertest/MainActivity.java

在運(yùn)行一遍git status命令拟枚,你就會(huì)發(fā)現(xiàn)MainActivity.java這個(gè)文件重新變回了未添加狀態(tài),當(dāng)時(shí)就可以使用checkout命令來(lái)將修改的內(nèi)容進(jìn)行撤銷(xiāo)了众弓。


image

查看提交記錄

當(dāng)ProviderTest這個(gè)項(xiàng)目開(kāi)發(fā)了幾個(gè)月之后梨州,我們可能已經(jīng)執(zhí)行過(guò)上百次的提交操作了,這個(gè)時(shí)候估計(jì)你早就已經(jīng)忘記每次提交都修改了哪些內(nèi)容田轧。不過(guò)沒(méi)關(guān)系暴匠,忠實(shí)的Git一直都幫我們清清楚楚地記錄著呢!可以使用log命令查看歷史提交信息傻粘。

git log

image

每次提交記錄都會(huì)包含提交id,提交人每窖,提交日期以及提交描述這4個(gè)信息帮掉。那么我們?cè)俅螌?shū)架修改成55.55,
git add .
git commit -m "Change price."

image

當(dāng)提交記錄非常多的時(shí)候窒典,如果我們只想查看其中一條記錄蟆炊,我們?cè)诿钪兄付ㄔ撚涗浀膇d,并加上-1參數(shù)表示我們只想看到一行記錄瀑志。

git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1

image

如果想要查看這條提交記錄具體修改了什么內(nèi)容涩搓,可以在命令中加入-p參數(shù)

git log 39e4c213a7f5f8760a35f769c1261c2cbcdcc644 -1 -p

image

Git時(shí)間---版本控制工具的高級(jí)用法

分支的用法

分支是版本控制工具中比較高級(jí)且比較重要的一個(gè)概念,它主要的作用就是在現(xiàn)有代碼的基礎(chǔ)上開(kāi)辟一個(gè)分叉口劈猪,使得代碼可以在主干線和分支線上同時(shí)進(jìn)行開(kāi)發(fā)昧甘,且相互之間不會(huì)影響。

分支的英文名是branch,如果想要查看當(dāng)前的版本庫(kù)當(dāng)中有哪些分支战得,可以使用git branch這個(gè)命令充边。


image

由于目前LBSTest項(xiàng)目中還沒(méi)有創(chuàng)建過(guò)任何分支,因此只有一個(gè)master分支存在常侦,這也就是前面所說(shuō)的主干線浇冰。接下來(lái)我們嘗試創(chuàng)建一個(gè)分支:


image

可以看到果然有一個(gè)叫做version1.0的分支出現(xiàn)了。你會(huì)發(fā)現(xiàn)聋亡,master分支的前面有一個(gè)"*"號(hào)肘习,說(shuō)明目前我們的代碼還是在master分支上的,只需要使用checkout命令就能切換到version1.0分支上坡倔。

再次輸入git branch來(lái)進(jìn)行檢查井厌。


image

我們已經(jīng)成功把代碼切換到version1.0這個(gè)分支上了。

需要注意的是致讥,在version1.0分支上修改并提交的代碼將不會(huì)影響到master分支仅仆。同樣的道理,在master分支上修改并提交的代碼也不會(huì)影響到version1.0分支垢袱。因此墓拜,如果我們?cè)趘ersion1.0分支上修改了一個(gè)bug,在master分支上這個(gè)bug是仍然存在的请契。這時(shí)將修改的代碼一行行復(fù)制到master分支上顯然不是一種聰明的做法咳榜,最好的辦法就是使用merge命令來(lái)完成合并操作。


image

僅僅這樣簡(jiǎn)單的兩行命令爽锥,就可以把在version1.0分支上修改并提交的內(nèi)容合并到master分支上了涌韩。當(dāng)然,在合并分支的時(shí)候還有可能出現(xiàn)代碼沖突的情況氯夷,這個(gè)時(shí)候你就需要靜下心來(lái)慢慢地找出并解決這些沖突臣樱,Git在這里就無(wú)法幫助到你了。

最后,當(dāng)我們不再需要version1.0這個(gè)分支的時(shí)候雇毫,可以使用如下命令將這個(gè)分支刪除掉:


image

11.5.2 與遠(yuǎn)程版本庫(kù)協(xié)作

如果你是一個(gè)人在開(kāi)發(fā)玄捕,那么使用版本控制工具就遠(yuǎn)遠(yuǎn)無(wú)法發(fā)揮出它真正強(qiáng)大的功能。所有版本控制工具最重要的一個(gè)特點(diǎn)就是可以使用它來(lái)進(jìn)行團(tuán)隊(duì)合作開(kāi)發(fā)棚放。

比如說(shuō)現(xiàn)在有一個(gè)遠(yuǎn)程版本庫(kù)的Git地址是https://github.com/example/test.git,就可以使用如下命令將代碼下載到本地:

git clone https://github.com/example/test.git

之后你在這份代碼的基礎(chǔ)上進(jìn)行了一些修改和提交枚粘,需要借助push命令來(lái)完成把本地修改的內(nèi)容同步到遠(yuǎn)程版本庫(kù)上。

git push origin master

其中origin部分指定的是遠(yuǎn)程版本庫(kù)的Git地址飘蚯,master部分指定的是同步到哪一個(gè)分支上馍迄,上訴命令就完成了將本地代碼同步到https://github.com/example/test.git這個(gè)版本庫(kù)的master分支上的功能。

知道了將本地的修改同步到遠(yuǎn)程版本庫(kù)上的方法局骤,接下來(lái)我們看一下如何將遠(yuǎn)程版本庫(kù)上的修改同步到本地攀圈。Git提供了兩種命令來(lái)完成此功能,分別是fetch和pull庄涡,fetch的語(yǔ)法規(guī)則和pull是差不多的。

git fetch origin master

執(zhí)行這個(gè)命令后搬设,就會(huì)將遠(yuǎn)程版本庫(kù)上的代碼同步到本地穴店,不過(guò)同步下來(lái)的代碼并不會(huì)合并到任何分支上去,而是會(huì)存放到一個(gè)origin/master分支上拿穴,這時(shí)我們可以通過(guò)diff命令來(lái)查看遠(yuǎn)程版本庫(kù)上到底修改了哪些東西:

git diff origin/master

之后再調(diào)用merge命令將origin/master分支上的修改合并到主分支上即可泣洞。

git merge origin/master

而pull命令則是相當(dāng)于將fetch和merge這兩個(gè)命令放在一起執(zhí)行了,它可以從遠(yuǎn)程版本庫(kù)上獲取最新的代碼并且合并到本地默色。

git pull origin master

14.2 Git時(shí)間---將代碼托管到GitHub上

首先是自動(dòng)跳轉(zhuǎn)到GitHub的個(gè)人主頁(yè)

Github個(gè)人主頁(yè).png

可以點(diǎn)擊Start a project 按鈕來(lái)創(chuàng)建一個(gè)版本庫(kù)球凰。

創(chuàng)建版本庫(kù).png

這里將版本庫(kù)命名mengweather,然后選擇一個(gè)添加Android項(xiàng)目類(lèi)型的.gitignore文件,并使用Apache License 2.0來(lái)作為軟件的開(kāi)源協(xié)議腿宰。

接著點(diǎn)擊Create repository按鈕呕诉,mengweather這個(gè)版本庫(kù)就創(chuàng)建完成了。版本庫(kù)主頁(yè)地址是https://github.com/WuMeng-1993/mengweather

GitHub已經(jīng)自動(dòng)幫我們創(chuàng)建了.gitignore吃度,LICENSE文件甩挫,其中README.md文件中的內(nèi)容可以修改天氣軟件版本庫(kù)主頁(yè)的描述。

創(chuàng)建好版本庫(kù)之后椿每,我們要?jiǎng)?chuàng)建項(xiàng)目了伊者。
在Android Studio新建一個(gè)Android項(xiàng)目。

接下來(lái)的一步非常重要间护,我們需要將遠(yuǎn)程版本庫(kù)克隆到本地亦渗。首先需要知道遠(yuǎn)程版本庫(kù)的Git地址,點(diǎn)擊Clone or download按鈕就能夠看到了汁尺。

版本庫(kù)地址.png

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

克隆到本地.png

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

查看克隆到本地的文件.png

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

MengWeather工程的目錄結(jié)構(gòu).png

接下來(lái)我們應(yīng)該把MengWeather項(xiàng)目中現(xiàn)有的文件提交到GitHub上面昔搂。

先將所有文件添加到版本控制中:

git add .

然后在本地執(zhí)行提交操作:

git commit -m "First commit."

最后將提交的內(nèi)容同步到遠(yuǎn)程版本庫(kù),也就是GitHub上面:

git push origin master

注意输拇,在最后一步的時(shí)候GitHub要求輸入用戶名和密碼來(lái)進(jìn)行身份校驗(yàn)摘符,這里輸入我們注冊(cè)時(shí)填入的用戶名和密碼就可以了。


校驗(yàn)圖.png

這樣就完成同步了策吠。

在GitHub上提交的內(nèi)容.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逛裤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猴抹,更是在濱河造成了極大的恐慌带族,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟀给,死亡現(xiàn)場(chǎng)離奇詭異蝙砌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)跋理,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)择克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人前普,你說(shuō)我怎么就攤上這事祠饺。” “怎么了汁政?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵道偷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我记劈,道長(zhǎng)勺鸦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任目木,我火速辦了婚禮换途,結(jié)果婚禮上懊渡,老公的妹妹穿的比我還像新娘。我一直安慰自己军拟,他們只是感情好剃执,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著懈息,像睡著了一般肾档。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辫继,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天怒见,我揣著相機(jī)與錄音,去河邊找鬼姑宽。 笑死遣耍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炮车。 我是一名探鬼主播舵变,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘦穆!你這毒婦竟也來(lái)了纪隙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤难审,失蹤者是張志新(化名)和其女友劉穎瘫拣,沒(méi)想到半個(gè)月后亿絮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體告喊,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年派昧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黔姜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒂萎,死狀恐怖秆吵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情五慈,我是刑警寧澤纳寂,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站泻拦,受9級(jí)特大地震影響毙芜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜争拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一腋粥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦隘冲、人聲如沸闹瞧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奥邮。三九已至,卻和暖如春纵竖,著一層夾襖步出監(jiān)牢的瞬間漠烧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工靡砌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留已脓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓通殃,卻偏偏與公主長(zhǎng)得像报慕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彻亲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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