一、什么是 Git
Git 是一個開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項目。
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件,與常用的版本控制工具 CVS, Subversion(svn) 等不同,它采用了分布式版本庫的方式,不必服務(wù)器端軟件支持。
二、Git和 SVN 之間的區(qū)別
GIT 不僅僅是個版本控制系統(tǒng),它也是個內(nèi)容管理系統(tǒng) (CMS), 工作管理系統(tǒng)等。
( 一 ) GIT 是分布式的,SVN 不是:這是 GIT 和其它非分布式的版本控制系統(tǒng),例如
SVN,CVS 等,最核心的區(qū)別。
( 二 ) GIT 把內(nèi)容按元數(shù)據(jù)方式存儲,而 SVN 是按文件:所有的資源控制系統(tǒng)都是把文件的元信息隱藏在一個類似 .svn,.cvs 等的文件夾里。
( 三 ) GIT分支和 SVN的分支不同:分支在 SVN 中一點不特別,就是版本庫中的另外的一個目錄。
( 四 ) GIT沒有一個全局的版本號,而 SVN有:目前為止這是跟 SVN相比 GIT 缺少的最大的一個特征。
( 五) GIT 的內(nèi)容完整性要優(yōu)于SVN:GIT 的內(nèi)容存儲使用的是SHA-1 哈希算法。這能確保代碼內(nèi)容的完整性,確保在遇到磁盤故障和網(wǎng)絡(luò)問題時降低對版本庫的破壞。
三、安裝 Git
在使用 Git 前我們需要先安裝 Git。
Git 目前支持 Linux/Unix、Solaris、Mac 和 Windows 平臺上運行。
Git 各平臺安裝包下載地址為:http://git-scm.com/downloads 這里我們以 Windows 系統(tǒng)為例:
在 Windows 平臺上安裝 Git 同樣輕松,有個叫做 msysGit 的項目提供了安裝包, 可以到 GitHub 的頁面上下載 exe 安裝文件并運行:
安裝包下載地址:http://msysgit.github.io/

完成安裝之后,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了,另外還有一個圖形界面的 Git 項目管理工具。
在開始菜單里找到"Git"->"Git Bash",會彈出 Git 命令窗口,你可以在該窗口進行Git 操作。
msysgit 是 windows 版的 Git, 如下:


會彈出一個類似的命令窗口的東西,就說明 Git 安裝成功。如下:

安裝完成后,還需要最后一步設(shè)置,在命令行輸入如下:

因為 Git 是分布式版本控制系統(tǒng),所以需要填寫用戶名和郵箱作為一個標識。
注意:git config –global 參數(shù),有了這個參數(shù),表示你這臺機器上所有的 Git 倉庫都會使用這個配置,當然你也可以對某個倉庫指定的不同的用戶名和郵箱。
四、 Git 的工作流程
(一)克隆 Git 資源作為工作目錄。
( 二 ) 在克隆的資源上添加或修改文件。
( 三 ) 如果其他人修改了,你可以更新資源。
( 四 ) 在提交前查看修改。
( 五 ) 提交修改。
( 六 ) 在修改完成后,如果發(fā)現(xiàn)錯誤,可以撤回提交并再次修改并提交。下圖展示了 Git 的工作流程:

五、Git 的工作區(qū)、暫存區(qū)、版本庫
(一)基本概念
我們先來理解下 Git 工作區(qū)、暫存區(qū)和版本庫概念
1.工作區(qū):就是你在電腦里能看到的目錄。
暫存區(qū):英文叫 stage,或 index。一般存放在 ".git目錄下 " 下的 index 件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)。
-
版本庫:工作區(qū)有一個隱藏目錄 .git,這個不算工作區(qū),而是 Git 的版本庫。下面這個圖展示了工作區(qū)、版本庫中的暫存區(qū)和版本庫之間的關(guān)系:
圖片.png
(1)圖中左側(cè)為工作區(qū),右側(cè)為版本庫。在版本庫中標記為 "index" 的區(qū)域是存區(qū)
(stage, index),標記為 "master" 的是 master 分支所代表的目錄樹。
(2)圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個" 游標"。所以圖示的命令中出現(xiàn) HEAD 的地方可以用 master 來替換。
(3)圖中的 objects 標識的區(qū)域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創(chuàng)建的各種對象及內(nèi)容。
(4)當對工作區(qū)修改(或新增)的文件執(zhí)行 "git add" 命令時,暫存區(qū)的目錄樹被更新,同時工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對象庫中的一個新的對象中,而該對象的 ID 被記錄在暫存區(qū)的文件索引中。
(5)當執(zhí)行提交操作(git commit)時,暫存區(qū)的目錄樹寫到版本庫(對象庫)中,
master 分支會做相應(yīng)的更新。即 master 指向的目錄樹就是提交時暫存區(qū)的目錄樹。
(6)當執(zhí)行 "git reset HEAD" 命令時,暫存區(qū)的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響。
(7)當執(zhí)行 "git rm --cached <file>" 命令時,會直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變。
(8)當執(zhí)行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個操作很危險,會清除工作區(qū)中未添加到暫存區(qū)的改動。
(9)當執(zhí)行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時, 會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個命令也是極具危險性的,因為不但會清除工作區(qū)中未提交的改動,也會清除暫存區(qū)中未提交的改動。
六、Git 具體操作
( 一 ) 創(chuàng)建版本庫。
什么是版本庫?版本庫又名倉庫,英文名 repository, 你可以簡單的理解一個目錄, 這個目錄里面的所有文件都可以被Git 管理起來,每個文件的修改,刪除,Git都能跟蹤, 以便任何時刻都可以追蹤歷史,或者在將來某個時刻還可以將文件”還原”。
所以創(chuàng)建一個版本庫也非常簡單,如下我是 D盤 –> www下 目錄下新建一 testgit 版本庫。

pwd 命令是用于顯示當前的目錄。
通過命令 git init把這個目錄變成 git 可以管理的倉庫,如下:

這時候你當前 testgit 目錄下會多了一個 .git 的目錄,這個目錄是 Git 來跟蹤管理版本的,沒事千萬不要手動亂改這個目錄里面的文件,否則,會把git 倉庫給破壞了。如下:

2.把文件添加到版本庫中。
首先要明確下,所有的版本控制系統(tǒng),只能跟蹤文本文件的改動,比如 txt 文件,網(wǎng)頁,所有程序的代碼等,Git 也不列外,版本控制系統(tǒng)可以告訴你每次的改 動,但是圖片, 視頻這些二進制文件,雖能也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是知道圖片從 1kb 變成 2kb,但是到底改了啥,版本控制也不知道。

我在版本庫 testgit 目錄下新建一個記事本文件 readme.txt 內(nèi)容如下:11111111
第一步:使用命令 git add readme.txt添加到暫存區(qū)里面去。如下:

如果和上面一樣,沒有任何提示,說明已經(jīng)添加成功了。
第二步:用命令 git commit 告訴 Git,把文件提交到倉庫。



說明沒有任何文件未提交,但是我現(xiàn)在繼續(xù)來改下 readme.txt 內(nèi)容,比如我在下面添加一行 2222222222 內(nèi)容,繼續(xù)使用 git status 來查看下結(jié)果,如下:

上面的命令告訴我們 readme.txt 文件已被修改,但是未被提交的修改。
接下來我想看下 readme.txt 文件到底改了什么內(nèi)容,如何查看呢?可以使用如下命令:
git diff readme.txt 如下:

如上可以看到,readme.txt 文件內(nèi)容從一行 11111111 改成 二行 添加了一行
22222222 內(nèi)容。
知道了對 readme.txt 文件做了什么修改后,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的 2 步 ( 第一步是 git add 第二步是:git commit)。
如下:

( 二 ) 版本回退:
如上,我們已經(jīng)學會了修改文件,現(xiàn)在我繼續(xù)對 readme.txt 文件進行修改,再增加一行
內(nèi)容為 33333333333333. 繼續(xù)執(zhí)行命令如下:

現(xiàn)在我已經(jīng)對 readme.txt 文件做了三次修改了,那么我現(xiàn)在想查看下歷史記錄,如何查呢?我們現(xiàn)在可以使用命令 git log 演示如下所示:

git log 命令顯示從最近到最遠的顯示日志,我們可以看到最近三次提交,最近的一次是 , 增加內(nèi)容為 333333. 上一次是添加內(nèi)容 222222,第一次默認是 111111. 如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline 演示如下:

現(xiàn)在我想使用版本回退操作,我想把當前的版本回退到上一個版本,要使用什么命令呢?可以使用如下 2 種命令,第一種是:git reset -–hard HEAD^ 那么如果要回退到上上個版本只需把 HEAD^ 改成 HEAD^^ 以此類推。那如果要回退到前 100 個版本的話, 使用上面的方法肯定不方便,我們可以使用下面的簡便命令操作:git reset -–hard
HEAD~100 即可。未回退之前的 readme.txt 內(nèi)容如下:

如果想回退到上一個版本的命令如下操作:

再來查看下 readme.txt 內(nèi)容如下:通過命令 cat readme.txt 查看

可以看到,內(nèi)容已經(jīng)回退到上一個版本了。我們可以繼續(xù)使用git log 來查看下歷史記錄信息,如下

我們看到 增加 333333 內(nèi)容我們沒有看到了,但是現(xiàn)在我想回退到最新的版本,如: 有 333333 的內(nèi)容要如何恢復(fù)呢?我們可以通過版本號回退,使用命令方法如下:
git reset -hard 版本號 ,但是現(xiàn)在的問題假如我已經(jīng)關(guān)掉過一次命令行或者 333 內(nèi)容的版本號我并不知道呢?要如何知道增加
3333內(nèi)容的版本號呢?可以通過如下命令即可獲取到版本號:git reflog 演示如下
通過上面的顯示我們可以知道,增加內(nèi)容 3333 的版本號是 6fcfc89. 我們現(xiàn)在可以命令 git reset –hard 6fcfc89 來恢復(fù)了。演示如下

可以看到 目前已經(jīng)是最新的版本了。
( 三 ) 理解工作區(qū)與暫存區(qū)的區(qū)別?
[圖片上傳失敗...(image-1d7b3a-1543814452017)] 工作區(qū):就是你在電腦上看到的目錄,比如目錄下 testgit里的文件 (.git 隱藏目錄版本庫除外 )?;蛘咭院笮枰傩陆ǖ哪夸浳募鹊榷紝儆诠ぷ鲄^(qū)范疇。
[圖片上傳失敗...(image-8c7038-1543814452017)] 版本庫(Repository):
工作區(qū)有一個隱藏目錄.git, 這個不屬于工作區(qū),這是版本庫。其中版本庫里面存了很多東西,其中最重要的就是 stage(**** 暫存區(qū) ),還有 Git 為我們自****動創(chuàng)建了第一個分支 master,以及指向 master的一個指針 HEAD。
我們前面說過使用 Git 提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區(qū)。
第二步:使用 git commit 提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前
分支上。
我們繼續(xù)使用 demo 來演示下:
我們在 readme.txt 再添加一行內(nèi)容為 4444444,接著在目錄下新建一個文件為 test.txt 內(nèi)容為 test,我們先用命令 git status 來查看下狀態(tài),如下


接著我們可以使用 git commit 一次性提交到分支上,如下

( 四 ) Git 撤銷修改和刪除文件操作。
3. 撤銷修改:
比如我現(xiàn)在在readme.txt 文件里面增加一行 內(nèi)容為 555555555555,我們先通過命令查看如下

在我未提交之前,我發(fā)現(xiàn)添加 5555555555555 內(nèi)容有誤,所以我得馬上恢復(fù)以前的版本,現(xiàn)在我可以有如下幾種方法可以做修改:
第一:如果我知道要刪掉那些內(nèi)容的話,直接手動更改去掉那些需要的文件,然后
add 添加到暫存區(qū),最后 commit 掉。
第二:我可以按以前的方法直接恢復(fù)到上一個版本。使用 git reset****–hard HEAD^ 但是現(xiàn)在我不想使用上面的 2 種方法,我想直接想使用撤銷命令該如何操作呢?首先
在做撤銷之前,我們可以先用 git status 查看下當前的狀態(tài)。如下所示

可以發(fā)現(xiàn),Git 會告訴你,git checkout — file 可以丟棄工作區(qū)的修改,如下命令: git checkout – readme.txt, 如下所示

命令 git checkout –readme.txt意思就是,把 readme.txt 文件在工作區(qū)做的修改全部撤銷,這里有 2 種情況,如下:
readme.txt 自動修改后,還沒有放到暫存區(qū),使用 撤銷修改就回到和版本庫一模一樣的狀態(tài)。
另外一種是 readme.txt 已經(jīng)放入暫存區(qū)了,接著又作了修改,撤銷修改就回到添加暫存區(qū)后的狀態(tài)。
對于第二種情況,我想我們繼續(xù)做 demo來看下,假如現(xiàn)在我對 readme.txt添加一行內(nèi)容為 6666666666666,我 git add增加到暫存區(qū)后,接著添加內(nèi)容 7777777,我想通過撤銷命令讓其回到暫存區(qū)后的狀態(tài)。如下所示

注意:命令 git checkout — readme.txt 中的 — 很重要,如果沒有 — 的話,那么命令變成創(chuàng)建分支了。
刪除文件
假如我現(xiàn)在版本庫 testgit 目錄添加一個文件 b.txt, 然后提交。如下

如上:一般情況下,可以直接在文件目錄中把文件刪了,或者使用如上rm 命令:rm b.txt,如果我想徹底從版本庫中刪掉了此文件的話,可以再執(zhí)行 commit 命令 提交掉,現(xiàn)在目錄是這樣的

只要沒有 commit 之前,如果我想在版本庫中恢復(fù)此文件如何操作呢? 可以使用如下命令 git checkout — b.txt,如下所示

再來看看我們 testgit 目錄,添加了 3 個文件了。如下所示

