github使用手冊(cè)資料_第1頁
github使用手冊(cè)資料_第2頁
github使用手冊(cè)資料_第3頁
github使用手冊(cè)資料_第4頁
github使用手冊(cè)資料_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論