1. 程式人生 > >Git版本管理之旅(一)—— Git簡介及架構淺析

Git版本管理之旅(一)—— Git簡介及架構淺析

  • 背景與誕生
  • 功能
  • 架構
  • 安裝

Git一覽

背景與誕生

1991年,Linus建立了開源的Linux;

2002年以前,世界各地的志願者把原始碼檔案通過diff的方式發給Linus,然後由Linus本人通過手工方式合併程式碼!
Q:為什麼把Linux程式碼放到類似CVS、SVN版本控制系統裡呢?
A:這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。

2002年,Linux系統已經發展了十年了,程式碼庫之大讓Linus很難繼續通過手工方式管理了,更加不利於社群發展,於是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社群免費使用這個版本控制系統。

2005年,社群成員試圖破解BitKeeper的協議,被BitMover公司發現了,於是BitMover公司怒了,要收回Linux社群的免費使用權。

兩週後,Linus自己用C寫了一個分散式版本控制系統——Git!

一個月之後,Linux系統的原始碼已經由Git管理了!Git迅速成為最流行的分散式版本控制系統。

2008年,GitHub網站上線了,它為開源專案免費提供Git儲存,無數開源專案開始遷移至GitHub,包括jQuery,PHP,Ruby等等。

功能

  1. 版本記錄與恢復
    版本不同是因為檔案都會被修改,被各種不同的人修改;最簡單的版本是我們通過複製貼上,根據時間重新命名來儲存各個版本。但是當我們需要恢復到某一個時間點的資料或者需要合併某兩個甚至某幾個時間點的資料的時候,顯然這種簡單的版本是無法滿足的。
    為了滿足人們對各個版本記錄以及恢復的需求,產生了版本控制這樣的系統。
  2. 共享資料
    很多時候,我們的辦公地點在變化,辦公工具在變化。甚至辦公人員從1個變成n個,通過u盤或者郵件的方式可以共享,但是顯然不夠便捷。將檔案進行共享,從伺服器pull檔案,修改之後push修改之後的檔案到伺服器。所有人都可以共享。
  3. 追蹤修改資訊和責任人
    檔案共享之後,那麼也將面臨一系列的問題。不同人員修改的檔案,不同版本的檔案,需要如何去merge?需要如何去解決衝突?我們需要知道檔案的版本樹結構,需要知道所有版本的修改資訊以及修改人資訊。

架構

  1. 本地版本控制系統
    見思維導圖
  2. 集中式版本控制系統
    見思維導圖
  3. 分散式版本控制系統

    博主將Git作為一種版本控制系統的工具,只是簡單介紹不做深入的分析

客戶端並不只提取最新版本的檔案快照,而是把原始的程式碼倉庫完整地映象下來。服務起發生故障都可以從本地節點恢復資料。因為每一次的提取操作,實際上都是一次對程式碼倉庫的完整備份。

Git備份模式

Git 和其他版本控制系統的主要差別在於,Git 只關心檔案資料的整體是否發生變化,而大多數其他系統則只關心檔案內容的具體差異。

檔案在儲存到 Git 時,資料都要使用 SHA-1 演算法進行內容的校驗和(checksum)計算,得到一個 SHA-1 雜湊值,作為指紋字串。該字串由 40 個十六進位制字元(0-9 及 a-f)組成,並將此結果作為資料的唯一標識和索引。通過唯一標誌判斷檔案的完整性以及是否變更。所有儲存在 Git 資料庫中的東西都是用此雜湊值來作索引的,而不是靠檔名。

Git 不儲存這些前後變化的差異資料,而是把變化的檔案作快照後,記錄在檔案系統中。每次提交更新時,遍歷所有檔案的資訊並對檔案作快照,然後儲存一個指向這次快照的索引。若檔案沒有變化,Git 不會再次儲存,而只對上次儲存的快照作一連結。

Git檔案快照

檔案在Git中有三種狀態

  • 已提交(committed)
    -表示該檔案已經被安全地儲存在本地資料庫中
  • 已修改(modified)
    -表示修改了某個檔案,但還沒有提交儲存
  • 已暫存(staged)
    -表示把已修改的檔案放在下次提交時要儲存的清單中

每個專案都有一個 Git 目錄,它是 Git 用來儲存元資料和物件資料庫的地方。每次克隆映象倉庫的時候,就是這個目錄裡面的資料。

從專案中取出某個版本的所有檔案和目錄,用以開始後續工作的叫做工作目錄。這些檔案實際上都是從 Git 目錄中的壓縮物件資料庫中提取出來的,接下來就可以在工作目錄中對這些檔案進行編輯。

所謂的暫存區域只不過是個簡單的檔案,一般都放在 Git 目錄中。有時候人們會把這個檔案叫做索引檔案,不過標準說法還是叫暫存區域。

Git檔案流

安裝

基於Ubuntu的安裝教程

  1. 在Github網站註冊帳號,建立工程 test 進入工程,右下角會有一個專案倉庫的地址。

  2. Linux下 安裝github
    sudo apt-get install git git-core git-doc

  3. 建立rsa公鑰
    ssh-keygen -t rsa -C “[email protected]
    整個過程中有一個需要填密碼
    然後後進入~/.ssh目錄 找到公鑰id_rsa.pub
    記事本打開復制文字
    進入github.com中的的設定,找到pubkey選項,填入公鑰

  4. 設定賬戶資訊
    git config –global user.name “xxx”
    git config –global user.email [email protected]

相關推薦

Git版本管理—— Git簡介架構淺析

背景與誕生 功能 架構 安裝 背景與誕生 1991年,Linus建立了開源的Linux; 2002年以前,世界各地的志願者把原始碼檔案通過diff的方式發給Linus,然後由Linus本人通過手工方式合併程式碼! Q:為什麼把L

Git版本管理—— Git基本操作流程相關命令

本章繼續上章的型別,介紹基於空專案的版本庫操作,本教程基於Ubuntu 建立版本庫 新增檔案 修改檔案 刪除檔案 版本回退 基本概念 管理以及撤銷修改 新增到遠端倉庫 從遠端倉庫克隆 建立版本庫 版本庫又名倉庫,英文名repository,可以

css重構

rdquo lan set 變化 部分 網站 一個 寬度 lang css重構之旅 >前言: 今年我大一,馬上就要大二了。從高三畢業暑假到大學的這一年馬上過去,馬上迎來大二生活.學習前端也有將近一年了。一昧去追求那些視覺的效果和相對高端和新穎的技術,反而忽略了最基礎

小白的linux學習

探索linux一、進入系統*)普通用戶登陸student 普通用戶,密碼student*)超級用戶登陸 —〉not listed 點擊未列出 username 提示輸入用戶名稱 —〉root root 為系統超級用戶 passw

dotNet程序員的Java爬坑

是我 方法 轉java 自己的 java pri 也好 工作 計劃     仔細想了下還是轉java吧,因為後期不管是留在北京也好還是回老家也好,java的工作都會好找一點。現在的工作主要還是寫.net,目標是下一次離職的時候可以找到一份全職的java工作,我一直都覺得實踐

webpack入坑不是開始的開始

targe base 增加 -i pre 版本 uil 靜態頁 obi 最近學習框架,選擇了vue,然後接觸到了vue中的單文件組件,官方推薦使用 Webpack + vue-loader構建這些單文件 Vue 組件,於是就開始了webpack的入坑之旅。因為原來沒有用過

RabbitMQ學習

RabbitMQ學習總結(一) RabbitMQ簡介 RabbitMQ是一個訊息代理,其接收並轉發訊息。類似於現實生活中的郵局:你把信件投入郵箱的過程,相當於往佇列中新增資訊,因為所有郵箱中的信件最終都會彙集到郵局中;當郵遞員把你的新建傳送給收件人的時候,相當於訊息的轉發。 RabbitMQ中

linux程序管理概念

一、程序和執行緒的概念 1.程序和執行緒的定義   程序並不只是一段可以執行的程式碼,也包含了執行程式碼所需要的資源。   在作業系統來看,程序是資源管理的最小單元,而我們又知道,執行緒是程式執行的最小單元。   話說回來,Linux系統至少有一個程序,一個程式可以對應多個程序,一個程序只能對應一個程

Python學習

Python的簡介 Python是一種面向物件的、動態的指令碼語言,可用來設計網頁和開發後臺功能。其創始人Guido van Rossum於1989年聖誕節期間創造了這門語言。 (圖片來自百度) Python的種類 CPython Jython IronPython PyPy …… 與J

小程式wepy踩坑---- thirdScriptError sdk uncaught third Error module "npm/lodash/_nodeUtil.js

     近期一直在學小程式,作為新手,比較了下mpvue和wepy兩個小程式框架,mpvue作為美團剛出來的vuejs開發看起來很不錯,學習成本很低,但是對於在實際專案開發中,mpvue剛出來,很多資料,比如踩坑,比較少,而we

我的現代Javascript啟程、面向物件的現代Javascript

    Javascript曾經被認為是一門小玩具似的指令碼語言。大部分   的程式設計師都覺得它只是輔助工具,用來頁面端校驗——僅此   而已。隨著Javascript語言的演變,其功能越來越強大。直到  

記錄我的Python學習關於turtle庫的基本用法

關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <>   1、turtle.setup(width,height,startx,starty)  /

dart

console sta 環境安裝 ria odi 等價 app func tar 前言 最近在看 dart 了,本著 “紙上得來終覺淺,絕知此事 markdown” 的原則,準備邊學邊寫,寫一個系列,這是第一篇。學習過程中主要是參考 A Tour of the Dart L

Git版本控制工具學習

       Git是一個版本控制系統,用來追蹤計算機檔案的變化的工具,也是一個供多人使用的協同工具。它是一個分散式的版本控制系統,本文將簡單介紹如何使用。簡單來說,就是你要和你的夥伴一起完成一項任務,但是你們要互相交換修改,檢視自己的歷史版本等。版本控制系統就是幫助我們做這

Spring Boot 探索——Spring Boot 簡介

一、什麼是Spring Boot 隨著技術日新月異的發展,如今的軟體設計已不想曾經那般單一。業務複雜,功能繁瑣,大量三方元件的相互整合,成為了開發的一大難題。幸而,Spring Boot如同一道曙光,為我們java開發者帶來了福音,讓我們擺脫專案構架時各種配置的鬧心,得以專

學習Pytorch----

感覺很棒哦,大家可以動動手指到GitHub上點個Star偶~~ 言歸正傳,這是第一次記錄一個深度學習框架的部落格,加上作者自己的觀點和實踐,認真的分析和思考,之前都是寫在本子上@@ 1.Tensors張量 張量是用於GPU加速的類似於Numpy中ndarray的資料

C語言入門

特殊的迴圈語句 ,讓for迴圈開始的方法: 將sum初始化為0;或者先在迴圈體外讀第一個數 注意要先判斷再運算,避免最後一個數據發生錯誤 for(sum=0;n!=-1;) { sum+=n; scanf(“%d”, n); } 輸入x,y之間的閏年 i

大疆無人機Android版SDK開發踩坑----前言

  最近一段時間一直在做大疆無人機安卓版開發,這水也是挺深的,不仔細看官網SDK的介紹就會遇到各種各樣的坑,簡單記錄一下,希望可以讓其他人少走一些彎路。   安卓端用到的SDK大概有兩種:Android SDK和Android UX SDK   Android SDK(官網介紹):   開發人員可以通過SDK

Java架構

夜光序言:   如果世界和你,都掉進了河裡,我一定先救你,然後忘記世界的呼吸~       正文: MVC框架的演變   我們安裝這個外掛解決沒有tomcat的問題,因為targ

遊戲敏捷開發專案管理我見

縱觀整個遊戲開發週期,大部分時間都是在趕趕趕,趕開發進度,趕Bug進度,趕釋出進度。搞得交投爛額,搞得最後大家筋疲力竭,最終商務、策劃、boss都覺得開發不給力。所以我們有必要,也有義務去採取一些措施來