天天看點

Git學習記錄--git倉庫

    Git是一款強大的版本控制工具,與svn相比git的分布式送出,本地倉庫等在使用時确實比較友善。當然兩者之間各有優劣,我在這裡不多做比較。由于之前少有接觸git,隻是零星大緻地了解一點,是以找時間系統地看了下廖老師的git入門教程。廖老師git入門教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000。

作為學習記錄,我會跳過git的安裝介紹等,也不會系統地挨個介紹使用的git指令。以下主要包括:

  * git倉庫(Git倉庫的介紹)

    * git本地倉庫操作的執行過程(add,commit, diff,reset)

  * 總結

一、Git的倉庫(版本庫)

  1. Git的本地倉庫

  其實就是版本庫(repository),直覺了解就是自己檔案系統中的一個目錄,這個目錄裡的檔案可以被git工具管理,目錄裡檔案的增删改都能被Git追蹤到。

以下就是在git_learn目錄下使用init指令建立的一個本地Git倉庫,初始建立時,倉庫是空的,需要add并commit才能讓Git追蹤倉庫目錄下的檔案。

Git學習記錄--git倉庫

  2. Git本地倉庫的構成

  當上面在空檔案夾下執行 git init 指令後,我們說在目前目錄下的Git倉庫就建立好了,那建立好的Git倉庫到底是什麼樣呢,除了多了一個隐藏的.git 檔案目錄,似乎什麼也沒有。其實,初始化成功後我們的目前目錄已經被分成了兩個部分,一個是工作區,另一個就是版本庫。所謂工作區就是我們能在這個目錄下操作檔案,進行工作,比如寫代碼啊T_T。版本庫就是那個生成的.git目錄了,裡面主要包括暫存區(index指向)和版本區(HEAD指向,這個“”版本區“”隻是我個人的叫法)。版本區就是放分支的地方,裡面會有Git為我們建立的第一個分支,名為master。這裡的index和head可以了解為指針的作用。下圖就是倉庫建立後的樣子。

Git學習記錄--git倉庫

 二、Git本地倉庫的操作流程

  1. 操作流程

  工作區的檔案我們是可以任意添加修改的,修改的檔案需要從工作區通過add指令添加到暫存區,再從暫存區commit到版本區。我們也可以從從倉庫checkout檔案到工作區,操作關系如下圖:

Git學習記錄--git倉庫

  2 .Git的add與commit

  在工作區建立檔案file.txt并将改檔案送出到Git本地倉庫,整個過程執行如下:

Git學習記錄--git倉庫

兩步,add 和commit就将file.txt檔案的第一個版本加入了git倉庫,看看其過程:

工作區建立file.txt第一個版本,這時git倉庫并沒有追蹤到這個檔案。

Git學習記錄--git倉庫

将file.txt添加到暫存區(index指向),這時暫存區的檔案和工作區同步。

Git學習記錄--git倉庫

最後将暫存區的送出到版本區(HEAD指向),這時版本區會自動生成此次送出的版本号,這時file檔案已經被git倉庫追蹤到。

Git學習記錄--git倉庫

 以上操作都是在初始生成的master分支上完成,每次送出成功後HEAD都會指向版本區中目前分支的最新版本,這裡使用master分支送出,是以HEAD指向master分支的目前最新版本,目前隻有一個版本(master分支隻有一個送出,每次送出形成一個版本,并生成唯一版本号),如果存在多個分支,切換分支時,HEAD就會指向切換到的分支的最新版本。存在分支存在多個版本(多次送出)會形成類似連結清單的結構。是以在目前倉庫版本區(隻有master分支,且隻有一個送出)具體來說應該是這樣的:

Git學習記錄--git倉庫

 現在編輯file.txt檔案,添加一行,形成v2版本(v1是建立的空檔案),再執行add和commit,我們依然是在master分支上送出的,這時候file.txt就應該有兩個版本了,且是在master分支上,HEAD應該指向的是master的最新分支。

git倉庫中的版本區,master分支上存在兩個版本,HEAD指向master分支的最新版本:

Git學習記錄--git倉庫

  3. Git的版本重置 reset

  git的版本可以向前向後移動,如同指向雙向連結清單中的某個節點的指針一樣。這裡的指針其實就是HEAD,執行reset指令其實就是移動HEAD指向分支上的另一個版本(每一次送出都會形成一個版本)。

例如,我在file.txt中又有修改并且形成了v3版本,現在我想要将file.txt檔案回退到上一次送出(v2版本),可以使用  git reset HEAD~1 ,前面說過,每次送出都有版本号,可以通過log和reflog檢視送出的版本号,使用git reset 9e5e6a4,來将HEAD重新指向到v2版本。版本号挺長的,但不用寫完一般寫前面幾個就夠了。但這是分支上的v3版本依然存在(如同移動指向連結清單節點的指針,連結清單節點依然在).

在master分支上回退一次的操作應該是這樣:

Git學習記錄--git倉庫

可以看到,在版本區,HEAD的指向已經指向了master分支的v2版本上,前面說到,git倉庫裡除了版本區還有暫存區(index指向)和工作區(我們能看到的并工作的目錄中)是什麼樣子呢?

這裡reset 有三個可選參數:git reset [--soft | mixed | hard]

git reset --soft HEAD~1:

        soft參數,由于送出了v3版本,在執行reset指令之前,暫存區(index)和工作區應該都是v3版本,執行git reset --soft HEAD~1 之後,暫存區和工作區依然是v3版本,簡單來說我們再工作目錄看到的依然是v3的内容,隻是倉庫裡的版本區目前版本已經指向了v2.

Git學習記錄--git倉庫

git reset --mixed HEAD~1:

  mixed參數,這個參數是預設參數。分成兩個步驟,首先将HEAD指向改變,再将暫存區(index)與HEAD指向的目前版本同步(到v2版本),工作區依然不變(保留v3版本)。

Git學習記錄--git倉庫

git reset --hard HEAD~1:

  hard參數,改變HEAD指向,并且将暫存區與工作區全部同步到v2版本,這個時候我們我們可以通過檔案直接看到v3版本新添加的内容不見了,回到了v2版本。

Git學習記錄--git倉庫

當然,我們雖然到了v2版本,那我們依然可以通過reset指令到v3版本,同樣的道理。

這裡關于reset指令的操作過程我隻是簡要描述了一下,這裡有一篇非常好的講解,很詳細:https://www.cnblogs.com/kidsitcn/p/4513297.html

  4.git 的diff指令

  比較差別,弄清楚git倉庫的組成部分就很容易想到比較啦。反正就是這樣:

Git學習記錄--git倉庫

 git diff  :  工作區與暫存區比較

  git diff --cached    : 暫存區與HEAD指向版本比較

git diff HEAD  :  工作區與HEAD指向版本直接比較

git diff 版本号1 版本号2   :     比較兩個版本号對應版本版本的不同

 三、總結

  Git倉庫主要包括三部分:工作區,暫存區,版本區。 我們對檔案的操作是在工作區進行,完成修改後先要将修改内容添加到暫存區,然後再送出到版本區形成一個版本。至于為什麼git要設定一個暫存區這樣一個中間層,想到一句話調侃的話:沒有什麼問題是添加一個中間層解決不了的,若有,那就添加兩層。想想,如果我們一次要修改的東西太多,我想每寫一點東西就先存起來但是又不想讓它形成一個版本送出(因為沒寫完啊,送出的時候需要些commit comment的),那就寫一點就送出到暫存區諾,寫完後再一次commit。或者正在開心的寫着代碼,寫着一半突然需要切換到另一個分支去修複bug,那就将目前工作内容放到暫存區,然後利用stash功能将暫存區内容打包存起來,等修複完bug再回來恢複繼續。另外就是git的status功能,這個功能比較簡單,主要顯示就是目前倉庫的狀态,是否有内容需要add到暫存區,是都有暫存的内容需要commit到版本區等等。

By---    Gonjan

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,