版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Git的誕生
閱讀:567484
很多人都知道,Linus在1991年創(chuàng)建了開源的Linux,從此,Linux系統(tǒng)不斷發(fā)展,
已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了。
Linus雖然創(chuàng)建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在
世界各地為L(zhǎng)inux編寫代碼,那Linux的代碼是如何管理的呢?
事實(shí)是,在2002年以前世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus,然后
由Linus本人通過手工方式合并代碼!
你也許會(huì)想,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢?不是有CVS、SVN這些
免費(fèi)的版本控制系統(tǒng)嗎?為為L(zhǎng)inus堅(jiān)定地反對(duì)CVS和SVN,這些集中式的版本控制系
統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用.有一些商用的版本控制系統(tǒng),雖然比CVS、SVN好
用,但那是付費(fèi)的,和Linux的開源精神不符。
不過,到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫(kù)之大讓Linus很難繼續(xù)通過手
工方式管理了,社區(qū)的弟兄們也對(duì)這種方式表達(dá)了強(qiáng)烈不滿,于是Linus選擇了?個(gè)商業(yè)的
版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授
權(quán)Linux社區(qū)免費(fèi)使用這個(gè)版本控制系統(tǒng)。
安定團(tuán)結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集,不免沾染了一
些梁山好漢的江湖習(xí)氣。開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其
實(shí)也不只他一個(gè)),被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯(cuò)?。?,于是BitMover公
司怒了,要收回Linux社區(qū)的免費(fèi)使用權(quán).
Linus可以向BitMover公司道個(gè)款,保證以后嚴(yán)格管教弟兄們,嗯,這是不可能的.實(shí)際情況
是這樣的:
Linus花了兩周時(shí)間自己用C寫了一個(gè)分布式版本控制系統(tǒng),這就是Git!一個(gè)月之內(nèi),
Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會(huì)一下。
Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開
源項(xiàng)目免費(fèi)提供Git存儲(chǔ),無數(shù)開源項(xiàng)目開始遷移至GitHub,包括jQuery,PHP,Ruby
等等。
歷史就是這么偶然,如果不是當(dāng)年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒有
免費(fèi)而超級(jí)好用的Git了。
集中式VS分布式
閱讀:549874
Linus一直痛恨的CVS及SVN都是集中式的版本控制系統(tǒng),而Git是分布式版本控制系
統(tǒng),集中式和分布式版本控制系統(tǒng)有什么區(qū)別呢?
先說集中式版本控制系統(tǒng).版本庫(kù)是集中存放在中央服務(wù)器的,而干活的時(shí)候,用的都是自己
的電腦,所以要先從中央服務(wù)器取得最新的版本,然后開始干活,干完活「再把自己的活推送
給中央服務(wù)器。中央服務(wù)器就好比是一個(gè)圖書館,你要改一本書,必須先從圖書館借出來,
然后回到家自己改,改完了,再放回圖書館。
集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)內(nèi)還好,帶寬夠大,速
度夠快,可如果在互聯(lián)網(wǎng)上,遇到網(wǎng)速慢的話,可能提交一個(gè)10M的文件就需要5分鐘,
這還不得把人給憋死啊.
那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢?首先,分布式版本控制系統(tǒng)根本
沒有“中央服務(wù)器”,每個(gè)人的電腦上都是一個(gè)完整的版本庫(kù),這樣,你工作的時(shí)候,就不需要聯(lián)
網(wǎng)了,因?yàn)榘姹編?kù)就在你自己的電腦上。既然每個(gè)人電腦上都有一個(gè)完整的版本庫(kù),那多個(gè)人
如何協(xié)作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時(shí),
你們倆之間只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了。
和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因?yàn)槊總€(gè)人電腦里都
有完整的版本庫(kù),某一個(gè)人的電腦壞掉了不要緊,隨便從其他人那里復(fù)制一個(gè)就可以了.市集
中式版本控制系統(tǒng)的中央服務(wù)器要是出了問題,所有人都沒法干活了。
在實(shí)際使用分布式版本控制系統(tǒng)的時(shí)候,其實(shí)很少在兩人之間的電腦上推送版本庫(kù)的修改,
因?yàn)榭赡苣銈儌z不在一個(gè)局域網(wǎng)內(nèi),兩臺(tái)電腦互相訪問不了,也可能今天你的同事病了:他的
電腦壓根沒有開機(jī)。因此,分布式版本控制系統(tǒng)通常也有一臺(tái)充當(dāng)“中央服務(wù)器”的電腦,但這
個(gè)服務(wù)器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不
方便而已。
5一。
當(dāng)然,Git的優(yōu)勢(shì)不單是不必聯(lián)網(wǎng)這么簡(jiǎn)單,后面我們還會(huì)看到Git極其強(qiáng)大的分支管理,把
SVN等遠(yuǎn)遠(yuǎn)拋在了后面。
CVS作為最早的開源而且免費(fèi)的集中式版本控制系統(tǒng),直到現(xiàn)在還有不少人在用。由于
CVS自身設(shè)計(jì)的問題,會(huì)造成提交文件不完整,版本庫(kù)莫名其妙損壞的情況。同樣是開源
而且免費(fèi)的SVN修正了CVS的一些穩(wěn)定性問題,是目前用得最多的集中式版本庫(kù)控制系
統(tǒng)。
除了免費(fèi)的外,還有收費(fèi)的集中式版本控制系統(tǒng),比如IBM的ClearCase(以前是Rat
ionaI公司的,被IBM收購(gòu)了),特點(diǎn)是安裝比Windews還大,運(yùn)行比蝸牛還慢,能用C
1earCase的一般是世界500強(qiáng),他們有個(gè)共同的特點(diǎn)是財(cái)大氣粗,或者人傻錢多。
微軟自己也有一個(gè)集中式版本控制系統(tǒng)叫VSS,集成在VisualStudio中。由于其反人
類的設(shè)計(jì),連微軟自己都不好意思用了.
分布式版本控制系統(tǒng)除了Git以及促使Git誕生的BitKeeper外,還有類似Git的
MercurialBazaar等.這些分布式版本控制系統(tǒng)各有特點(diǎn),但最快、最簡(jiǎn)單也最流行
的依然是Git!
安裝Git
閱讀:1093239
最早Git是在Linux上開發(fā)的,很長(zhǎng)一段時(shí)間內(nèi),GH也只能在Linux和Unix系統(tǒng)二跑。
不過,慢慢地有人把它移植到了Windows上?,F(xiàn)在,Git可以在Linux、Unix、Mac和
Wind。ws這幾大平臺(tái)上正常運(yùn)行了。
要使用Git,第一步當(dāng)然是安裝Git了.根據(jù)你當(dāng)前使用的平臺(tái)來閱讀下面的文字:
在Linux上安裝Git
首先,你可以試著輸入git,看看系統(tǒng)有沒有安裝Git:
$git
Theprogram'git/iscurrent1ynotinstailed。Youcani
nstallitbytyping:
sudoapt—getinsta11git
像上面的命令,有很多Linux會(huì)友好地告訴你Git沒有安裝,還會(huì)告訴你如何安裝Gito
如果你碰巧用Debian或UbuntuLinux,通過一條sudoapt-getinsta11git就可以直
接完成Git的安裝,非常簡(jiǎn)單.
老一點(diǎn)的Debian或UbuntuLinux,要把命令改為$udoaPt-getinsta11
git-core,因?yàn)橐郧坝袀€(gè)軟件也叫GIT(GNUInteractiveTools),結(jié)果Git就只能叫g(shù)i
t-core了。由于Git名氣實(shí)在太大,后來就把GNUInteractiveTools改成gnui
core正式改為gito
如果是其他Linux版本,可以直接通過源碼安裝。先從Git官網(wǎng)下載源碼,然后解壓依次
輸入:。/config,make?sudomakcinstall這幾個(gè)命令安裝就好j'.
在MacOSX上安裝Git
如果你正在使用Mac做開發(fā),有兩種安裝Git的方法.
一是安裝homebrew,然后通過homebrew安裝Git.具體方法請(qǐng)參考homebrew的文
檔:http:〃brew。sh/0
第二種方法更簡(jiǎn)單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成
7Git,不過默認(rèn)沒有安裝,你需要運(yùn)行Xcode,選擇菜單"Xcode"—>"Preferencesn,
在彈出窗口中找到“D。wnl。ads",選擇“CommandLineTo。Is”,點(diǎn)“Insta1P就可
以完成安裝了。
?CO
A
D<xum?M4tion
Ch?kforandinttaJIupdatesazonuUcaltyCheckandln$ullNow
Xcode是Apple官方IDE,功能非常強(qiáng)大,是開發(fā)Mac和iOSApp的必選裝備,而
且是免費(fèi)的!
在Windows上安裝Git
實(shí)話實(shí)說,Windows是最爛的開發(fā)平臺(tái),如果不是開發(fā)Windows游戲或者在IE里港試頁
面,一般不推薦用Windows。不過,既然已經(jīng)上了微軟的賊船,也是有辦法安裝Git的。
Windows下要使用很多Linux/Unix的工具時(shí),需要Cygwin這樣的模擬環(huán)境,Git也一
樣。Cygwin的安裝和配置都比較復(fù)雜,就不建議你折騰「不過,有高人已經(jīng)把模擬環(huán)境和
Git都打包好了,名叫msysgit,只需要下載一個(gè)單獨(dú)的exe安裝程序,其他什么也不用
裝,絕對(duì)好用.
msysgit是Windows版的Git,https://git—:or—windpwsoqithuboioT
載(網(wǎng)速慢的同學(xué)請(qǐng)移步國(guó)內(nèi)鏡像),然后按默認(rèn)選項(xiàng)安裝即可。
安裝完成后,在開始菜單里找至『Git”一)“GitBash”,蹦出一個(gè)類似命令行窗口的東西,
就說明Git安裝成功!
安裝完成后,還需要最后一步設(shè)置,在命令行輸入:
$gitconfig—g1oba1user。name"YourName”
$gitconfig-g1obaluser.emailncmail@examp1Cocom”
因?yàn)镚it是分布式版本控制系統(tǒng),所以,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和Emai1地址。
你也許會(huì)擔(dān)心,如果有人故意冒充別人怎么辦?這個(gè)不必?fù)?dān)心,首先我們相信大家都是善良無
知的群眾,其次,真的有冒充的也是有辦法可查的.
注意gitconfig命令的--globa1參數(shù),用了這個(gè)參數(shù),表示你這臺(tái)機(jī)器上所有的Git倉(cāng)
庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉(cāng)庫(kù)指定不同的用戶名和Email地址。
創(chuàng)建版本庫(kù)
閱讀:1266637
什么是版本庫(kù)呢?版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單理解成一個(gè)目錄,這
個(gè)目錄里面的所有文件都可以被Git管理起來,每個(gè)文件的修改、刪除,Git都能跟蹤,以
便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻可以“還原”。
所以,創(chuàng)建一個(gè)版本庫(kù)非常簡(jiǎn)單,首先,選擇一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄:
$mkdirlearngit
$cdlearngit
$pwd
/Users/michae1/learngit
pwd命令用于顯示當(dāng)前目錄。在我的Mac上,這個(gè)倉(cāng)庫(kù)位于/User$/michael/learngit。
如果你使用Windows系統(tǒng),為了避免遇到各種莫名其妙的問題,請(qǐng)確保目錄名(包括父目錄)
不包含中文.
第二步,通過gitinit命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù):
$gitinit
InitializedemptyGitrepositoryin/Users/michael/learngit
/ogit/
瞬間Git就把倉(cāng)庫(kù)建好了,而且告訴你是一個(gè)空的倉(cāng)庫(kù)(emptyGitrepository),細(xì)心
的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè)。git的目錄,這個(gè)Fl錄是Git來跟蹤管理版本庫(kù)的,沒
事千萬不要手動(dòng)修改這個(gè)目錄里面的文件,不然改亂了,就把Git倉(cāng)庫(kù)給破壞了.
如果你沒有看到。git目錄,那是因?yàn)檫@個(gè)目錄默認(rèn)是隱藏的,用1$-ah命令就可以看見.
也不一定必須在空FI求下創(chuàng)建Gil倉(cāng)庫(kù),選擇一個(gè)已經(jīng)有東西的目錄也是可以的。不過,不
建議你使用自己正在開發(fā)的公司項(xiàng)目來學(xué)習(xí)Git,否則造成的一切后果概不負(fù)責(zé).
把文件添加到版本庫(kù)
首先這里再明確一下,所有的版本控制系統(tǒng),其實(shí)只能跟蹤文本文件的改動(dòng),比如TXT文件,
網(wǎng)頁,所有的程序代碼等等,Git也不例外.版本控制系統(tǒng)可以告訴你每次的改動(dòng),比如在第5
行加了一個(gè)單詞“Linux”,在第8行刪了一個(gè)單詞“Windows”。而圖片、視頻這些二進(jìn)制
文件,雖然也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)用
起來,也就是只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統(tǒng)不知道,也沒
法知道。
不幸的是,Microsoft的Word格式是二進(jìn)制格式,因此,版本控制系統(tǒng)是沒法跟蹤W。rd
文件的改動(dòng)的,前面我們舉的例了?只是為了演示,如果要真正使用版本控制系統(tǒng),就要以純
文本方式編寫文件。
因?yàn)槲谋臼怯芯幋a的,比如中文有常用的GBK編碼,日文有Shi編碼,如果沒有歷
史遺留問題,強(qiáng)烈建議使用標(biāo)準(zhǔn)的UTF-8編碼,所有語言使用同一種編碼,既沒有沖突,
又被所有平臺(tái)所支持.
使用Windows的童鞋要特別注意:
千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發(fā)記
事本的團(tuán)隊(duì)使用了?個(gè)非常弱智的行為來保存UTF—8編碼的文件,他們自作聰明地在每
個(gè)文件開頭添加了Oxefbbbf(十六進(jìn)制)的字符,你會(huì)遇到很多不可思議的問題,比如,網(wǎng)頁
第一行可能會(huì)顯示一個(gè)"?",明明正確的程序一編譯就報(bào)語法錯(cuò)誤,等等,都是由記事本的弱
智行為帶來的。建議你下載地匣用±±代替記事本,不但功能強(qiáng)大,而且免費(fèi)!記得把Note
Pad++的默認(rèn)編碼設(shè)置為UTF-8withoutBOM即可:
言歸正傳,現(xiàn)在我們編寫一個(gè)readme。txt文件,內(nèi)容如下:
Gitisaversioncontrolsystem.
Gitisfreesoftware.
一定要放到1earngit目錄下(子目錄也行),因?yàn)檫@是一個(gè)Git倉(cāng)庫(kù),放到其他地方Git再厲
害也找不到這個(gè)文件。
和把大象放到冰箱需要3步相比,把?個(gè)文件放到Git倉(cāng)庫(kù)只需要兩步.
第一步,用命令gitadd告訴Git,把文件添加到倉(cāng)庫(kù):
$gitaddreadme.txt
執(zhí)行上面的命令,沒有任何顯示,這就對(duì)了,Unix的哲學(xué)是“沒有消息就是好消息”,說明添加成
功。
第二步,用命令gitcommit告訴Git,把文件提交到倉(cāng)庫(kù):
$gitcommit-m"wroteareadmefile^^
[master(root-commit)cb926e7]wroteareadmefile
1filechanged,2insertions(+)
createmode100644readmeotxt
簡(jiǎn)單解釋?下gitcommit命令,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容,當(dāng)然
最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄.
嫌麻煩不想輸入-m”xxx“行不行?確實(shí)有辦法可以這么干,但是強(qiáng)烈不建議你這么干,因
為輸入說明對(duì)自己對(duì)別人閱讀都很重要。實(shí)在不想輸入說明的童鞋請(qǐng)自行Google,我不告
訴你這個(gè)參數(shù).
g11commit命令執(zhí)行成功后會(huì)告訴你,1個(gè)文件被改動(dòng)(我們新添加的readme。tx
t文件),插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)。
為什么Git添加文件需要3dd,commil,共兩步呢?因?yàn)閏ommit可以,次提交很多文件,
所以你可以多次add不同的文件,比如:
$gitaddfi'e1.txt
$gitaddfile2.txtfi1e30txt
$gitcommit-m"add3fileso”
小結(jié)
現(xiàn)在總結(jié)一下今天學(xué)的兩點(diǎn)內(nèi)容:
初始化一個(gè)Git倉(cāng)庫(kù),使用gitinit命令。
添加文件到Git倉(cāng)庫(kù),分兩步:
第一步,使用命令gitadd〈file〉,注意,可反復(fù)多次使用,添加多個(gè)文件;
第二步,使用命令gitcommit,完成。
時(shí)光機(jī)穿梭
閱讀:737834
我們已經(jīng)成功地添加并提交了一個(gè)readme。txt文件,現(xiàn)在,是時(shí)候繼續(xù)工作了,于是,我們
繼續(xù)修改readme,txt文件,改成如下內(nèi)容:
Gitisadistributedversioncontrolsystem.
Gitisfreesoftware.
現(xiàn)在,運(yùn)行g(shù)itstatus命令看看結(jié)果:
$gitstatus
Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitada<fi1e>..o"toupdatewhatwillbecomm
itted)
#(use"gitchockout-----------<filc>o..todiscardchan
gesinworkingdirectory)
#
#modified:readme0txt
nochangesaddedtocommit(use,gitadd"and/or"gitco
mmit一a")
gitstatus命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài),上面的命令告訴我們,readme。t
xt被修改過了,但還沒有準(zhǔn)備提交的修改。
雖然Git告訴我們r(jià)eadme。txt被修改了,但如果能看看具體修改了什么內(nèi)容,自然是
很好的。比如你休假兩周從國(guó)外回來,第一天上班時(shí),已經(jīng)記不清上次怎么修改的readm
e.txt,所以,需要用gitdiff這個(gè)命令看看:
$gitdiffreadneotxt
diff—gita/readneotxtb/readme0txt
index46d49bf.。9247db6100644
-------a/readmeotxt
+++b/readme.txt
@@-1,2+1,2@@
-Gitisaversioncontrolsystem.
+Gitisadistributedversioncontro1system.
Gitisfreesoftwareo
gitdiff顧名思義就是杳看difference,顯示的格式正是Unix通用的diff格式,
可以從上面的命令輸出看到,我們?cè)诘谝恍刑砑恿艘粋€(gè)“distidbuted”單詞。
知道了對(duì)readme。txt作了什么修改后,再把它提交到倉(cāng)庫(kù)就放心多了,提交修改和提交
新文件是一樣的兩步,第一步是gitadd:
$gitaddreadne.txt
同樣沒有任何輸出.在執(zhí)行第二步gitcommit之前,我們?cè)龠\(yùn)行g(shù)itstatus看看當(dāng)前倉(cāng)庫(kù)
的狀態(tài):
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>...”tounstage)
#modified:readme.txt
gitstatus告訴我們,將要被提交的修改包括readme』xt,下一步,就可以放心地提交了:
$gitcommit一m“adddistributed^^
[masterea34578]adddistributed
1fi1echanged,1insertion(+),1deletion(—)
提交后,我們?cè)儆胓itstatus命令看看倉(cāng)庫(kù)的當(dāng)前狀態(tài):
$gitstatus
#Onbranchmaster
nothingtocommit(workingdirectoryc1ean)
Git告訴我們當(dāng)前沒有需要提交的修改,而且,工作目錄是干凈(workingdirectory
clean)的。
小結(jié)
要隨時(shí)掌握工作區(qū)的狀態(tài),使用gitstatus命令。
如果gitstatus告訴你有文件被修改過,用gitdiff可以查看修改內(nèi)容。
版本回退
閱讀:81399
現(xiàn)在,你已經(jīng)學(xué)會(huì)了修改文件,然后把修改提交到Git版本庫(kù),現(xiàn)在,再練習(xí)一次,修改re
adme.txt文件如下:
Gitisadistributedversioncontrolsystem.
GitisfreesoftwaredistributedundertheGPL.
然后嘗試提交:
$gitaddreadne.txt
$gitcommit—m“appendGPL"
[master3628164]appendGPL
1filechanged,linsertion(+),1deletion(一)
像這樣,你不斷對(duì)文件進(jìn)行修改,然后不斷提交修改到版本庫(kù)里,就好比玩RPG游戲時(shí),每
通過一關(guān)就會(huì)自動(dòng)把游戲狀態(tài)存盤,如果某一關(guān)沒過去,你還可以選擇讀取前一關(guān)的狀杰.有
些時(shí)候,在打Boss之前,你會(huì)手動(dòng)存盤,以使萬一打Boss失敗了,可以從最近的地方重新
開始.Git也是一樣,每當(dāng)你覺得文件修改到一定程度的時(shí)候,就可以“保存一個(gè)快照”,這個(gè)快照
在Git中被稱為commit。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個(gè)
commit恢復(fù),然后繼續(xù)工作,而不是把幾個(gè)月的工作成果全部丟失。
現(xiàn)在,我們回顧一下readme。txt文件一共有幾個(gè)版本被提交到Git倉(cāng)庫(kù)里了:
版本1:wroteareadmefile
Gitisaversioncontrolsystem.
Gitisfreesoftware.
版本2:adddistributed
Gitisadistributedversioncontrolsystem.
Gitisfreesoftware<)
版本3:appendGPL
Gitisadistributedversioncontro1system。
GitisfreesoftwaredistributedundertheGPL。
當(dāng)然了,在實(shí)際工作中,我們腦子里怎么可能記得一個(gè)幾千行的文件每次都改了什么內(nèi)容,
不然要版本控制系統(tǒng)干什么.版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄,在G
it中,我們用git1。&命令查看:
$gitlog
commit3628164fb26d48395383f8f31179f24e0882e1eO
Author:MichaelLiao<askxuefeng@gnai1.com)
Date:TueAug2015:11:492013+0800
appendGPL
commitea34578d5496d7dd233c827ed32a8cd576c5ee85
Author:MichaelLiao<askxuefeng@gmail.com>
Date:TueAug2014:53:122013十0800
adddistributed
commitcb926e7ea5Oadllb8f9e909c05226233bf755030
Author;Michae1Liao<askxuefeng@gmai1.com>
Date:MonAug1917:51:552013+0800
wroteareadmefile
gitlog命令顯示從最近到最遠(yuǎn)的提交R志,我們可以看到3次提交,最近的?次是append
GPL,上一次是adddistributed,最早的一次是wroteareadmcfile.如果嫌輸出信息太
多,看得眼花繚亂的,可以試試加上卜pretty=oneline參數(shù):
$gitlog-----pretty=oneline
3628164fb26d48395383f8f31179f24e0882ele0appendGPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85adddistribut
ed
cb926e7ea50adllb8f9e909c05226233bf755030wroteareadm
efile
需要友情提示的是,你看到的一大串類似3628164….882ele0的是commitid(版本
號(hào)),和SVN不一樣,Git的commitid不是1,2,3.......遞增的數(shù)字,而是一個(gè)S
HA1計(jì)算出來的?個(gè)非常大的數(shù)字,用十六進(jìn)制表示,而且你看到的commitid和我的肯
定不一樣,以你自己的為準(zhǔn)。為什么commitid需要用這么一大串?dāng)?shù)字表示呢?因?yàn)镚i
t是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個(gè)版本庫(kù)里工作,如果大家都用
1,2,3……作為版本號(hào),那肯定就沖突了。
每提交一個(gè)新版本,實(shí)際上Git就會(huì)把它們自動(dòng)串成一條時(shí)間線。如果使用可視化工具查看
Git歷史,就可以更清楚地看到提交歷史的時(shí)間線:
好了,現(xiàn)在我們啟動(dòng)時(shí)光穿梭機(jī),準(zhǔn)備把readme.txt回退到上一個(gè)版本,也就是“adddi
stributed”的那個(gè)版本,怎么做呢?
首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,也就是最新的
提交3628164。.。882e1e0(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是H
EAD「上上?個(gè)版本就是HEAD”,退然往I.100個(gè)版本寫100個(gè)人比較容易數(shù)不過來,所
以寫成HEAD-100..
現(xiàn)在,我們要把當(dāng)前版本'appendGPL”回退到上一個(gè)版本“adddistributed,5,就可以
使用gitreset命令:
$gitreset---hardHEAD"
HEADisnowatea34578adddistributed
-hard參數(shù)有啥意義?這個(gè)后面再講,現(xiàn)在你先放心使用。
看看readme.txt的內(nèi)容是不是版本adddistributed:
$catreadme.txt
Gitisadistributedversioncontrolsystem0
Gitisfreesoftware<>
果然。
還可以繼續(xù)回退到上一個(gè)扳本wroteareadmefile,不過且慢,然我們用gitlog再看看
現(xiàn)在版本庫(kù)的狀態(tài):
$git1Og
commitea34578d5496d7dd233c827ed32a8cd576c5ee85
Author:Michae1Liao(askxuefeng@gmai1ocom>
Date:TueAug2014:53:122013+0800
adddistributed
commitcb926e7ea50adllb8f9e909c05226233bf755030
Author:MichaelLiao<askxuefeng@gmailocom)
Dale:MonAug1917:51:552013+0800
wroteareadmefile
最新的那個(gè)版本appendGPL已經(jīng)看不到了!好比你從21世紀(jì)坐時(shí)光穿梭機(jī)來到了19世
紀(jì),想再回去已經(jīng)回不去了,腫么辦?
辦法其實(shí)還是有的,只要上面的命令行窗口還沒有被關(guān)掉,你就可以順著往上找啊找啊:找到
那個(gè)appendGPL的commitid是3628164..。,于是就可以指定回到未來的某個(gè)版本:
$gitreset—hard3628164
HEADisnowat3628164appendGPL
版本號(hào)沒必要寫全,前幾位就可以了,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫前一兩位,因?yàn)镚it
可能會(huì)找到多個(gè)版本號(hào),就無法確定是哪一個(gè)了。
再小心翼翼地看看readme.txt的內(nèi)容:
$catreadme<>txt
Gitisadistributedversioncontro1system。
GitisfreesoftwaredistributedundertheGPLo
果然,我胡漢三又回來了。
Git的版本回退速度非常快,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針,當(dāng)你回退版本
的時(shí)候,Git僅僅是把HEAD從指向appendGPL:
(HEADI
appendGPL
Qadddstribated
Owroteareadmefile
改為指向adddistributed:
(HEADI
QappendGPL
adddstribated
Owroteareadmefile
然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個(gè)版本號(hào),你就把當(dāng)前版本定位在
哪。
現(xiàn)在,你回退到了某個(gè)版本,關(guān)掉了電腦,第二天早上就后悔了,想恢復(fù)到新版本怎么辦?找不
到新版本的Commitid怎么辦?
在Git中,總是有后悔藥可以吃的。當(dāng)你用,gitreset—hardHEAD'回退到adddistr
ibuted版本時(shí),再想恢復(fù)至I」appendGPL,就必須找至ljappendGPL的commitid。Gi
t提供了?個(gè)命令gitreflog用來記錄你的每?次命令:
$gitreflog
ea34578HEAD?{0}:reset:movingtoHEAD
3628164HEAD?{1}:commit:appendGPL
ea34578HEAD@{2}:commit:adddistributed
cb926e7HEAD@{3j:commit(initial):wroteareadmefile
終于舒了口氣,第二行顯示appendGPL的COmmitid是3628164,現(xiàn)在,你又可以
乘坐時(shí)光機(jī)回到未來了。
小結(jié)
現(xiàn)在總結(jié)一下:
HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命
令gitreset--hardcommit_id。
穿梭前,用gitlog可以杳看提交歷史,以便確定要回退到哪個(gè)版本。
要重返未來,用gitreflog查看命令歷史,以便確定要回到未來的哪個(gè)版本。
工作區(qū)和暫存區(qū)
閱讀:536282
Git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念。
先來看名詞解釋。
工作區(qū)(WorkingDirectory)
就是你在電腦里能看到的目錄,比如我的learngit文件夾就是一個(gè)工作區(qū):
800口learngit
皿|■互AlEJ更
IFAVORITES
AirDrop
Applications
DesktopLICENSEreadme.txi
Documents
Downloads
Movies
Music
Pictures
版本庫(kù)(Repository)
工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。
Git的版本庫(kù)里存了很多東西,其中最重要的就是稱為slage(或者叫index)的暫存區(qū),還有
Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。
一工作區(qū)一版本左
DHEAD
Se
t建master
L邑o
屋o
—commit唱
t已
巳?唱
已
巳喧
分支和HEAD的概念我們以后再講。
前面講了我們把文件往Gt版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:
第一步是用gitadd把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
第二步是用gitcommit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本此時(shí),Git自動(dòng)為我們創(chuàng)建J'唯一一個(gè)master分支,所以,現(xiàn)在,
gitcommit就是往master分支上提交更改。
你可以簡(jiǎn)單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有
修改.
俗話說,實(shí)踐出真知?,F(xiàn)在,我們?cè)倬毩?xí)一遍,先對(duì)readme。txt做個(gè)修改,比如加上一行
內(nèi)容:
Gitisadistributedversioncontro1system。
GitisfreesoftwaredistributedundertheGPL.
Githasamutableindexcaliedstage.
然后,在工作區(qū)新增一個(gè)LICENSE文本文件(內(nèi)容隨便寫)。
先用gitstatu$查看一下狀態(tài):
$gitstatus
#Onbranehmaster
#Changesnotstagedforcommit:
#(use“gitadd<file>。。.“toupdatewhatwi11be
committed)
#(use"gitcheckout—<fi1e>?otodiscardchang
esinworkingairectory)
#modified:readme,txt
#Untrackedfiles:
#(use"gitadd<filc)。。.toincludcinwhatwil1bec
ommitted)
#LICENSE
nochangesaddedtocommit(use"gitadd"and/or"git
commit—a”)
Git非常清楚地告訴我們ieadme.txt被修改了,而LICENSE還從來沒有被添加過,所以
它的狀態(tài)是Untracked<>
現(xiàn)在,使用兩次命令gitadd,把readme.txt和LICENSE都添加后,用gitstatus再查看
一下:
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<fi1e>o..”tounstage)
#nerrfi1e:LICENSE
#modified:readme。txt
現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了:
所以,gitadd命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后,執(zhí)行g(shù)itc
ommit就可以一次性把暫存區(qū)的所有修改提交到分支。
$gitcommit-m"understandhowstageworksM
[niasler27c9860]understandhowsIageworks
2fileschanged,675insertions(+)
createmode100644LICENSE
一旦提交后,如果你又沒有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的:
$gitstatus
#Onbranchmaster
nothingtocommit(workingdirectoryclean)
現(xiàn)在版本庫(kù)變成了這樣,暫存區(qū)就沒有任何內(nèi)容了:
L工作區(qū)——版本庫(kù)--------
HEAD
|stage\master
目readme.txtgitcommit
—
邑LICENSEreadme.txt
LICENSE
小結(jié)
暫存區(qū)是Git非常重要的概念,弄明白了暫存區(qū),就弄明白了Git的很多操作到底干了什
么。
沒弄明白暫存區(qū)是怎么回事的童鞋,請(qǐng)向上滾動(dòng)頁面,再看一次。
管理修改
閱讀:474813
現(xiàn)在,假定你已經(jīng)完全掌握了暫存區(qū)的概念。下面,我們要討論的就是,為什么Git比其他版本
控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it跟蹤并管理的是修改,而非文件。
你會(huì)問,什么是修改?比婦你新增了一行,這就是一個(gè)修改,刪除了一行,也是一個(gè)修改,更
改了某些字符,也是一個(gè)修改,刪了一些又加了一些,也是一個(gè)修改,甚至創(chuàng)建一個(gè)新文件,
也算一個(gè)修改。
為什么說Git管理的是修改,而不是文件呢?我們還是做實(shí)驗(yàn)。第一步,對(duì)readme.t
xt做一個(gè)修改,比如加一行內(nèi)容:
$catreadme.txt
Gitisadistributedversioncontrolsystem0
GitisfreesoftwaredistributedundertheGPLo
Githasamutableindexcalledstage。
Gittrackschanges.
然后,添加:
$gitaddreadme.txt
$gitstatus
#Onbranehmaster
#Changestobecommitted:
#(usegitresetHEAD(file)。。."tounstage)
#modified:readmcotxt
#
然后,再修改readmeotxt:
$catreadme.txt
Gitisadistributedversioncontro1system.
GitisfreesoftwaredistributedundertheGPL.
Githasamutableindexca11edstageo
Gittrackschangesoffi1es.
提交:
$gitcommit-m"gittrackschanges”
[masterd4f25b6]gittrackschanges
1filechanged,1insertion(+)
提交后,再看看狀態(tài):
$gitstatus
#0nbranchmaster
#Changesnotstagedforcommit:
#(use,fg1tadd(ftle)。。"toupdatewhatwi11beco
mmitted)
#(use“gitcheckout---〈file〉。。.todiscardch
angesinwork!ngdirectory)
tt
#modified:readme.txt
nochangesaddedtocommit(use"g:taddJ,and/or"gitcom
mit-a”)
咦,怎么第二次的修改沒有被提交?
別激動(dòng),我們回顧一下操作過程:
第一次修改一>gitadd—>第二次修改一>gitcommit
你看,我們前面講了,Git管理的是修改,當(dāng)你用gitadd命令后,在工作區(qū)的第一次修改
被放入暫存區(qū),準(zhǔn)備提交,但是,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以,gitcommit
只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了,第二次的修改不會(huì)被提交。
提交后,用gitdiffHEAD—readme。txt命令可以查看工作區(qū)和版本庫(kù)里面最新版本
的區(qū)別:
$gitdiffHEAD---readine。txt
diff—gita/readme.txtb/readme。txt
index76d770f0.a9c5755100644
--------a/readme0txt
+++b/readmeotxt
@@—1,4+1,4@@
Gitisadistributedversioncontrolsystem0
GitisfreesoftwaredistributedundertheGPL.
Githasamutableindexcal1edstage。
-Gittrackschanges。
+Gittrackschangesoffiles.
可見,第二次修改確實(shí)沒有被提交。
那怎么提交第二次修改呢?你可以繼續(xù)gitadd再gitcommit,也可以別著急提交第一次
修改,先gitadd笫二次修改,再gitcommit,就相當(dāng)于把兩次修改合并后一塊提交了:
第一次修改-〉gitadd->第二次修改一>gitadd—>gitcommit
好,現(xiàn)在,把第二次修改提交了,然后開始小結(jié)。
小結(jié)
現(xiàn)在,你又理解了Git是如何跟蹤修改的,每次修改,如果不add到暫存區(qū),那就不會(huì)加入到
commit中。
撤銷修改
閱讀:463113
自然,你是不會(huì)犯錯(cuò)的。不過現(xiàn)在是凌晨?jī)牲c(diǎn),你正在趕一份工作報(bào)告,你在readme,txt
中添加了一行:
$catreadme.txt
Gitisadistributedversioncontro1system0
GitisfreesoftwaredistributedundertheGPL。
Githasamutableindexca1ledstage。
Gittrackschangesoffiles。
MystupidbossstillprefersSVN.
在你準(zhǔn)備提交前,一杯咖啡起了作用,你猛然發(fā)現(xiàn)了“stupidboss”可能會(huì)讓你丟掉這個(gè)月的
獎(jiǎng)金!
既然錯(cuò)誤發(fā)現(xiàn)得很及時(shí),就可以很容易地糾正它.你可以刪掉最后一行,手動(dòng)把文件恢復(fù)到上
一個(gè)版本的狀態(tài).如果用gitstatus查看一下:
$gitstatus
Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd<fi1e>0..toupdatewhatwil1b
ecommitted)
#(usegitcheckout<file>o.。”todiscare/chang
esinworkingdirectory)
#modified:readme.txt
#
nochangesaddedtocommit(use"gitadd"and/or"gitcommi
t—a”)
你可以發(fā)現(xiàn),Git會(huì)告訴你,gitcheckout-file可以丟棄工作區(qū)的修改:
$gitcheckout-----readmeotxt
命令gitcheckout—readme.txt意思就是,把readme,txt文件在工作區(qū)的修改全
部撤銷,這里有兩種情況:
一種是readme.t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省2024廣東省毒品實(shí)驗(yàn)技術(shù)中心招聘博士研究生1人筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 屏山縣2024四川宜賓市屏山縣統(tǒng)計(jì)局招考編外工作人員1人筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 始興縣2024廣東韶關(guān)市始興縣青年就業(yè)見習(xí)基地招募1人(市場(chǎng)監(jiān)管局)筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 國(guó)家事業(yè)單位招聘2024微生物所中國(guó)科學(xué)院病原微生物與免疫學(xué)重點(diǎn)實(shí)驗(yàn)室高福研究組招聘1人啟筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 四子王旗2024內(nèi)蒙古烏蘭察布四子王旗招聘27名會(huì)計(jì)綜合服務(wù)項(xiàng)目評(píng)審崗位專業(yè)人員筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 南部縣2024上半年四川南充市南部縣事業(yè)單位考調(diào)10人筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 2025年中國(guó)航空工業(yè)集團(tuán)凱天崗位招聘?jìng)淇碱}庫(kù)及答案詳解參考
- 2025年西藏革吉縣農(nóng)業(yè)農(nóng)村和科技水利局招聘工程專業(yè)技術(shù)人員和工程項(xiàng)目資料員招聘5人備考題庫(kù)及完整答案詳解一套
- 2025年淮濱縣司法局公開招聘合同制社區(qū)矯正社會(huì)工作者12人實(shí)施備考題庫(kù)及一套完整答案詳解
- 2025年中國(guó)光大銀行光大理財(cái)社會(huì)招聘?jìng)淇碱}庫(kù)有答案詳解
- 從庫(kù)存積壓到爆款頻出:POP趨勢(shì)網(wǎng)如何重塑女裝設(shè)計(jì)師的工作邏輯1216
- 2025吐魯番市高昌區(qū)招聘第二批警務(wù)輔助人員(165人)考試歷年真題匯編帶答案解析
- DRG支付改革下臨床科室績(jī)效優(yōu)化策略
- 2026中央紀(jì)委國(guó)家監(jiān)委機(jī)關(guān)直屬單位招聘24人筆試備考題庫(kù)含答案解析(奪冠)
- 平面包裝設(shè)計(jì)創(chuàng)新創(chuàng)業(yè)
- 加盟2025年房地產(chǎn)經(jīng)紀(jì)協(xié)議合同
- 2025至2030中國(guó)商業(yè)攝影行業(yè)市場(chǎng)發(fā)展分析及發(fā)展前景預(yù)測(cè)與投資風(fēng)險(xiǎn)報(bào)告
- 地球系統(tǒng)多源數(shù)據(jù)融合-洞察及研究
- 香水銷售知識(shí)培訓(xùn)內(nèi)容課件
- 工業(yè)產(chǎn)品早期可制造性評(píng)估標(biāo)準(zhǔn)
- DB45-T 2757.1-2023 交通運(yùn)輸行業(yè)安全風(fēng)險(xiǎn)評(píng)估規(guī)范 第1部分:總則
評(píng)論
0/150
提交評(píng)論