Git學習記錄--git倉庫

    Git是一款強大的版本控制工具,與svn相比git的分佈式提交,本地倉庫等在使用時確實比較方便。固然二者之間各有優劣,我在這裏很少作比較。因爲以前少有接觸git,只是零星大體地瞭解一點,因此找時間系統地看了下廖老師的git入門教程。廖老師git入門教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000。html

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

  * git倉庫(Git倉庫的介紹)分佈式

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

  * 總結工具

1、Git的倉庫(版本庫)

  1. Git的本地倉庫學習

  其實就是版本庫(repository),直觀瞭解就是本身文件系統中的一個目錄,這個目錄裏的文件能夠被git工具管理,目錄裏文件的增刪改都能被Git追蹤到。spa

如下就是在git_learn目錄下使用init命令建立的一個本地Git倉庫,初始建立時,倉庫是空的,須要add並commit才能讓Git追蹤倉庫目錄下的文件。3d

 

 

  2. Git本地倉庫的構成版本控制

  當上面在空文件夾下執行 git init 命令後,咱們說在當前目錄下的Git倉庫就建立好了,那建立好的Git倉庫究竟是什麼樣呢,除了多了一個隱藏的.git 文件目錄,彷佛什麼也沒有。其實,初始化成功後咱們的當前目錄已經被分紅了兩個部分,一個是工做區,另外一個就是版本庫。所謂工做區就是咱們能在這個目錄下操做文件,進行工做,好比寫代碼啊T_T。版本庫就是那個生成的.git目錄了,裏面主要包括暫存區(index指向)和版本區(HEAD指向,這個「」版本區「」只是我我的的叫法)。版本區就是放分支的地方,裏面會有Git爲咱們建立的第一個分支,名爲master。這裏的index和head能夠理解爲指針的做用。下圖就是倉庫建立後的樣子。指針

 

 

 

 2、Git本地倉庫的操做流程

  1. 操做流程

  工做區的文件咱們是能夠任意添加修改的,修改的文件須要從工做區經過add命令添加到暫存區,再從暫存區commit到版本區。咱們也能夠從從倉庫checkout文件到工做區,操做關係以下圖:

 

  2 .Git的add與commit

  在工做區建立文件file.txt並將改文件提交到Git本地倉庫,整個過程執行以下:

 

 

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

工做區建立file.txt第一個版本,這時git倉庫並無追蹤到這個文件。

將file.txt添加到暫存區(index指向),這時暫存區的文件和工做區同步。

最後將暫存區的提交到版本區(HEAD指向),這時版本區會自動生成這次提交的版本號,這時file文件已經被git倉庫追蹤到。

 以上操做都是在初始生成的master分支上完成,每次提交成功後HEAD都會指向版本區中當前分支的最新版本,這裏使用master分支提交,因此HEAD指向master分支的當前最新版本,目前只有一個版本(master分支只有一個提交,每次提交造成一個版本,並生成惟一版本號),若是存在多個分支,切換分支時,HEAD就會指向切換到的分支的最新版本。存在分支存在多個版本(屢次提交)會造成相似鏈表的結構。因此在當前倉庫版本區(只有master分支,且只有一個提交)具體來講應該是這樣的:

 

 如今編輯file.txt文件,添加一行,造成v2版本(v1是新建的空文件),再執行add和commit,咱們依然是在master分支上提交的,這時候file.txt就應該有兩個版本了,且是在master分支上,HEAD應該指向的是master的最新分支。

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

 

  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分支上回退一次的操做應該是這樣:

能夠看到,在版本區,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 reset --mixed HEAD~1:

  mixed參數,這個參數是默認參數。分紅兩個步驟,首先將HEAD指向改變,再將暫存區(index)與HEAD指向的當前版本同步(到v2版本),工做區依然不變(保留v3版本)。

 

git reset --hard HEAD~1:

  hard參數,改變HEAD指向,而且將暫存區與工做區所有同步到v2版本,這個時候咱們咱們能夠經過文件直接看到v3版本新添加的內容不見了,回到了v2版本。

固然,咱們雖然到了v2版本,那咱們依然能夠經過reset命令到v3版本,一樣的道理。

這裏關於reset命令的操做過程我只是簡要描述了一下,這裏有一篇很是好的講解,很詳細:https://www.cnblogs.com/kidsitcn/p/4513297.html

  4.git 的diff命令

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

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

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

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

git diff 版本號1 版本號2   :     比較兩個版本號對應版本版本的不一樣

 

 

 3、總結

  Git倉庫主要包括三部分:工做區,暫存區,版本區。 咱們對文件的操做是在工做區進行,完成修改後先要將修改內容添加到暫存區,而後再提交到版本區造成一個版本。至於爲何git要設置一個暫存區這樣一箇中間層,想到一句話調侃的話:沒有什麼問題是添加一箇中間層解決不了的,如有,那就添加兩層。想一想,若是咱們一次要修改的東西太多,我想每寫一點東西就先存起來可是又不想讓它造成一個版本提交(由於沒寫完啊,提交的時候須要些commit comment的),那就寫一點就提交到暫存區諾,寫完後再一次commit。或者正在開心的寫着代碼,寫着一半忽然須要切換到另外一個分支去修復bug,那就將當前工做內容放到暫存區,而後利用stash功能將暫存區內容打包存起來,等修復完bug再回來恢復繼續。另外就是git的status功能,這個功能比較簡單,主要顯示就是當前倉庫的狀態,是否有內容須要add到暫存區,是都有暫存的內容須要commit到版本區等等。

相關文章
相關標籤/搜索