天天看點

Git 本地倉庫(Repository)詳解

大綱:

一、前言

二、概述

三、在Windows上安裝Git

四、建立本地倉庫

五、本地倉庫管理詳解

六、總結

注,測試機 CentOS 5.5 x86_64,Git 伺服器版本:git version 1.8.2.1,用戶端版本:git version 1.9.2.msysgit.0。所有軟體請到這裡下載下傳:。

本來呢,其實呢。我以為Git也就幾個指令,沒什麼難的。于是就到網上找了些文章看看,發現這些文章難得不知道該說什麼好。不是簡單的寫幾個指令,就是直接複制粘貼手冊中的内容,沒有一點連續感,不知道從何學起。總之呢,我想寫一個什麼都不會的朋友能看懂的、初學朋友能看懂的、運維能看懂的、開發也能看懂的,看完就能幹活的教程。

這個教程呢,有幾個部分先和大家說一下:

Git 本地倉庫詳解

Git 遠端倉庫詳解

Git 分支管理詳解

Git 标簽管理詳解

GitHub 使用詳解

Git 全局配置詳解

Git與GitHub總結

注,本教程呢,隻能讓你會使用Git幹活,至于你呢想深入了解Git,或者想成為Git領域的專家喲,我想說這隻是個起步。還有我想說Git隻是個工具嘛,目的隻是為了提高我們的工作效率,我們沒有必要去,也不需要學浪費時間在研究工具上,隻要我們會用就好,嘿嘿!也許有博友不同意啊,隻是個人見解啊,勿噴啊!

注,大家請到這裡下載下傳:。具體的安裝過程我就不示範了,直接輕按兩下安裝即可。安裝完成後桌面上會生成一個Git bash圖示,輕按兩下打開會彈出一個類似指令行視窗的東西,大家請看下圖:

好了,到這裡我們的Git就安裝完成了,嘿嘿!下面我們來進行基本配置:

注,我這裡根據我的情況設定如下(如上圖):

我們在上一篇文章說過Git是分布式控制系統,是以,每個用戶端都必須設定:你的名字和郵箱。這樣才容易區分是哪個使用者送出的Git版本,嘿嘿!大家可以看到git config 後面接的是--global參數,這表示你的機器上所有的Git倉庫都會使用這個配置,但你也可以對不同的倉庫指定不同的使用者名和郵箱。這個我們會在後面的文章中講解,這裡不作說明,嘿嘿!有興趣的博友可以先提前google一下。

1.版本庫又稱倉庫

版本庫或者是倉庫,英文名Repository,其實啊說白了就是一個目錄而且,這個目錄中的是以檔案都被git管理而且,不管你做什麼操作都會被記錄,包括:增加、删除、修改檔案等,都會被記錄下來,以便後來跟蹤與修改相關記錄,甚至被還原。好了,下面我們就在我們用戶端(我這裡示範的是Windows用戶端,其它用戶端操作一樣)中建立一個版本庫:

大家可以看到我們在/c/Users/root/下建立一個空目錄pro即可project簡寫。還有一點需要說明的在Windows系統中目錄名稱不要使用中文,不然會出現神馬問題,我不負責。嘿嘿^_^……

2.目錄變成倉庫

執行git init指令,即可Initialized empty Git repository in c:/Users/root/pro/.git/,初始化一個空目錄,路徑為c:/Users/root/pro/.git/。大家可以看到pro目錄中生成了一個隐藏目錄 .git目錄,進入目錄中大家可以看到裡面有很多檔案,沒事不要修改或者改動裡機的檔案,這裡面的檔案就是控制和管理版本庫的,嘿嘿。至于裡檔案的具體作用我們會在後面的文章中講解,想提前了解的朋友可以先google一下。

3.向本地倉庫中增加檔案

下面我們向版本庫中增加檔案,需要注意的是,在版本庫中隻能跟蹤和管理文本檔案,比txt檔案、js檔案、php檔案、java檔案等,所有的程式代碼都可以的。但是像視訊、圖檔等這些二進制檔案,雖然能由git管理,但是隻能記錄大小,無法跟蹤具體修改了什麼,嘿嘿。大家懂了吧。好了,下面我們來增加一個readme.txt檔案,其内容如下:

注意,建立的readme.txt檔案,一定要在pro目錄,不然git無法管理這裡檔案哦,嘿嘿!下面我們把個檔案放到版本庫中。

1).git status 指令

我們先用git status指令檢視一下,如上圖。大家可以看到git記錄我們新增加一個檔案readme.txt,并且提示這個檔案還沒有被送出。下面我們用git add指令送出一下。

2).git add 指令

git add 指令是告訴git,我們要把什麼檔案送出到倉庫中去,大家可以看我們執行git add readme.txt指令後,沒有任何提示。那就說明我們送出完成了。下面我們通過git commit指令,将readme.txt檔案送出到版本庫中。

3).git commit 指令

大家可以看到我們用git commit指令送出readme.txt檔案,給出的提示是  1 file changed, 3 insertions(+),一個檔案改變,插入了三行内容。與我們上面增加三行内容一緻。嘿嘿!下面我們簡單的說明一下git commit指令,其中的參數-m後面輸入的是本次送出的版本說明,可以輸入任意内容,但需要說明的是,最好寫有意義的說明,便于以後檢視。

4).git status 指令

最後我們再用git status指令檢視一下版本庫的狀态,提示沒有任何内容需要送出說明我們向版本庫增加檔案成功了,嘿嘿。

4.總結

1).初始化一個Git倉庫,使用git init指令

2).添加檔案到本地Git倉中,分為兩步:

使用git add指令,注意,可以多次使用,添加多個檔案

使用git commit指令,完成添加。

為什麼Git添加檔案需要兩步呢?一步add,一步commit。嘿嘿,因為commit指令可以一次送出多個檔案,是以你可以多次使用add指令呢。下面是個案例:(我們也經常這麼用)

好了,到這裡我們建立本地git倉庫和向倉庫中增加檔案的内容就講解完成了,下面我們來詳細講解一下Git本地倉庫的管理,内容有點多請大家慢慢看,嘿嘿!

1.檢視工作區的狀态(git status)

在上面的文章中我們成功的增加了一個readme.txt檔案,并用git status指令檢視了狀态,在這節中我們就詳細的說一下git status指令。我們修改一下readme.txt中的内容如下:

我們删除了最後一行,現在我們再用git status指令檢視一下狀态:

從上圖中我們可以看到,我們用git status指令檢視一下,我們得知readme.txt檔案被修改過了,但是還沒有送出這個修改。但是有博友會問了,git提示我們這個readme.txt這個檔案被修改了,但我們想看看具體修改了什麼内容怎麼辦呢?這個時候我們需要git diff指令出場了,如下圖:

大家可以從上面圖檔中可以看到,我們删除了最後一行的……省略号。嘿嘿,用紅顔色标出來的。好了知道修改了什麼,下面我們就送出修改吧,送出修改和送出新檔案一緻,也是兩步,先add,再commit。如下圖:

大家可以看到我們執行git add指令,同樣沒人輸出。但是,我們可以用git status指令檢視一下。下面我們用git commit指令送出到本地版本庫,如下圖:

同樣的我們使用git status指令檢視一下狀得知我們修改的readme.txt檔案已送出。好了,到這裡我們的git status指令就講解完成了,同時我們也講解一個git diff指令,可以檢視我們修改了哪些内容。下面我們來講解一下版本復原。

2.版本復原

在上面一個章節中我們示範修改檔案并送出檔案,再用git status指令檢視狀态,下我們再修幾個版本并送出:

好了,就這樣我們不斷的修改并送出到本地的版本庫中。一會你測試的時候發現前修改的版本有問題想復原到前面的版本,或者你誤删除了一些檔案,想回到上一個commit中去,然後繼續工作。我們應該怎麼辦呢?在Git版本控制中,我們所有的操作都是有曆史記錄的,我們用git log指令檢視一下(如下圖):

大家可以看到,用git log指令可以檢視最近幾次送出的版本。如果你發現内容太多,可以用這個指令檢視(如下圖):

上面你看到的一大串數字,其實是commit id(即,版本号),和svn不一樣,Git的commit id不是1,2,3……這樣的遞數字,而是一相SHA1計算出來的哈希數,用16進制表示。有博友會問了,為什麼Git的commit id不是1,2,3……這樣的遞增數字,而是用SHA1算出來的哈希數來表示呢?大家應該知道Git是分布式管理系統,我們會有多個人同時開發,如果大家都用1,2,3……這樣的遞增數字,作為版本号,那不就沖突了嘛,嘿嘿。好了,下面我們來說版本復原,準備把readme.txt復原到“add readme.txt“的那個版本,我們應該怎麼做?

我們先來說一下,Git的目前是在哪個版本,在Git中我們用HEAD表示目前版本,也就是我們最新送出的”749f84ccb87……ff2q6ad“,上一個版本就應該這麼表示”HEAD^“,再上一個版本就這樣表示”HEAD^^“,當然如果有幾十個版本或者1000個版本,我們還要寫1000個^,這是不可能的,是以喲。我們寫成這樣HEAD~1000。好了,現在我們就用git reset指令,将我們的版本回退到”add readme.txt“中吧,如下圖:

大家可以看到,我們回到了”add readme.txt“版本中了,下面我們再來檢視一下git log,如下圖:

有個問題哦,有沒有發現我們最後送出的那個版本不見了,如上圖。現在隻有三個版本了,這說明什麼問題呢?舉個簡單的例子說明一下,就好比你從現在回到了18世界,想再回到21世界已經回不去了,那應該怎麼辦呢?隻要我們找到最新版本的commit id,我這裡新版本的commit id是”749f84ccb87……ff2q6ad“,于是就可以回到未來的某個版本,就好比我們知道現在的時間,就能回到現在。下面我們來示範一下(如下圖):

好了,大家可以看到我們又回到最新版本,嘿嘿。現在你回退到某個版本中,已經關掉了Git bash。但是呢,你又後悔了,想恢複到新版本中,但是呢?你又找不到commit id了,那又該怎麼辦呢?在Git中,我們當時用$ git reset --hard HEAD^^^,回退到“add readme.txt”版本時,再想恢複到最新版的 “add a line distributed” 中,必須有commit id才行,這時我們已經關閉了Git bash。在Git中提供了一個git reflog指令,是用來記錄你每一次執行的指令,下面我們來示範一下(如下圖):

嘿嘿,現在我們又可以回去最新版了。好了,到這裡我們的復原版本就講解完成了。下面我們來說一下,工作區、送出區/暫存區(stage/index)、版本庫。

3.工作區、送出區/暫存區(stage/index)、版本庫

其實呢,工作區、送出區/暫存區(stage/index)、版本庫的概念問題,從上圖中就能看的很清楚,本來不想細講的,但想想還是說一下。Git與其他版本版本控制器其中之一的不同之處就在于有送出區/暫存區(stage/index)的概念。下面我們先來看一下工作區:

其實呢,工作區就是我們開發目錄了,在電腦中是可能看到的,比如我們這裡的pro目錄,就是一個工作區。大家再來看一下,下面的兩張圖:

大家可以看到,工作區中有個隐藏的目錄“.git”,這個不是工作區哦,這個就是Git的版本庫。大家再看下面兩張圖:

大家可以看到,在“.git”目錄中有很多檔案,其中一個重要的檔案index,就是我們說的送出區/暫存區(stage/index)。暫存區(stage, index)是 Git 最重要的概念之一,了解了這個概念很多 Git 指令就不再那麼神秘了。對于 Git 暫存區(stage) ,不知道您的感想如何?

“被眼花缭亂的 Git 魔法徹底搞糊塗了?”

“Git 為什麼這麼折磨人,修改的檔案直接送出不就完了麼?”

“看不出 Git 這麼做有什麼好處?”

我認為 Git 暫存區(stage或稱為 index)的設計是 Git 最成功的設計之一,也是最難了解的一個設計。 在版本庫(.git)目錄下,有一個 index 檔案,相信大家在上圖中已經看到了。下面我們好好說一說他們之間關系,同樣的我們先看一張圖:

在上圖中,我們可以看到部分 Git 指令是如何影響工作區和暫存區(stage/index)的。

圖中左側為工作區,右側為版本庫。在版本庫中标記為 "index" 的區域是暫存區(stage/index),标記為 "master" 的是 master 分支所代表的目錄樹(關于分支問題在下面的文章中會詳解)。

圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個“指針”。是以,圖示的指令中出現 HEAD 的地方可以用 master 來替換(HEAD的概念我們在後面的文章中也會詳解)。

圖中的 objects 辨別的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,我們會在後面的文章中将重點介紹,嘿嘿!。

當對工作區新增或修改的檔案執行 "git add" 指令時,暫存區的目錄樹被更新,同時工作區新增或修改的檔案内容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的檔案索引中。(如上圖)

當執行送出操作 "git commit" 時,暫存區的目錄樹寫到版本庫的對象庫(objects)中,master 分支會做相應的更新。即 master 指向的目錄樹就是送出時暫存區的目錄樹。(如上圖)

當執行 "git reset HEAD" 指令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。 當執行 "git rm --cached <file>" 指令時,會直接從暫存區删除檔案,工作區則不做出改變。

當執行 "git checkout ." 或者 "git checkout -- <file>" 指令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未添加到暫存區的改動。

當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 指令時,會用 HEAD 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個指令也是極具危險性的,因為不但會清除工作區中未送出的改動,也會清除暫存區中未送出的改動。

好了,到這裡我們的工作區、暫存區、版本庫就講解到這裡了,由于本人能力有限有什麼不正确的地方歡迎大家指出。好了,下面我們繼續講解……

4.修改管理

1).關于修改

在上面的文章中我們講解了工作區、暫存區和版本庫的概念,有了這些概念有了解。下面我們說一說為什麼Git比其它版本控制軟體優秀?嘿嘿,是因為Git跟蹤管理的是我們每一次的修改(或操作),而不是檔案。比如你新增了一行,這就是一個修改,删除了一行,也是一個修改,更改了某些字元,也是一個修改,删了一些又加了一些,也是一個修改,甚至建立一個新檔案,也算一個修改。下面我們來簡單示範一下:我們先檢視一下readme.txt檔案,如下圖:

下面我們修改一下readme.txt内容,增加一行:Git rest 1.如下圖:

下面我們用 git add 指令送出一下,如下圖:

下面我們再修改一下readme.txt檔案,如下圖:

我們又增加一行 Git test 2. 如下圖:

下面我們送出一下,如下圖:

下面我們再檢視一下狀态,如下圖:

大家可以看到我們第二次沒有被送出,怎麼會這樣呢?細心的博友可以看到我們第二次修改後,直接執行 git commit了。沒有執行 git add 指令,前面我們說了,當你用“git add”指令後,在工作區的第一次修改被放入暫存區,準備送出。但是,在工作區的第二次修改并沒有放入暫存區,是以,“git commit”隻負責把暫存區的修改送出了,也就是第一次的修改被送出了,第二次的修改不會被送出。下面我們用 git diff 指令檢視一下工作區與版本庫裡面的差別:

大家可以從圖上看到,我們增加 Git test 2. 還沒有送出,嘿嘿!那麼第二次修改怎麼送出呢?其實我們再add再commit,就可以了。如下圖:

好了,現在,你又了解了Git是如何跟蹤修改的,每次修改,如果不add到暫存區,那就不會加入到commit中。那麼我們想取消修改的版本,又該怎麼取消呢?下面我們繼續……

2).取消(撤消)修改

下面我們來講解怎麼撤消修改,一般情況下我們是不會出錯的,但是項目比較緊,老是有人在催你(這個你懂的),突然出錯了,我們想取消修改那又怎麼辦呢?如下圖:

在你要送出之前,你發現在有錯誤了,應該是101。既然錯誤發現得很及時,就可以很容易地糾正它。你可以删掉最後一行,手動把檔案恢複到上一個版本的狀态。我信先用git status檢視一下,如下圖:

如上圖,Git會告訴你有你個檔案被修改,你有兩個選擇,一個用 git add 送出到暫存區,另一個是用git checkout可以丢棄工作區的修改。指令git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部撤銷,這裡有兩種情況:

一種是readme.txt自修改後還沒有被放到暫存區,現在撤銷修改就回到和版本庫一模一樣的狀态;

另一種是readme.txt已經添加到暫存區後,又作了修改,現在撤銷修改就回到添加到暫存區後的狀态。

總之,就是讓這個檔案回到最近一次git commit或git add時的狀态。下面我們來示範一下,如下圖:

大家可以看一下 readme.txt 檔案果然還原到上一個版本了,嘿嘿!大家注意哦,git checkout -- file指令中的“--”很重要,沒有“--”,就變成了“建立一個新分支”的指令,我們在後面的文章中将詳細講解分支管理。真是禍不單行啊,我們不但程式寫錯了,還 git add 到暫存區了,如下圖:

不管怎麼樣,我們先檢視一下狀态吧,如下圖:

大家可以看到Git告訴我們,用 git reset HEAD file 可以把暫存區中的修改撤消掉,重新放回工作區,如下圖:

git reset指令既可以回退版本,也可以把工作區的某些檔案替換為版本庫中的檔案。當我們用HEAD時,表示最新的版本。我們再用 git status 檢視一下發現,現在的暫存區是幹淨的,工作區有修改。

那說明我們撤消成功,嘿嘿!下面我們再執行 git checkout指令撤消工作區修改,如下圖:

好了,到這裡我們終于撤消回來了,嘿嘿。現在,假設你不但改錯了東西,還從暫存區送出到了版本庫,怎麼辦呢?還記得版本回退一節嗎?可以回退到上一個版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到遠端。還記得Git是分布式版本控制系統嗎?我們後面會講到遠端版本庫,一旦你把錯誤送出推送到遠端版本庫,你就真的慘了……大家小心就好,哈哈……好了,下面我們來總結一下:

當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令git checkout -- file。

當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令git reset HEAD file,就回到了第1步,第二步按第1步進行操作,就是執行一下git checkout -- file。

已經送出了不合适的修改到版本庫時,想要撤銷本次送出,參考我們前面講解的版本回退,不過前提是沒有推送到遠端庫。嘿嘿,祝你回退成功。

好了,撤消管理我們已經講了很多了,下面我們來說一下檔案删除的問題,終于快通關了。嘿嘿……

5.檔案删除

删除檔案就比較簡單了,我們快速的過一下了,嘿嘿!下面我們新增加一個檔案并送出到Git版本庫中,如下圖:

一般我們直接在目錄中把沒用的檔案删了,或者用rm指令删了,下面我們來示範一下:

大家可以看到,我們用 git status 檢視一下狀态,現在我們有兩個選擇,一個是從版本庫中删除該檔案,就 git rm 指令删除掉并用 git commit送出,另一種情況删錯了,因為版本庫裡還有是以可以很容易的恢複。下面我們來示範一下情況1:

好了,下面我們來看一下情況2:

git rm 指令用于删除一個檔案。如果一個檔案已經被送出到版本庫,那麼你永遠不用擔心誤删,但是要小心,你隻能恢複檔案到最新版本,你會丢失最近一次送出後你修改的内容。好了,到這裡我們删除檔案就講解完成,嘿嘿。

在一篇部落格中我們講解了Git 本地版本庫的講解,在下一篇部落格中我們主要講解Git 遠端倉庫詳解,好了到這裡這篇部落格到這裡就全部完成。本人能力有限,有任何問題歡迎大家提出并讨論。最後,希望大家有所收獲^_^……

本文出自 “” 部落格,請務必保留此出處

繼續閱讀