一现使、什么是 Git
Git 是一個(gè)開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目剧腻。
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件粤咪,與常用的版本控制工具 CVS, Subversion(svn) 等不同斋日,它采用了分布式版本庫(kù)的方式,不必服務(wù)器端軟件支持挠羔。
二井仰、Git和 SVN 之間的區(qū)別
GIT 不僅僅是個(gè)版本控制系統(tǒng),它也是個(gè)內(nèi)容管理系統(tǒng) (CMS), 工作管理系統(tǒng)等破加。
( 一 ) GIT 是分布式的俱恶,SVN 不是:這是 GIT 和其它非分布式的版本控制系統(tǒng),例如
SVN,CVS 等合是,最核心的區(qū)別了罪。
( 二 ) GIT 把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而 SVN 是按文件:所有的資源控制系統(tǒng)都是把文件的元信息隱藏在一個(gè)類似 .svn,.cvs 等的文件夾里聪全。
( 三 ) GIT分支和 SVN的分支不同:分支在 SVN 中一點(diǎn)不特別捶惜,就是版本庫(kù)中的另外的一個(gè)目錄。
( 四 ) GIT沒(méi)有一個(gè)全局的版本號(hào)荔烧,而 SVN有:目前為止這是跟 SVN相比 GIT 缺少的最大的一個(gè)特征吱七。
( 五) GIT 的內(nèi)容完整性要優(yōu)于SVN:GIT 的內(nèi)容存儲(chǔ)使用的是SHA-1 哈希算法。這能確保代碼內(nèi)容的完整性鹤竭,確保在遇到磁盤故障和網(wǎng)絡(luò)問(wèn)題時(shí)降低對(duì)版本庫(kù)的破壞踊餐。
三、安裝 Git
在使用 Git 前我們需要先安裝 Git臀稚。
Git 目前支持 Linux/Unix吝岭、Solaris、Mac 和 Windows 平臺(tái)上運(yùn)行吧寺。
Git 各平臺(tái)安裝包下載地址為:http://git-scm.com/downloads 這里我們以 Windows 系統(tǒng)為例:
在 Windows 平臺(tái)上安裝 Git 同樣輕松窜管,有個(gè)叫做 msysGit 的項(xiàng)目提供了安裝包, 可以到 GitHub 的頁(yè)面上下載 exe 安裝文件并運(yùn)行:
安裝包下載地址:http://msysgit.github.io/
完成安裝之后稚机,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了幕帆,另外還有一個(gè)圖形界面的 Git 項(xiàng)目管理工具。
在開始菜單里找到"Git"->"Git Bash"赖条,會(huì)彈出 Git 命令窗口失乾,你可以在該窗口進(jìn)行Git 操作。
msysgit 是 windows 版的 Git, 如下:
會(huì)彈出一個(gè)類似的命令窗口的東西仿贬,就說(shuō)明 Git 安裝成功纽竣。如下:
安裝完成后,還需要最后一步設(shè)置茧泪,在命令行輸入如下:
因?yàn)?Git 是分布式版本控制系統(tǒng)蜓氨,所以需要填寫用戶名和郵箱作為一個(gè)標(biāo)識(shí)。
注意:git config –global 參數(shù)调炬,有了這個(gè)參數(shù)语盈,表示你這臺(tái)機(jī)器上所有的 Git 倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然你也可以對(duì)某個(gè)倉(cāng)庫(kù)指定的不同的用戶名和郵箱缰泡。
四刀荒、 Git 的工作流程
(一)克隆 Git 資源作為工作目錄代嗤。
( 二 ) 在克隆的資源上添加或修改文件。
( 三 ) 如果其他人修改了缠借,你可以更新資源干毅。
( 四 ) 在提交前查看修改。
( 五 ) 提交修改泼返。
( 六 ) 在修改完成后硝逢,如果發(fā)現(xiàn)錯(cuò)誤,可以撤回提交并再次修改并提交绅喉。下圖展示了 Git 的工作流程:
五渠鸽、Git 的工作區(qū)、暫存區(qū)柴罐、版本庫(kù)
(一)基本概念
我們先來(lái)理解下 Git 工作區(qū)徽缚、暫存區(qū)和版本庫(kù)概念
1.工作區(qū):就是你在電腦里能看到的目錄。
暫存區(qū):英文叫 stage,或 index革屠。一般存放在 ".git目錄下 " 下的 index 件(.git/index)中凿试,所以我們把暫存區(qū)有時(shí)也叫作索引(index)。
-
版本庫(kù):工作區(qū)有一個(gè)隱藏目錄 .git似芝,這個(gè)不算工作區(qū)那婉,而是 Git 的版本庫(kù)。下面這個(gè)圖展示了工作區(qū)党瓮、版本庫(kù)中的暫存區(qū)和版本庫(kù)之間的關(guān)系:
圖片.png
(1)圖中左側(cè)為工作區(qū)详炬,右側(cè)為版本庫(kù)。在版本庫(kù)中標(biāo)記為 "index" 的區(qū)域是存區(qū)
(stage, index)麻诀,標(biāo)記為 "master" 的是 master 分支所代表的目錄樹痕寓。
(2)圖中我們可以看出此時(shí) "HEAD" 實(shí)際是指向 master 分支的一個(gè)" 游標(biāo)"傲醉。所以圖示的命令中出現(xiàn) HEAD 的地方可以用 master 來(lái)替換蝇闭。
(3)圖中的 objects 標(biāo)識(shí)的區(qū)域?yàn)?Git 的對(duì)象庫(kù),實(shí)際位于 ".git/objects" 目錄下硬毕,里面包含了創(chuàng)建的各種對(duì)象及內(nèi)容呻引。
(4)當(dāng)對(duì)工作區(qū)修改(或新增)的文件執(zhí)行 "git add" 命令時(shí),暫存區(qū)的目錄樹被更新吐咳,同時(shí)工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對(duì)象庫(kù)中的一個(gè)新的對(duì)象中逻悠,而該對(duì)象的 ID 被記錄在暫存區(qū)的文件索引中。
(5)當(dāng)執(zhí)行提交操作(git commit)時(shí)韭脊,暫存區(qū)的目錄樹寫到版本庫(kù)(對(duì)象庫(kù))中童谒,
master 分支會(huì)做相應(yīng)的更新。即 master 指向的目錄樹就是提交時(shí)暫存區(qū)的目錄樹沪羔。
(6)當(dāng)執(zhí)行 "git reset HEAD" 命令時(shí)饥伊,暫存區(qū)的目錄樹會(huì)被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響琅豆。
(7)當(dāng)執(zhí)行 "git rm --cached <file>" 命令時(shí)愉豺,會(huì)直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變茫因。
(8)當(dāng)執(zhí)行 "git checkout ." 或者 "git checkout -- <file>" 命令時(shí)蚪拦,會(huì)用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個(gè)操作很危險(xiǎn)冻押,會(huì)清除工作區(qū)中未添加到暫存區(qū)的改動(dòng)驰贷。
(9)當(dāng)執(zhí)行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時(shí), 會(huì)用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件洛巢。這個(gè)命令也是極具危險(xiǎn)性的饱苟,因?yàn)椴坏珪?huì)清除工作區(qū)中未提交的改動(dòng),也會(huì)清除暫存區(qū)中未提交的改動(dòng)狼渊。
六箱熬、Git 具體操作
( 一 ) 創(chuàng)建版本庫(kù)。
什么是版本庫(kù)狈邑?版本庫(kù)又名倉(cāng)庫(kù)城须,英文名 repository, 你可以簡(jiǎn)單的理解一個(gè)目錄, 這個(gè)目錄里面的所有文件都可以被Git 管理起來(lái)米苹,每個(gè)文件的修改糕伐,刪除,Git都能跟蹤蘸嘶, 以便任何時(shí)刻都可以追蹤歷史良瞧,或者在將來(lái)某個(gè)時(shí)刻還可以將文件”還原”。
所以創(chuàng)建一個(gè)版本庫(kù)也非常簡(jiǎn)單训唱,如下我是 D盤 –> www下 目錄下新建一 testgit 版本庫(kù)褥蚯。
pwd 命令是用于顯示當(dāng)前的目錄。
通過(guò)命令 git init把這個(gè)目錄變成 git 可以管理的倉(cāng)庫(kù)况增,如下:
這時(shí)候你當(dāng)前 testgit 目錄下會(huì)多了一個(gè) .git 的目錄赞庶,這個(gè)目錄是 Git 來(lái)跟蹤管理版本的,沒(méi)事千萬(wàn)不要手動(dòng)亂改這個(gè)目錄里面的文件澳骤,否則歧强,會(huì)把git 倉(cāng)庫(kù)給破壞了。如下:
2.把文件添加到版本庫(kù)中为肮。
首先要明確下摊册,所有的版本控制系統(tǒng),只能跟蹤文本文件的改動(dòng)颊艳,比如 txt 文件茅特,網(wǎng)頁(yè)蟆沫,所有程序的代碼等,Git 也不列外温治,版本控制系統(tǒng)可以告訴你每次的改 動(dòng)饭庞,但是圖片, 視頻這些二進(jìn)制文件熬荆,雖能也能由版本控制系統(tǒng)管理舟山,但沒(méi)法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)串起來(lái)卤恳,也就是知道圖片從 1kb 變成 2kb累盗,但是到底改了啥,版本控制也不知道突琳。
我在版本庫(kù) testgit 目錄下新建一個(gè)記事本文件 readme.txt 內(nèi)容如下:11111111
第一步:使用命令 git add readme.txt添加到暫存區(qū)里面去若债。如下:
如果和上面一樣,沒(méi)有任何提示拆融,說(shuō)明已經(jīng)添加成功了蠢琳。
第二步:用命令 git commit 告訴 Git,把文件提交到倉(cāng)庫(kù)镜豹。
說(shuō)明沒(méi)有任何文件未提交趟脂,但是我現(xiàn)在繼續(xù)來(lái)改下 readme.txt 內(nèi)容泰讽,比如我在下面添加一行 2222222222 內(nèi)容,繼續(xù)使用 git status 來(lái)查看下結(jié)果昔期,如下:
上面的命令告訴我們 readme.txt 文件已被修改已卸,但是未被提交的修改。
接下來(lái)我想看下 readme.txt 文件到底改了什么內(nèi)容硼一,如何查看呢累澡?可以使用如下命令:
git diff readme.txt 如下:
如上可以看到,readme.txt 文件內(nèi)容從一行 11111111 改成 二行 添加了一行
22222222 內(nèi)容欠动。
知道了對(duì) readme.txt 文件做了什么修改后永乌,我們可以放心的提交到倉(cāng)庫(kù)了,提交修改和提交文件是一樣的 2 步 ( 第一步是 git add 第二步是:git commit)具伍。
如下:
( 二 ) 版本回退:
如上,我們已經(jīng)學(xué)會(huì)了修改文件圈驼,現(xiàn)在我繼續(xù)對(duì) readme.txt 文件進(jìn)行修改人芽,再增加一行
內(nèi)容為 33333333333333. 繼續(xù)執(zhí)行命令如下:
現(xiàn)在我已經(jīng)對(duì) readme.txt 文件做了三次修改了,那么我現(xiàn)在想查看下歷史記錄绩脆,如何查呢萤厅?我們現(xiàn)在可以使用命令 git log 演示如下所示:
git log 命令顯示從最近到最遠(yuǎn)的顯示日志橄抹,我們可以看到最近三次提交,最近的一次是 , 增加內(nèi)容為 333333. 上一次是添加內(nèi)容 222222惕味,第一次默認(rèn)是 111111. 如果嫌上面顯示的信息太多的話楼誓,我們可以使用命令 git log –pretty=oneline 演示如下:
現(xiàn)在我想使用版本回退操作,我想把當(dāng)前的版本回退到上一個(gè)版本名挥,要使用什么命令呢疟羹?可以使用如下 2 種命令,第一種是:git reset -–hard HEAD^ 那么如果要回退到上上個(gè)版本只需把 HEAD^ 改成 HEAD^^ 以此類推禀倔。那如果要回退到前 100 個(gè)版本的話榄融, 使用上面的方法肯定不方便,我們可以使用下面的簡(jiǎn)便命令操作:git reset -–hard
HEAD~100 即可救湖。未回退之前的 readme.txt 內(nèi)容如下:
如果想回退到上一個(gè)版本的命令如下操作:
再來(lái)查看下 readme.txt 內(nèi)容如下:通過(guò)命令 cat readme.txt 查看
可以看到愧杯,內(nèi)容已經(jīng)回退到上一個(gè)版本了。我們可以繼續(xù)使用git log 來(lái)查看下歷史記錄信息鞋既,如下
我們看到 增加 333333 內(nèi)容我們沒(méi)有看到了力九,但是現(xiàn)在我想回退到最新的版本,如: 有 333333 的內(nèi)容要如何恢復(fù)呢邑闺?我們可以通過(guò)版本號(hào)回退畏邢,使用命令方法如下:
git reset -hard 版本號(hào) ,但是現(xiàn)在的問(wèn)題假如我已經(jīng)關(guān)掉過(guò)一次命令行或者 333 內(nèi)容的版本號(hào)我并不知道呢检吆?要如何知道增加
3333
內(nèi)容的版本號(hào)呢舒萎?可以通過(guò)如下命令即可獲取到版本號(hào):git reflog 演示如下通過(guò)上面的顯示我們可以知道,增加內(nèi)容 3333 的版本號(hào)是 6fcfc89. 我們現(xiàn)在可以命令 git reset –hard 6fcfc89 來(lái)恢復(fù)了蹭沛。演示如下
可以看到 目前已經(jīng)是最新的版本了臂寝。
( 三 ) 理解工作區(qū)與暫存區(qū)的區(qū)別?
[圖片上傳失敗...(image-1d7b3a-1543814452017)] 工作區(qū):就是你在電腦上看到的目錄摊灭,比如目錄下 testgit里的文件 (.git 隱藏目錄版本庫(kù)除外 )咆贬。或者以后需要再新建的目錄文件等等都屬于工作區(qū)范疇帚呼。
[圖片上傳失敗...(image-8c7038-1543814452017)] 版本庫(kù)(Repository):
工作區(qū)有一個(gè)隱藏目錄.git, 這個(gè)不屬于工作區(qū)掏缎,這是版本庫(kù)。其中版本庫(kù)里面存了很多東西煤杀,其中最重要的就是 stage(**** 暫存區(qū) )眷蜈,還有 Git 為我們自****動(dòng)創(chuàng)建了第一個(gè)分支 master,以及指向 master的一個(gè)指針 HEAD。
我們前面說(shuō)過(guò)使用 Git 提交文件到版本庫(kù)有兩步:
第一步:是使用 git add 把文件添加進(jìn)去沈自,實(shí)際上就是把文件添加到暫存區(qū)酌儒。
第二步:使用 git commit 提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前
分支上枯途。
我們繼續(xù)使用 demo 來(lái)演示下:
我們?cè)?readme.txt 再添加一行內(nèi)容為 4444444忌怎,接著在目錄下新建一個(gè)文件為 test.txt 內(nèi)容為 test籍滴,我們先用命令 git status 來(lái)查看下?tīng)顟B(tài),如下
接著我們可以使用 git commit 一次性提交到分支上,如下
( 四 ) Git 撤銷修改和刪除文件操作鸥印。
3. 撤銷修改:
比如我現(xiàn)在在readme.txt 文件里面增加一行 內(nèi)容為 555555555555勋功,我們先通過(guò)命令查看如下
在我未提交之前,我發(fā)現(xiàn)添加 5555555555555 內(nèi)容有誤辅甥,所以我得馬上恢復(fù)以前的版本酝润,現(xiàn)在我可以有如下幾種方法可以做修改:
第一:如果我知道要?jiǎng)h掉那些內(nèi)容的話,直接手動(dòng)更改去掉那些需要的文件璃弄,然后
add 添加到暫存區(qū)要销,最后 commit 掉。
第二:我可以按以前的方法直接恢復(fù)到上一個(gè)版本夏块。使用 git reset****–hard HEAD^ 但是現(xiàn)在我不想使用上面的 2 種方法疏咐,我想直接想使用撤銷命令該如何操作呢?首先
在做撤銷之前脐供,我們可以先用 git status 查看下當(dāng)前的狀態(tài)浑塞。如下所示
可以發(fā)現(xiàn),Git 會(huì)告訴你政己,git checkout — file 可以丟棄工作區(qū)的修改酌壕,如下命令: git checkout – readme.txt, 如下所示
命令 git checkout –readme.txt意思就是,把 readme.txt 文件在工作區(qū)做的修改全部撤銷歇由,這里有 2 種情況卵牍,如下:
readme.txt 自動(dòng)修改后,還沒(méi)有放到暫存區(qū)沦泌,使用 撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)糊昙。
另外一種是 readme.txt 已經(jīng)放入暫存區(qū)了,接著又作了修改谢谦,撤銷修改就回到添加暫存區(qū)后的狀態(tài)释牺。
對(duì)于第二種情況,我想我們繼續(xù)做 demo來(lái)看下回挽,假如現(xiàn)在我對(duì) readme.txt添加一行內(nèi)容為 6666666666666没咙,我 git add增加到暫存區(qū)后,接著添加內(nèi)容 7777777厅各,我想通過(guò)撤銷命令讓其回到暫存區(qū)后的狀態(tài)镜撩。如下所示
注意:命令 git checkout — readme.txt 中的 — 很重要,如果沒(méi)有 — 的話队塘,那么命令變成創(chuàng)建分支了袁梗。
刪除文件
假如我現(xiàn)在版本庫(kù) testgit 目錄添加一個(gè)文件 b.txt, 然后提交。如下
如上:一般情況下憔古,可以直接在文件目錄中把文件刪了遮怜,或者使用如上rm 命令:rm b.txt,如果我想徹底從版本庫(kù)中刪掉了此文件的話鸿市,可以再執(zhí)行 commit 命令 提交掉锯梁,現(xiàn)在目錄是這樣的
只要沒(méi)有 commit 之前,如果我想在版本庫(kù)中恢復(fù)此文件如何操作呢焰情? 可以使用如下命令 git checkout — b.txt陌凳,如下所示
再來(lái)看看我們 testgit 目錄,添加了 3 個(gè)文件了内舟。如下所示