git的介紹與使用

       最近在學習一些開源技術,順帶想起了之前曾經別人推薦的git。作爲一個程序員,肯定也都會很想要有一個自己的服務器,然後將一些重要數據備份在服務器中。如果是需要和朋友共同開發,那服務器更是不可或缺。但是你懂得,我等屌絲,木有錢購買自己的服務器,也不願意去買一個服務器,嘿嘿,不是有開源的git麼?正合我意,好吧,順帶日誌也是需要記錄的。

版本控制

本地

       爲了讓某個文件能夠恢復到之前的某個時間點,需要對文件進行版本控制。最開始的時候,可以在本地以時間爲爲單位,建立文件夾,使用copy文件到多個文件夾的技術,然後不一樣的時間點,保存不一樣的文件,通過這種方式,就可以實現備份文件了。
 
       這時候,本地機器作爲版本控制中心。但是這種方式有個很明顯的缺點,無法進行共享文件。比如開發一個程序,需要多人協同開發,就難以實現。


單臺服務器

       於是,就出現了一種新的方式,就是使用一臺服務器,作爲版本控制中心,也就是我們經常使用的svn,cvs等工具。
    
 
       通過這種方式,多人可以很好的進行協同開發,看起來,一切都很美妙。但是,如果中心服務器掛掉了呢?這時候後果會怎樣?很抱歉,這時候中心服務器的數據將會有可能全部丟失(硬盤壞了)。這時候,客戶端可能只能保存着之前某個時間點的文件。所以這種方式同樣面臨着單點故障的風險。

集羣

      在技術不斷進步的今天,人們發現了新的辦法來解決單臺服務器面臨的單點故障問題,就是使用服務器集羣(cluster)。比如使用三臺服務器作爲服務器,然後將數據同時備份到這三個服務器,所以容錯能力將會大大提供。
    
 


Snapshot

       下面我們來看下傳統的svn,cvs等工具是如何來備份數據的,如下圖所示
 
       這類工具被將這些文件在每個版本中都保存一份,比如version1中,FileA、FileB、FileC都會保存一份,然後在version2,也會保存一份變化的FileA、FileB、FileC,哪怕某個文件沒有發生變化也會複製一份,比如FileB沒有變化,但是在version2中需要從version1中copy FileB到version2中。
    
        但是在git中,卻不是這樣子保存的,如下圖所示:
 
       git爲了提高效率,並不是將每份文件都保存一份,而是採用了另外一種方式。只保存某個客戶端有變化的文件。比如在version2,其中FileB這時候並沒有改變,所以並不是保存一份FileB的複製文件,而是使用指針的方式,指向了version1的FileB文件。

幾乎都是本地操作

       在svn中,嚴重依賴於網絡,如果網絡掛了,那麼很多最新文件的信息都無法得知,也無法提交新的更新。在git中,幾乎所有的操作都是本地的,速度非常快,並且不受限於網絡。這個特點,也是git的一種顯著特徵。比如你家裏沒有網絡,那麼你同樣可以使用git來查看版本信息,或者是提交更新代碼,因爲git會把數據記錄在本地數據倉庫中。在具體的實現上,大概就是,客戶端從服務器copy一份snapshot到本地,然後每次提交的數據都會保存在本地倉庫,查看版本信息時,默認情況下也是從本地查看,而不是服務器。

數據一致性

       在git中,git會對數據進行校檢。如果想要修改一些git不知道的文件,git都會拒絕。同樣,在引用git的文件時,git同樣會確保數據的完整性。


文件的三個狀態

       在git中,文件主要有三種狀態,分別是:committed、modified、staged。
  • committed代表文件已經提交到本地倉庫
  • modified代表文件已經被修改,但是還沒有提交到本地倉庫
  • staged代表文件已經被修改,並且做了一個標誌,下次將會被提交到本地倉庫
       在這裏面引入了三個目錄,分別是:the Git directory、the working directory、and the staging area,下面是這幾個目錄之間的轉換關係圖
 


  • the git directory是存儲本地數據的目錄,也就是使用git clone下來的目錄
  • the working directory是從the git directory檢出某個版本的文件目錄
  • the staging area是下一次commit的目錄,裏面記錄了下一次commit的信息


git的主要流程

    1. 在working directory中修改文件
    2. 將修改的文件添加到staging area
    3. commit staging area的文件到repository

git命令

       在git中,有很多種工具可以使用,這裏面使用git的命令行,相信學會了命令行的操作,其他的gui也是手到擒來。在這裏面,具體的安裝,大家自己參考下文檔,就不多介紹了。

git config 設置git的相關屬性

       在這裏面,我們可以設置多個屬性,也可以直接編輯git的配置文件。
  • /etc/gitconfig這個文件保存着git的全局通用信息,對應的命令是:git config --system
  • 在工具空間下的~/.gitconfig或者~/.config/git/config文件,代表的是當前git用戶的配置文件,對應的命令:git config --global

設置用戶信息

$ git config --global user.name "your name"
$ git config --global user.email "[email protected]"
每次提交信息時,都會需要用到這兩個信息,所以第一次使用git時,記得設置信息。
如果下次某個工程,你不想使用這個用戶名和郵件,可以去掉--global參數,重新設置便可。

查看配置信息

$ git config --list

獲取幫助命令

$ git help <verb>
比如查看config指令:$ git help config

將某個目錄變成git管理的工程

1、進入你要提交給git管理的目錄,比如我的是C:\git\demo
2、執行下面的git命令:$ git init
3、將該目錄中的文件添加到git中,執行下面的命令:$ git add demo.txt
4、commit數據到本地倉庫中,執行如下命令:$ git commit -m "the initial commit"
整個過程如下圖所示:


從git倉庫中,clone一份到本地

       在如火如荼的開源世界,越來越多的開源項目都將代碼交給git來管理,如果你想將某個工程clone到你本地,那麼就可以使用 $ git clone [urls]命令。
1、找到自己感興趣的git項目,複製url
 
2、執行$ git clone [url] [the project name]
 

       url:倉庫url地址
       the project name:設置工程名字,默認爲url後面部分的工程名字
這時候,git會將整個工程的數據都pull到本地,這裏和普通的svn有着重大的區別。在svn中,會將所有的文件checkout出來(複製某個版本的所有文件),而git則是會把所有的數據,包括源文件,以及版本信息都完整的複製到本地。


提交文件到倉庫中

       我們將git中的文件分爲下面幾個狀態:tracked or untracked。tracked代表文件屬於git管理,unchecked代表文件不屬於git管理。在使用$ git clone [url]命令,那麼本地對應的git工程中,所有的文件都是屬於checked的,如果你新添加的文件,那麼都是unchecked的。同樣的,我們也將文件分爲modified or unmodifiled。modified代表文件已經修改,但是沒有commit;unmodified代表文件已經commit,沒有修改。下面是文件之間的狀態轉換圖:


 

查看狀態:$ git status

       如果你的工程剛剛$ git clone下來,那麼結果如下所示:
 
git同樣支持查看簡要信息:$ git status -s
這個表示,當前工程,所有的文件都是checked並且unmodified狀態,並且顯示出了當前的分支。下面我添加一個新的文件到git的文件中,並且輸入新的內容。這裏假設README文件存在,如果不存在,可以使用$ git add [file name],將file name文件變成tracked,然後輸入文件內容。
添加一個文件到git:$ git add [file name],或者是一個文件更新了,同樣也是使用這個命令。這個命令不單止將一個文件變成tracked,同樣也會將這個文件加入到the staging area中,下次commit時,將會提交到repository。

提交

       一個文件,通過$ git add [file]變成了tracked以及staging,下一步就是將數據commmit,commit的命令也非常簡單,就是:$ git commit。
這個命令會要求用戶輸入這次提交的註釋,用戶直接添加自己的註釋,然後提交便可。如果想跳過這一步,就使用下面這個命令:$ git commit -m "the desc content"。

刪除文件

       刪除一個文件:第一步,$ rm [the file name],第二步:$ git commit,第三步:$ git rm [the file name]
 


移動文件:$ git mv [file_from] [file_to],這個指令就是其實就是將原來的文件進行了如下的幾步操作:

  • $ git rm README.md 刪除原來的文件
  • $ git add README  添加新的文件


總結

       學習需要堅持不懈,特別對於很多新技術而言,更加需要具備良好的英語閱讀能力。所以,如果從長遠考慮,英語的學習必不可少,有時候甚至比技術更加的重要。希望自己在接下來的工作生涯中,可以繼續保持學習英語的幹勁,不斷提高自己的學習能力。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章