十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
? git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。
創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元金塔做網(wǎng)站,已為上家服務(wù),為金塔各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
? 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)嗎?因?yàn)長(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了。
(此種安裝的1.8,版本太老,可以學(xué)習(xí)用,生成環(huán)境建議用第二種方式):


(3)安裝成功后,運(yùn)行如下命令:

新建目錄git_test,在git_test目錄下創(chuàng)建一個(gè)版本庫(kù),命令:git init

可以看到在git_test目錄下創(chuàng)建了一個(gè).git隱藏目錄,這就是版本庫(kù)目錄。
① 在版本庫(kù)中創(chuàng)建文件的時(shí)候,就有了文件的第一個(gè)版本,于此同時(shí)會(huì)生成一個(gè)指針指向這個(gè)版本

② 當(dāng)修改了code.txt中的內(nèi)容以后,就生成了第二個(gè)版本,但是這個(gè)版本是依賴上一個(gè)版本的,在這個(gè)版本中僅僅會(huì)記錄文件發(fā)生了那些修改。在有了一個(gè)新版本之后,這個(gè)指針會(huì)指向最新的版本。

③ 通過修改指針的位置可以實(shí)現(xiàn)回退到某個(gè)版本,表示方式有兩種,一種是用^,一種使用~,如下
l HEAD^ 或者 HEAD~1:表示上一個(gè)版本
l HEAD^^ 或者 HEAD~2:表示上兩個(gè)版本
通過上面的方式回退到第一個(gè)版本之后,指針就指向了版本1

(1) 在git_test目錄下創(chuàng)建一個(gè)文件code.txt,寫入一行內(nèi)容如下:

(2) 使用如下兩條命令可以創(chuàng)建一個(gè)版本,創(chuàng)建版本需要兩步:
① git add code.txt
② git commit –m '版本1'

(3) 查看版本記錄,命令是git log:

(4) 繼續(xù)編輯code.txt,在里面增加一行。

(5) 使用如下命令再創(chuàng)建一個(gè)版本并查看版本記錄:


(6) 現(xiàn)在若想回到某一個(gè)版本,可以使用如下命令:
git reset --hard HEAD^
其中HEAD表示當(dāng)前最新版本,HEAD^表示當(dāng)前版本的前一個(gè)版本,HEAD^^表示當(dāng)前版本的前前個(gè)版本,也可以使用HEAD~1表示當(dāng)前版本的前一個(gè)版本,HEAD~100表示當(dāng)前版本的前100版本。
現(xiàn)在若覺得想回到版本1,可以使用如下命令:



執(zhí)行命令后使用git log查看版本記錄,發(fā)現(xiàn)現(xiàn)在只能看到版本1的記錄,cat code.txt查看文件內(nèi)容,現(xiàn)在只有一行,也就是第一個(gè)版本中code.txt的內(nèi)容。
(7) 假如我們現(xiàn)在又想回到版本2,這個(gè)時(shí)候怎么辦?
可以使用如下命令:
git reset --hard 版本號(hào)
從上面可以看到版本2的版本號(hào)為:

(8) 根據(jù)查詢到的序號(hào)進(jìn)行版本選擇:


現(xiàn)在發(fā)現(xiàn)版本2有回來了??梢詂at code.txt查看其里面的內(nèi)容如下:
(9) 假如說上面的終端已經(jīng)關(guān)了改怎么回退版本。
我們?cè)趫?zhí)行如下命令將版本回退到版本1。

下面把終端關(guān)了,然后再打開終端,發(fā)現(xiàn)之前版本2的版本號(hào)看不到了。

那么怎么再回到版本2呢?git reflog命令可以查看我們的操作記錄。

可以看到版本2的版本號(hào),我們?cè)偈褂萌缦旅钸M(jìn)行版本回退,版本重新回到了版本2。

電腦中的目錄,比如我們的git_test,就是一個(gè)工作區(qū)。
l 工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不是工作區(qū),而是git的版本庫(kù)。
l git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有g(shù)it為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。
l 因?yàn)槲覀儎?chuàng)建git版本庫(kù)時(shí),git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以,現(xiàn)在,git commit就是往master分支上提交更改。
l 你可以簡(jiǎn)單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。

前面講了我們把文件往git版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:
第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
(1) 下面在git_test目錄下再創(chuàng)建一文件code2.txt,然后編輯內(nèi)容如下:


(2) 然后再次編輯code.txt內(nèi)容,在其中加入一行,編輯后內(nèi)容如下:

(3) 使用如下命令查看當(dāng)前工作樹的狀態(tài):
git status

上面提示我們code.txt被修改,而code2.txt沒有被跟蹤。
(4) 我們使用如下命令把code.txt和code2.txt加入到暫存區(qū),然后再執(zhí)行g(shù)it status命令,結(jié)果如下:

所有g(shù)it add命令是把所有提交的修改存放到暫存區(qū)。
(5) 然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支創(chuàng)建一個(gè)版本。


(6) 一旦提交后,如果你又沒有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的。執(zhí)行如下命令可以發(fā)現(xiàn):

git管理的文件的修改,它只會(huì)提交暫存區(qū)的修改來創(chuàng)建版本。
(1) 編輯code.txt,并使用git add 命令將其添加到暫存區(qū)中。


添加到緩存區(qū)

再添加一行

(2) git commit創(chuàng)建一個(gè)版本,

此時(shí)并使用git status查看,發(fā)現(xiàn)狀態(tài)不是clean

這是因?yàn)榈诙涡薷腸ode.txt內(nèi)容之后,并沒有將其添加的工作區(qū),所以創(chuàng)建版本的時(shí)候并沒有被提交。
(1) 繼續(xù)上面的操作,提示我們可以使用格式來撤銷操作,也就是丟棄工作區(qū)中你的修改:
git checkout -- <文件>
執(zhí)行如下命令,

發(fā)現(xiàn)工作區(qū)干凈了,

第二次的改動(dòng)內(nèi)容也沒了。

(1) 前面所演示的是尚未添加到暫存區(qū)中的內(nèi)容進(jìn)行回滾,其實(shí),即使加入到了暫存區(qū),也是開始可以回滾的。
我們繼續(xù)編輯code.txt,并在其中添加如下內(nèi)容 

并將其添加的暫存區(qū)

(3)git同樣告訴我們,用命令git reset [選項(xiàng)] HEAD file可以把暫存區(qū)的修改撤銷掉,重新放回工作區(qū)。
選項(xiàng)有三個(gè)
l --hard:緩存區(qū)和工作目錄中的內(nèi)容都回滾到指定的那個(gè)版本狀態(tài)
l --mixed:默認(rèn)選項(xiàng),緩存區(qū)和你指定的提交同步,但是工作目錄不受影響
l --soft:緩存區(qū)和工作目錄中的內(nèi)容都不變(僅僅庫(kù)中的內(nèi)容回滾的指定版本)
l 使用這些選項(xiàng)的時(shí)候,就不能再指定具體的文件了

狀態(tài)

到這里,僅僅是保存在將暫存區(qū)中的內(nèi)容刪除了,接下來就可以將這個(gè)文件回滾到修改之前的狀態(tài)
(4)現(xiàn)在若想丟棄code.txt的修改,執(zhí)行如下命令即可。


現(xiàn)在,如果你不但改錯(cuò)了東西,還從暫存區(qū)提交到了版本庫(kù),則需要進(jìn)行版本回退。
小結(jié):
l 場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file。
l 場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作。
l 場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交,參考版本回退一節(jié)。
來演示三個(gè)選項(xiàng)的作用
先來演示hard選項(xiàng)
1 在版本庫(kù)中編輯一個(gè)文件1,并add到暫存區(qū)

2 編輯另一個(gè)文件(不保存到暫存區(qū))

3 查看狀態(tài),一個(gè)在暫存區(qū) 一個(gè)是未追蹤狀態(tài)

4 用git reset --hard xxxx 回滾到一個(gè)狀態(tài)

5 再次查看狀態(tài)(此時(shí)發(fā)現(xiàn)是clean,什么狀態(tài)的都沒有了)

6 這兩個(gè)文件中新添加的內(nèi)容都沒了

先來演示soft選項(xiàng)
前面部分略
1 執(zhí)行 reset,回滾到第一個(gè)版本

2 此時(shí)暫存區(qū)和文件中的內(nèi)容都還在

3 查看當(dāng)前所處的版本,已經(jīng)回到了第一個(gè)版本,其他的版本都沒了

對(duì)比工作區(qū)和某個(gè)版本中文件的不同:
(1) 繼續(xù)編輯文件code.txt,在其中添加一行內(nèi)容。

(2) 現(xiàn)在要對(duì)比工作區(qū)中code.txt和上個(gè)版本中code.txt的不同。使用如下命令:

我們也可以和版本庫(kù)中的第二個(gè)版本做比對(duì)

對(duì)比兩個(gè)版本間文件的不同:
(1) 現(xiàn)在要對(duì)比HEAD和HEAD^版本中code.txt的不同,使用如下命令:

(1) 我們把目錄中的code2.txt刪除。

這個(gè)時(shí)候,git知道刪除了文件,因此,工作區(qū)和版本庫(kù)就不一致了,git status命令會(huì)立刻提示哪些文件被刪除了。

(2) 現(xiàn)在你有兩個(gè)選擇,一是確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉,并且git commit:



另一種情況是刪錯(cuò)了,可以直接使用git checkout – code2.txt,這樣文件code2.txt又回來了。
小結(jié):