Git簡介
在我們的認知范圍Git和SVN都是對于代碼托管的工具,那么這兩者又有什么不同呢?
Git是世界上先進的「分布式的版本控制系統(tǒng)」,而
SVN是「集中式的版本控制系統(tǒng)」,SVN對于版本的管理集中于中央服務器中,而Git對于版本的管理可以在本地。
SVN管理的模式從SVN服務器中拉取代碼,然后開始自己的開發(fā),開發(fā)完后再向SVN服務器提交代碼,所以集中式的版本管理,需要聯(lián)網(wǎng)才能進行,一旦沒網(wǎng)就沒辦法向SVN服務器提交代碼。
而Git是分布式的版本管理,每個開發(fā)者的本地都會有完整的版本庫,不需要來聯(lián)網(wǎng),也能進行版本的管理和代碼的提交,每個開發(fā)者都可以在本地進行提交代碼、查看版本、切換分支等操作。
所以相對于SVN來說Git的存儲也會相對比較占用空間,但是以空間換來了Git對版本管理的高效,不得不說是一種高明的策略。
Git安裝
Git可以安裝在Windows或者Linux,安裝在Windows相信大家都會,基本就是下載軟件,然后傻瓜式操作,再Windows安裝后,就會有Git GUI Here以及Git Bash Here。
Git Bash Here就是我們用來敲命令的窗口,打開它就可以敲關于Git的命令進行進行操作。
Windows的Git下載地址:https://git-scm.com/downloads,在這里下載最新版的進行安裝即可。
下面我們來說一下Git再Linux的安裝過程,要在安裝Git其實也非常簡單,可以直接使用yum源進行安裝,一句命令就搞定了:
sudo?yum?install?git
Git的配置
安裝完Git后就開始對Git進行配置操作,配置自己用戶名和Email,配置的命令如下:
$?git?config?--global?user.name "lidu" //?用戶名
$?git?config?--global?user.email "lidu@example.com" //?填你自己的qq郵箱
配置完信息后,就可以「創(chuàng)建目錄,并且初始化自己的本地倉庫」了:
$?mkdir?github
$ cd github
$ pwd /e/github
$?git?init??//?初始化本地倉庫
Initialized?empty?Git?repository in /e/github/.git/
我這里已經(jīng)初始化過了,初始化后會默認在主干上(master),這里為了測試各種Git的各種命令使用本地的Git倉庫與github進行關聯(lián)。
本地倉庫與Github關聯(lián)
在你的c盤下面有一個.ssh文件夾,進入文件夾里面可以看到有id_rsa.pub和id_rsa兩個文件,第一個文件是id_rsa.pub里面的信息是公鑰,而第二個文件是私鑰。
加入沒有這兩個文件,可以使用以下命令進行生成:
$?ssh-keygen?-t?rsa?-C "你注冊的郵箱"
接著就是把自己的公鑰復制粘貼配置到Github上的SSH Keys頁面中,快捷地址:https://github.com/settings/ssh ,
在Github上配置完自己的公鑰后,就可以在Github中創(chuàng)建倉庫進行測試,在Github的右上角中找到:create a new repo,創(chuàng)建一個新的倉庫:
這樣就簡單的創(chuàng)建自己的Github的倉庫了,創(chuàng)建完后就可以把自己的本地倉庫文件同步到GitHub中,使用一下命令:
git?remote?add?origin?https://github.com/liduchang/redis.git
git?push?-u?origin?master(由于新建的GitHub倉庫是空的,所以第一次推送master分支時需要加-u參數(shù),以后再推送就不用加了)
這樣你本地的Reids目錄下的文件與Github進行了關聯(lián),只要在Redis目錄中修改了文件,就可以使用git push origin master推向遠程的Github倉庫。
這有一點說明的就是這里配置的是https的方式,可以配置成ssh的方式,因為http上的方式每次推向遠程倉庫的時候都會讓你輸入密碼,有點麻煩:
切換的方法,如下圖所示,只要跟著下面的命令進行操作就能隨意進行協(xié)議的切換了,還是比較簡單的,這里就直接略過:
Git原理
上面說了那么多就是簡簡單單的對Git進行介紹,做一個簡單的入門,下面就開始Git的原理的深入的剖析。
在Git中有四個概念:「遠程倉庫、工作區(qū)、暫存區(qū)、版本庫」。遠程倉庫就是我們Git的服務器,用于存儲已經(jīng)管理團隊的代碼。
工作區(qū)、暫存區(qū)、版本庫是我們本地的,例如當我們初始化git init后,就會在當前的目錄下出現(xiàn).git目錄,「redis目錄就是我們的工作區(qū),而.git目錄是我們的版本庫所有的版本信息都在這里」。
在.git目錄下index文件(.git/index),這就是「暫存區(qū)」,叫做stage或者index,index和我們的數(shù)據(jù)庫的index類似,所以我們有時候也叫它為「索引」。
這四個區(qū)域實現(xiàn)的原理圖所下所示,使用過Git的對于下面的命令再熟悉不過了。
從原理圖中可以看出代碼可以在不同的level之間轉移,也可以跨level之間轉移,所有的這些動作都是通過Git的命令去實現(xiàn)。
初始化的時候Git還會自動為我們創(chuàng)建第一個分支master,以及指向master的一個指針叫做HEAD。
克隆項目
在我們實際的工作環(huán)境中,都會從服務器上進行克隆項目到本地,Git中使用git clone命令可以進行克隆項目:
git clone https://github.com/liduchang/redis
執(zhí)行git clone就會生成一份副本,在本地倉庫和工作區(qū)都會同步副本,具體的原理圖如下所示:
提交代碼
從上面的圖中我們可以到,代碼可以在不同level之間移動,高level到低level,或者逆向低level到高level,也可以跨level之間移動。
Git中代碼從低level到高leve的移動主要依靠以下命令:
-
git add .:文件添加進暫存區(qū)。
-
git commit -m "提交信息":文件添加進本地倉庫,-m參數(shù)改為-am可以直接推向本地倉庫。
-
git push:文件推向遠程倉庫。
運行git commit -a相當于運行git add把所有文件加入暫存區(qū),然后再運行git commit把文件提交本地倉庫。
代碼回退
那么從高level向低level移動代碼的命令如下:
-
git pull:從遠程倉庫拉取代碼到本地。
-
git reset --files:用本地倉庫覆蓋暫存區(qū)中修改,也就是覆蓋最后一次git add的內(nèi)容。
-
git checkout --files:把文件從暫存區(qū)復制到工作區(qū),用于放棄本地的修改。
-
git checkout HEAD --files:回退最后一次的提交內(nèi)容。
下面我用自己本地與github的操作測試上面的命令,加深對上面的命令的理解和使用,當我在本地新建一個github倉庫中沒有的文件:
可以看到文件的顯示Untracked files:未被追蹤的文件,「表示該文件未被git追蹤管理」。
新添加的文件可以通過「git add添加到在暫存區(qū)」,「這樣文件就能夠被git進行追蹤」,此時再使用git status查看文件時,就可以看到兩個文件已經(jīng)是以new file的形式進行顯示:
版本回退
若是你想撤銷提交到暫存區(qū)的內(nèi)容,使用git reset,可以撤銷向暫存區(qū)新添加的文件:
也可以在使用命令:git reset --hard HEAD^,表示回退上一個版本,「在Git中HEAD表示當前版本,HEAD^表示上一個版本」,若是有多個版本,這樣表示就不方便了,可以使用HEAD~10,表示版本的次數(shù)。
在Git每一個commit都會有自己的commit的ID,可以通過git log進行查看:

commit的本質就是:「每次Git都會用暫存區(qū)的文件創(chuàng)建一個新的提交,把當前的分支指向新的提交節(jié)點,這樣就完成了一次新的提交」:
若是HEAD指針指向的是bran分支,那么新的節(jié)點就會成為jh509的子節(jié)點,并且形成新的分支:
也就可以使用git log --pretty=oneline:直接輸出commit的ID,信息比較簡短,然后直接指定ID的回退:
$?git?reset?--hard??5567a
當你再次檢查你的代碼的時候就會回到了id為5567a版本,在Git的版本回退原理中,Git的內(nèi)部有一個指向當前版本的HEAD指針,只要從當前版本指回去就行了,所以Git版本的回退是特別快的,只需要移動指針,實現(xiàn)的原理圖如下所示:
撤銷修改
丟棄工作區(qū)的修改使用:git checkout -- file命令,這條命令中的--files是不能漏的,若是只是git checkout就表示切換另一條分支的命令了。
在我的本地我直接修改:README.md文件,然后使用git status進行查看,他表示文件處于modified狀態(tài):
此時的README.md文件是還沒有被添加進暫存區(qū)的,可以直接使用以下命令,撤銷掉工作區(qū)的修改:
git?checkout?--?README.md
若是已經(jīng)添加到暫存區(qū)了,使用以下的命令進行回撤:
git?reset?HEAD?README.md
上面也演示了git reset命令,它既可以回退版本,又可以把暫存區(qū)的修改回退到工作區(qū)。當我們用HEAD時,表示最新的版本。
當你提交了修改后,可以使用git diff查看兩次提交之間的變動,它的本質就是「任意比較兩個倉庫之間的差異」:
刪除文件
在工作區(qū)直接使用rm fileName,這個操作和linux的命令一樣,若是文件已經(jīng)提交版本庫,從版本庫中刪除文件可以使用git rm命令進行刪除,然后提交:
$?git?rm?README.md
$?git?commit?-m "remove?README.md"
若是刪除錯了,可以使用git checkout -- README.md進行恢復,其原理就是使用版本庫的文件替換工作區(qū)的文件。
代碼沖突
在團隊中集體使用Git的時候,每個人都提交自己的代碼最后合并到主干,總有會push失敗的時候,因為push的本質:「就是用你本地倉庫的commit記錄去覆蓋遠程倉庫的commit記錄」。
但是別人提交了一些代碼,而你本地并沒有這些代碼,這樣代碼就會被覆蓋,導致別人的commit的記錄就不存在,這個是絕對不允許的。
所以,每次push的時候Git就會檢查,若是存在這種情況就是push失敗,只要先git pull一下,將本地倉庫與遠程倉庫先合并一下,最后push就可以成功了,若是文件中已經(jīng)存在在沖突代碼,只要打開文件重新解決一下沖突即可。
這是圖解Git的第一篇,限于篇幅,我們下一篇繼續(xù)圖解Git操作,下一期間見。
免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!