git學習記錄(一)——git工作原理


隨著對git不斷使用,逐步進行學習和理解,現把學習整理成一系列基礎內容,供大家參考和討論。主要包括:
1、git工作原理
2、開展git項目
3、多人合作git操作(代碼拉取,回滾和撤銷,合并代碼)
4、其他一些輔助工具

本節對git的工作原理進行介紹:

一、git是什么

1、git是一個分布式版本控制軟件,最初由林納斯·托瓦茲(Linus Torvalds)創作,于2005年以GPL發布。最初目的是為更好地管理Linux內核開發而設計。 ——維基百科

2、從定義可知:

  • 功能:版本控制
    • 項目開發時,進行代碼多版本管理
      eg:多版本分支,代碼共享,提示沖突等
    • 一些場景下,將版本回溯到之前某個時間點的版本
      eg:代碼回滾等
  • 特點:分布式
    • 每個客戶端代碼可以提交到本地倉庫,并可本地查看提交歷史記錄
    • 提交遠程服務器端不是必須的(與svn區別)

3、優點:

  • 免費,開源
  • 速度更快:一切的操作基本上在本地上完成
  • 分布式:服務器異常后,可繼續工作

二、工作原理:

1、工作原理圖,來自此處

2、工作原理圖簡介:
1)有四個儲存概念(除遠程倉庫在服務端,其他都在本地存儲):

  • workspace:工作目錄,本地操作的文件
  • index:暫存區,記錄各個文件的索引
  • local repository:本地倉庫
  • remote repository:遠程倉庫

2)常用場景:提交變更和同步/下載代碼

提交變更
  • git工作目錄中,在一個分支下(branch name),進行變更操作(增刪改)
  • 將變更提交到index暫存區(git add [fileName])
  • 再提交到本地倉庫 (git commit -m [commit info])
  • 最后提交到遠程倉庫(git push origin [branch name])
同步/下載代碼

對應上面提交變更步驟,可從三處同步代碼:

  • index暫存區(git checkout -b [ branch Name])
  • 本地倉庫(git checkout HEAD)
  • 遠程倉庫(兩種場景:git clone url [local directory] / git pull )
沖突

在提交和同步時,都要進行合并(merge),或手動或git自動合并,可能引起的沖突
(沖突:即同一文件同一位置代碼不一致,git不能判斷最終應該以那個為準)

  • 在同步git pull出現沖突,手動解決掉提示的沖突文件,然后再次提交,類似與下圖的沖突:
  • 提交時,可能有多種沖突情況,建議先從服務器端獲取最新代碼解決沖突,在本地運行通過,再提交

3、git版本控制的相關信息存儲——所有git的操作內容都放在.git文件夾
1).git是隱藏狀態,在項目根目錄,使用“ll -a”可查看
2)下圖是本地項目的.git文件夾下內容:

3) 查看可用官網幫組:git help gitrepository-layout

  • 下面總結的具體內容簡介:
    • COMMIT_EDITMSG——最后一次commit提交的msg信息
      備注:如果 git commit時,沒有加-m信息,就會進入COMMIT_EDITMSG進行信息編輯,打開此文件與編輯保存時一致

    • FETCH_HEAD,記錄在本地,從遠程的更新所有分支最新提交信息(可使用“git fetch”更新遠程所有的分支提交信息),查看文件,eg:

    • HEAD,當前指向的當前所在的分支(一個標記)
      eg:文件內容:ref: refs/heads/branch1,是指現在指向名“branch1”的分支

    • ORIG_HEAD,記錄一些危險操作(pull,push或者reset等)前的一個head操作指針,發生錯誤時候可以恢復到ORIG_HEAD指向操作

    • config,git的一些配置文件,遠程倉庫的相關一些配置信息(只針對當前所在的倉庫),和git的全局配置文件

    • description,供GitWeb(git的圖形界面的web瀏覽)使用,不用關心

    • hooks,包含掛鉤腳本文件,類似與監聽器,在執行了某些操作(eg:push,commit等)后,就會觸發執行
      1)git hooks應用有具體的用法
      2)定制些開發中自動化執行的流程,eg:代碼規范檢查,提交git規范交叉,代碼提交后周知或者打包等等

    • index,對應上面原理圖中index,是一個二進制文件,是操作文件的所有快照(索引)(eg:git add后就向文件寫入索引)
      1)不實際存儲內容,只是一個內容的索引(具體內容存儲在objects中),可使用特定軟件打開,參考官網說明
      2)也可使用git ls-files --stage查看索引和工作區中文件信息,

      上圖中,第二列即是指向objects的索引

    • /info,存儲不希望在.gitignore(包含不被git管理的文件或目錄)中忽略中全局可執行的文件

    • logs,項目中所有的每次提交信息

    • objects,具體上面index指向的實際的變更內容,包括文件內容,以及內容的tree對象和提交信息

    • packed-refs,為節省空間和提高效率,對多個松散對象打包時,把.git/refs內容移動到此文件中,手動運行git gc可查看到refs內容清空,文件記錄eg:

    • refs,存儲本地和遠程倉庫,各分支最后一次提交信息的索引

4、git通過對.git文件下內容操作,進行版本控制的,下面以提交為例可查看到如何實現:

git是一套內容尋址文件系統,存儲相關的鍵值對,然后通過鍵值對,對內容操作

1)在工作目錄內容改變,首先進行提交(git add),實際進行了下列操作

  • 將修改文件內容快照存儲(在.git/objects)
  • index文件中更新修改文件內容的索引
  • 多層路徑會存儲修改內容的tree對象

    ps:使用“git ls-files --stage ”查看index內容,eg:

2)在提交(git commit)后,生成commit對象

  • 存儲文件內容的快照(包括tree和上一次提交信息),操作時間,操作人和提交信息
  • commit信息,保存在.git/objects中
  • 使用“git cat-file -p [commit的指針]”,eg:
  • commit的指針,可使用git log獲取,eg下圖中commit后的索引值:

3)對于其他同步,回滾等操作,都是通過鍵值對不斷對object中文件內容操作
tips:鍵值對通過哈希算法SHA-1計算,git對象存儲的鍵值對通過文件頭+文件內容進行SHA-1計算,詳細請參考此處

此文章參考內容:
1.https://zh.wikipedia.org/wiki/Git
2.https://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1
3.http://gityuan.com/2015/06/27/git-notes/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容