git簡介和命令

一、什么是 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/

圖片.png

完成安裝之后,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了,另外還有一個圖形界面的 Git 項目管理工具。

在開始菜單里找到"Git"->"Git Bash",會彈出 Git 命令窗口,你可以在該窗口進行Git 操作。
msysgit 是 windows 版的 Git, 如下:


圖片.png

需要從網(wǎng)上下載一個,然后進行默認安裝即可。安裝完成后,在開始菜單里面找到“Git –> Git Bash”, 如下:
圖片.png

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


圖片.png

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


圖片.png

因為 Git 是分布式版本控制系統(tǒng),所以需要填寫用戶名和郵箱作為一個標識。
注意:git config –global 參數(shù),有了這個參數(shù),表示你這臺機器上所有的 Git 倉庫都會使用這個配置,當然你也可以對某個倉庫指定的不同的用戶名和郵箱。

四、 Git 的工作流程

(一)克隆 Git 資源作為工作目錄。
( 二 ) 在克隆的資源上添加或修改文件。
( 三 ) 如果其他人修改了,你可以更新資源。
( 四 ) 在提交前查看修改。
( 五 ) 提交修改。
( 六 ) 在修改完成后,如果發(fā)現(xiàn)錯誤,可以撤回提交并再次修改并提交。下圖展示了 Git 的工作流程:


圖片.png

五、Git 的工作區(qū)、暫存區(qū)、版本庫

(一)基本概念

我們先來理解下 Git 工作區(qū)、暫存區(qū)和版本庫概念

1.工作區(qū):就是你在電腦里能看到的目錄。

  1. 暫存區(qū):英文叫 stage,或 index。一般存放在 ".git目錄下 " 下的 index 件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)。

  2. 版本庫:工作區(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 版本庫。


圖片.png

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


圖片.png

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


圖片.png

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

圖片.png

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

圖片.png

如果和上面一樣,沒有任何提示,說明已經(jīng)添加成功了。

第二步:用命令 git commit 告訴 Git,把文件提交到倉庫。

圖片.png

圖片.png

現(xiàn)在我們已經(jīng)提交了一個 readme.txt 文件了,我們下面可以通過命令 git status 來查看是否還有文件未提交,如下:
圖片.png

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

圖片.png

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

圖片.png

如上可以看到,readme.txt 文件內(nèi)容從一行 11111111 改成 二行 添加了一行

22222222 內(nèi)容。

知道了對 readme.txt 文件做了什么修改后,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的 2 步 ( 第一步是 git add 第二步是:git commit)。
如下:

圖片.png

( 二 ) 版本回退:

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


圖片.png

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


圖片.png

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


圖片.png

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

圖片.png

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

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

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

我們看到 增加 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 演示如下
圖片.png

通過上面的顯示我們可以知道,增加內(nèi)容 3333 的版本號是 6fcfc89. 我們現(xiàn)在可以命令 git reset –hard 6fcfc89 來恢復(fù)了。演示如下

圖片.png

可以看到 目前已經(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),如下


圖片.png

現(xiàn)在我們先使用 git add 命令把 2 個文件都添加到暫存區(qū)中,再使用 git status 來查看下狀態(tài),如下
圖片.png

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

( 四 ) Git 撤銷修改和刪除文件操作。

3. 撤銷修改:

比如我現(xiàn)在在readme.txt 文件里面增加一行 內(nèi)容為 555555555555,我們先通過命令查看如下


圖片.png

在我未提交之前,我發(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)。如下所示


圖片.png

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

圖片.png

命令 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)。如下所示

圖片.png

注意:命令 git checkout — readme.txt 中的 — 很重要,如果沒有 — 的話,那么命令變成創(chuàng)建分支了。

刪除文件

假如我現(xiàn)在版本庫 testgit 目錄添加一個文件 b.txt, 然后提交。如下


圖片.png

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

圖片.png

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


圖片.png

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


圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容