git基本框架

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/xiaoputao0903/article/details/23912561

1.什麼是git

        這個去google一下可以搜出一大堆,git就是一個軟件管理器,不同一般的是它是分佈式的,不僅有一箇中心的服務器控制最新版本代碼,而且每個開發者自己還有個本地倉庫,所以在開發過程中都是先將代碼提交到本地倉庫再推送到中心服務器上的,這樣的好處就是每個人都依賴於中心服務器來實現交互,但又不會被中心服務器限制,就算中心服務器掛了,也能很容易的找到最新版本的代碼,而且我自己的工作依然可以順利進行,提交到本地倉庫,當中心服務器修復之後,再將自己倉庫的東西推送到中心服務器。當然它還有很多的不同點,以後再來比較git和svn。

2.自己的git倉庫

        我們要進行開發,提交代碼和中心服務器進行交互,首先我們要有自己的一個開發基地,也就是我們自己的git倉庫。擁有自己的git倉庫的方式有兩種,一就是在自己已有的目錄裏初始化自己的git倉庫然後和中心服務器建立連接,更新最新代碼到自己的git倉庫。二就是將一個已經存在的項目克隆到自己的目錄成爲自己的git倉庫。

        執行git init命令,就會創建並初始化git倉庫,這個時候在該目錄下會產生一個.git的隱藏文件夾,而該目錄就是你的工作目錄,你的一切行爲都是在這個目錄裏,而這個.git文件夾就是你的本地倉庫,當你進行了一些文件操作之後,認爲可以提交了那麼首先你就是提交到本地倉庫也就是這個.git中,然後再推送到中心服務器。或者直接克隆一個倉庫到本地作爲git倉庫,也是一樣的。當你進入到這個.git目錄中,會發現裏面還有很多的子目錄和文件,有的是很重要的,這裏說幾個,config文件,這是你項目的配置文件,裏面有中心服務器的信息和分支信息,HEAD文件指向當前的分支,index文件是暫存區的相關信息,logs目錄中都是相關操作產生的日誌,這個很重要,因爲日誌是我們操作的唯一證據,我們本地的版本控制也靠它,objects目錄裏面存儲的就是所有 的數據,也就是快照,refs目錄裏是存儲指向數據提交對象的指針。

        乍看之下不知道說的什麼,主要是裏面的很多名字不知道是什麼東西,下面再來看看一些名字概念,分支和提交對象以後再講這個涉及版本的控制,我們先看最基本的。

3.git的分層結構

        剛開始學習git的時候,總是一頭霧水,又是什麼工作目錄,又是什麼暫存區,又是什麼本地倉庫,又是什麼遠程倉庫,還尼瑪快照,看的我頭暈眼花的。但是隻要把這幾個概念弄清楚,那麼最基本的開發就不是問題了。先來看看我所理解的git的分層結構:


        git的工作總共分四層,其中三層是在自己本地也就是前面說的git倉庫,包括了工作目錄,暫存區和本地倉庫,工作目錄就是我們執行命令git init時所在的地方,也就是我們執行一切文件操作的地方,暫存區和本地倉庫都是在.git目錄,因爲它們只是用來存數據的。遠程倉庫在中心服務器,也就是我們做好工作之後推送到遠程倉庫,或者從遠程倉庫更新下來最新代碼到我們的git倉庫。git所存儲的都是一系列的文件快照,然後git來跟蹤這些文件快照,發現哪個文件快照有變化它就會提示你需要添加到暫存區或是提交到本地倉庫來保證你的工作目錄是乾淨的。

        這個怎麼理解呢,git中的文件有兩種狀態,一種是被跟蹤的,也就是提交到本地倉庫的文件,因爲本地倉庫要保管它們當然得跟蹤他們,對它們負責,還有一種就是未被跟蹤的。那麼當我們添加新的文件時,它不是被跟蹤的,因爲本地倉庫裏面沒有這個文件,它是外來的,本地倉庫目前還不需要對他們負責。但是如果是對倉庫已經存在的文件進行修改,那麼這些文件就是被跟蹤的文件,就可以通過git status查看他們的狀態來進行相應的操作。當然我們也可以生成一個.gitignore文件,裏面指定要忽略的文件類型,然後這些文件就不會被跟蹤,不管怎麼改變它們,git status都不會提示你需要做什麼操作的。

        所以當我們在工作目錄中進行文件操作後,要先添加到暫存區,然後再將暫存區中剛添加的文件快照提交到本地倉庫,然後再將本地倉庫的最新版本文件快照推送到遠程倉庫。這個文件快照其實就是各個文件的在被添加到暫存區時的狀態,就和照相一樣的,留下每個不同時刻的快照,方便以後查詢,而git存儲的就是這些一系列的快照。說到這個快照就要說說git的對象了。

4.git的對象

        從根本上講,git是一套內容尋址的文件系統,它存儲的也是key-value鍵值對,然後根據key值來查找value的,說到尋址就會想到指針吧,不錯,git也是根據指針來尋址的,這些指針就存儲在git的對象中。git一共有3種對象,commit對象,tree對象和blob對象。下面便是這3個對象:


        這個blob對象對應的就是文件快照中那些發生變化的文件內容,而tree對象則記錄了文件快照中各個目錄和文件的結構關係,它指向了被跟蹤的快照,commit對象則記錄了每次提交到本地倉庫的文件快照,從上圖看出其中有兩個指針,一個指向tree對象,一個則指向上一個commit對象。這個怎麼理解呢,怎麼還有上一個commit對象,在開發過程中,我們會提交很多次文件快照,那麼第一次提交的內容會用一個commit來記錄,這個commit沒有指針指向上一個commit對象,因爲沒有上一個commit,它是第一個,當第二次提交時,又會有另外一個commit對象來記錄,那麼這次commit對象中就會有一個指針指向上一次提交後的commit對象,經過很多次提交後就會有很多的commit對象,它們組成了一個鏈表,當我們要恢復哪個版本的時候,只要找到這個commit對象就能恢復那個版本的文件不是嗎。而我們所謂的HEAD對象其實就指向最近一個提交的commit對象,也就是最後一個commit對象。

5.git的基本操作

        上面說了這麼多東西,也該看看基本操作了,基本上的操作無非是文件的增刪改和版本的提交更新回溯。當把上面的內容弄清楚之後,這些基本操作根本就是小草一碟:


       上面列出了基本上能用到的所有命令,當然還沒涉及到分支,這個概念後面再說,基本的用法google一下一大堆,這裏不用多說,還有就是要經常用到git status這個命令,它可以指引你該幹嘛幹嘛,確定你的工作目錄是否乾淨。乾淨的意思就是和暫存區還有本地倉庫保持一致。還有一個命令也是經常用到的,那就是git log,這個命令會列出你的操作產生的日誌,有很多的信息,還有提交後的commit對象的id,這個checkout版本的時候用處很大。

6.學習感受

        以前在用svn的時候,基本兩條命令就可以搞定,svn up,svn ci,svn di更新,提交和比較,就知道哦svn up是將服務器的代碼更新到本地,哦svn ci是將本地代碼提交到服務器,有衝突哦svn di解決衝突了再提交。根本不知道其結構式怎樣,這些會導致什麼結果,用起來總是小心翼翼,生怕把服務器搞掛了。學習就是要知其所以然,用起來纔會順手,基本原理弄懂之後,操作這些就是相關命令多用用自然搞定。我也是個git初學者。推薦一篇文章,這篇文章很深入的分析了git內部原理,以至於我都沒看懂多少,慚愧:http://www.open-open.com/lib/view/open1328070620202.html

        git分支後面再講。話說這個圖畫的確實是小學生的水平啊,不過能能看懂就好,這個是用windows自帶畫圖板畫的,哈哈,不喜勿噴,有啥好用的畫圖軟件求推薦。
————————————————
版權聲明:本文爲CSDN博主「乜都得」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiaoputao0903/article/details/23912561

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 3878
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章