Git自學(xué)(3)-- Git 原理及基本概念詳解

0古程、寫在前面

經(jīng)過Git自學(xué)(1)-- Win10 安裝 Git 詳細教程(超詳細純小白教程)
Git自學(xué)(2)-- Git安裝后首次配置與第一次使用Git和Github管理自己的代碼(超詳細純小白圖文教程)的實際操作后,對Git和Github的使用流程有了初步的了解喊崖,下面首先深入了解下Git的原理,然后對Git常用命令進行介紹雇逞。

1荤懂、Git是什么?

Git 是一個開源的分布式版本控制系統(tǒng)塘砸,用于敏捷高效地處理任何或小或大的項目节仿。
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件。
Git 與常用的版本控制工具 CVS, Subversion 等不同掉蔬,它采用了分布式版本庫的方式廊宪,不必服務(wù)器端軟件支持。

2女轿、版本控制簡史

2.1 什么是“版本控制”箭启?

什么是“版本控制”?我為什么要關(guān)心它呢蛉迹? 版本控制是一種記錄一個或若干文件內(nèi)容變化傅寡,以便將來查閱特定版本修訂情況的系統(tǒng)。

如果你是位圖形或網(wǎng)頁設(shè)計師北救,可能會需要保存某一幅圖片或頁面布局文件的所有修訂版本(這或許是你非臣霾伲渴望擁有的功能),采用版本控制系統(tǒng)(VCS)是個明智的選擇珍策。 有了它你就可以將選定的文件回溯到之前的狀態(tài)托启,甚至將整個項目都回退到過去某個時間點的狀態(tài)攘宙,你可以比較文件的變化細節(jié),查出最后是誰修改了哪個地方持痰,從而找出導(dǎo)致怪異問題出現(xiàn)的原因,又是誰在何時報告了某個功能缺陷等等。

使用版本控制系統(tǒng)通常還意味著,就算你亂來一氣把整個項目中的文件改的改刪的刪,你也照樣可以輕松恢復(fù)到原先的樣子凳怨。 但額外增加的工作量卻微乎其微。

2.2 本地版本控制系統(tǒng)

許多人習(xí)慣用復(fù)制整個項目目錄的方式來保存不同的版本李剖,或許還會改名加上備份時間以示區(qū)別。 這么做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件普气。

為了解決這個問題夷磕,人們很久以前就開發(fā)了許多種本地版本控制系統(tǒng)坐桩,大多都是采用某種簡單的數(shù)據(jù)庫來記錄文件的歷次更新差異。


請?zhí)砑訄D片描述

其中最流行的一種叫做 RCS膘螟,現(xiàn)今許多計算機系統(tǒng)上都還看得到它的蹤影碾局。 RCS 的工作原理是在硬盤上保存補丁集(補丁是指文件修訂前后的變化)萍鲸;通過應(yīng)用所有的補丁擦俐,可以重新計算出各個版本的文件內(nèi)容埋合。

2.3 集中化的版本控制系統(tǒng)

接下來人們又遇到一個問題甚颂,如何讓在不同系統(tǒng)上的開發(fā)者協(xié)同工作振诬? 于是,集中化的版本控制系統(tǒng)(Centralized Version Control Systems衍菱,簡稱 CVCS)應(yīng)運而生赶么。 這類系統(tǒng),諸如 CVS脊串、Subversion 以及 Perforce 等辫呻,都有一個單一的集中管理的服務(wù)器,保存所有文件的修訂版本琼锋,而協(xié)同工作的人們都通過客戶端連到這臺服務(wù)器放闺,取出最新的文件或者提交更新。 多年以來缕坎,這已成為版本控制系統(tǒng)的標準做法怖侦。

請?zhí)砑訄D片描述

這種做法帶來了許多好處,特別是相較于老式的本地 VCS 來說。 現(xiàn)在础钠,每個人都可以在一定程度上看到項目中的其他人正在做些什么恰力。 而管理員也可以輕松掌控每個開發(fā)者的權(quán)限,并且管理一個 CVCS 要遠比在各個客戶端上維護本地數(shù)據(jù)庫來得輕松容易旗吁。

這么做最顯而易見的缺點是中央服務(wù)器的單點故障踩萎。 如果宕機一小時,那么在這一小時內(nèi)很钓,誰都無法提交更新香府,也就無法協(xié)同工作。

并不是說服務(wù)器故障了就沒有辦法寫代碼了,只是在服務(wù)器故障的情況下,編寫的代碼是沒有辦法得到保障的.試想 svn 中央服務(wù)器掛機一天.你還拼命寫了一天代碼,其中 12 點之前的代碼都是高質(zhì)量可靠的,而且有很多閃光點.而 12點之后的代碼由于你想嘗試一個比較大膽的想法,將代碼改的面目全非了.這樣下來你 12 點之前做的工作也都白費了码倦,有記錄的版本只能是 svn 服務(wù)器掛掉時保存的版本!

如果中心數(shù)據(jù)庫所在的磁盤發(fā)生損壞企孩,又沒有做恰當備份,毫無疑問你將丟失所有數(shù)據(jù)——包括項目的整個變更歷史袁稽,只剩下人們在各自機器上保留的單獨快照勿璃。 本地版本控制系統(tǒng)也存在類似問題,只要整個項目的歷史記錄被保存在單一位置推汽,就有丟失所有歷史更新記錄的風(fēng)險补疑。

最壞的情況是徹底丟失整個項目的所有歷史更改記錄,而被客戶端偶然提取出來的保存在本地的某些快照數(shù)據(jù)就成了恢復(fù)數(shù)據(jù)的希望歹撒。但這樣的 話依然是個問題莲组,你不能保證所有的數(shù)據(jù)都已經(jīng)有人事先完整提取出來過。只要 整個項目的歷史記錄被保存在單一位置暖夭,就有丟失所有歷史更新記錄的風(fēng)險锹杈。

2.4 分布式版本控制系統(tǒng)

于是分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)面世了迈着。 在這類系統(tǒng)中竭望,像 Git、Mercurial裕菠、Bazaar 以及 Darcs 等市框,客戶端并不只提取最新版本的文件快照, 而是把代碼倉庫完整地鏡像下來糕韧,包括完整的歷史記錄枫振。 這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障萤彩,事后都可以用任何一個鏡像出來的本地倉庫恢復(fù)粪滤。 因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份雀扶。

請?zhí)砑訄D片描述

更進一步杖小,許多這類系統(tǒng)都可以指定和若干不同的遠端代碼倉庫進行交互肆汹。籍此,你就可以在同一個項目中予权,分別和不同工作小組的人相互協(xié)作昂勉。 你可以根據(jù)需要設(shè)定不同的協(xié)作流程,比如層次模型式的工作流扫腺,而這在以前的集中式系統(tǒng)中是無法實現(xiàn)的岗照。

請?zhí)砑訄D片描述

分布式的版本控制系統(tǒng)在管理項目時,存放的不是項目版本與版本之間的差異笆环。它存的是索引(所需磁盤空間很少攒至,所以每個客戶端都可以放下整個項目的歷史記錄)。
分布式的版本控制系統(tǒng)出現(xiàn)之后,解決了集中式版本控制系統(tǒng)的缺陷:

  1. 斷網(wǎng)的情況下也可以進行開發(fā)(因為版本控制是在本地進行的)躁劣。
  2. 使用 github 進行團隊協(xié)作迫吐,哪怕 github 掛了,每個客戶端保存的也都是整個完整的項目(包含歷史記錄的!!!)账忘。

在 Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源志膀,一般不需要來自網(wǎng)絡(luò)上其它計算機的信息。(近乎所有操作都是本地執(zhí)行) 如果你習(xí)慣于所有操作都有網(wǎng)絡(luò)延時開銷的集中式版本控制系統(tǒng)鳖擒,Git 在這方面會讓你感到速度之神賜給了 Git 超凡的能量梧却。 因為你在本地磁盤上就有項目的完整歷史,所以大部分操作看起來瞬間完成败去。

舉個例子,要瀏覽項目的歷史烈拒,Git 不需外連到服務(wù)器去獲取歷史圆裕,然后再顯示出來——它只需直接從本地數(shù)據(jù)庫中讀取。 你能立即看到項目歷史荆几。如果你想查看當前版本與一個月前的版本之間引入的修改吓妆, Git 會查找到一個月前的文件做一次本地的差異計算,而不是由遠程服務(wù)器處理或從遠程服務(wù)器拉回舊版本文件再來本地處理吨铸。

這也意味著你在離線或者沒有 VPN 時行拢,幾乎可以進行任何操作。 如你在飛機或火車上想做些工作诞吱,就能愉快地提交(到你的 本地 副本舟奠,還記得嗎?)房维, 直到有網(wǎng)絡(luò)連接時再上傳沼瘫。

3、Git 簡史

同生活中的許多偉大事物一樣咙俩,Git 誕生于一個極富紛爭大舉創(chuàng)新的年代耿戚。

Linux 內(nèi)核開源項目有著為數(shù)眾多的參與者。 絕大多數(shù)的 Linux 內(nèi)核維護工作都花在了提交補丁和保存歸檔的繁瑣事務(wù)上(1991-2002年間)。 到 2002 年膜蛔,整個項目組開始啟用一個專有的分布式版本控制系統(tǒng) BitKeeper 來管理和維護代碼坛猪。

到了 2005 年,開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束皂股,他們收回了 Linux 內(nèi)核社區(qū)免費使用 BitKeeper 的權(quán)力墅茉。 這就迫使 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經(jīng)驗教訓(xùn),開發(fā)出自己的版本系統(tǒng)屑墨。 他們對新的系統(tǒng)制訂了若干目標:

  • 速度
  • 簡單的設(shè)計
  • 對非線性開發(fā)模式的強力支持(允許成千上萬個并行開發(fā)的分支)
  • 完全分布式
  • 有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項目(速度和數(shù)據(jù)量)

自誕生于 2005 年以來躁锁,Git 日臻成熟完善,在高度易用的同時卵史,仍然保留著初期設(shè)定的目標战转。 它的速度飛快,極其適合管理大項目以躯,有著令人難以置信的非線性分支管理系統(tǒng)槐秧,可以應(yīng)付各種復(fù)雜的項目開發(fā)需求。

4忧设、Git 三種狀態(tài):committed刁标、modified 和 staged

Git 有三種狀態(tài),你的文件可能處于其中之一: 已提交(committed)址晕、已修改(modified)已暫存(staged)膀懈。

  1. 已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中谨垃。
  2. 已暫存表示對一個已修改文件的當前版本做了標記启搂,使之包含在下次提交的快照中。
  3. 已提交表示數(shù)據(jù)已經(jīng)安全地保存在本地數(shù)據(jù)庫中刘陶。

如果 版本庫(.git目錄) 中保存著特定版本的文件胳赌,就屬于 已提交 狀態(tài)。
如果文件已修改并放入暫存區(qū)匙隔,就屬于 已暫存 狀態(tài)疑苫。
如果自上次檢出后,作了修改但還沒有添加到暫存區(qū)域纷责,就是 已修改 狀態(tài)捍掺。

5、Git 工作區(qū)再膳、暫存區(qū)和版本庫

在這里插入圖片描述

這會讓我們的 Git 項目擁有三個階段:工作區(qū)乡小、暫存區(qū)以及 版本庫(.git目錄)。

  1. 工作區(qū):工作區(qū)是對項目的某個版本獨立提取出來的內(nèi)容饵史。 這些從 Git
    倉庫的壓縮數(shù)據(jù)庫中提取出來的文件满钟,放在磁盤上供你使用或修改胜榔。就是你在電腦里能看到的目錄。
  2. 暫存區(qū):英文叫 stage 或 index湃番。暫存區(qū)是一個文件夭织,保存了下次將要提交的文件列表信息,一般存放在 .git 目錄下的 index 文件(.git/index)中吠撮,所以我們把暫存區(qū)有時也叫作索引(index)尊惰。
  3. 版本庫(本地倉庫)隱藏目錄 .git,這個不算工作區(qū)泥兰,而是 Git 的版本庫弄屡。Git 版本庫是 Git 用來保存項目的元數(shù)據(jù)和對象數(shù)據(jù)庫的地方。這是 Git 中最重要的部分鞋诗,從其它計算機克隆倉庫時膀捷,復(fù)制的就是這里的數(shù)據(jù)。
在這里插入圖片描述
  • 圖中左側(cè)為工作區(qū)削彬,右側(cè)為版本庫(本地倉庫)全庸。在版本庫中標記為 "index" 的區(qū)域是暫存區(qū)(stage/index),標記為 "master" 的是master 分支所代表的目錄樹融痛。
  • 圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"壶笼。所以圖示的命令中出現(xiàn) HEAD 的地方可以用master 來替換。
  • 圖中的 objects 標識的區(qū)域為 Git 的對象庫雁刷,實際位于 ".git/objects" 目錄下覆劈,里面包含了創(chuàng)建的各種對象及內(nèi)容。
  • 當對工作區(qū)修改(或新增)的文件執(zhí)行 git add 命令時沛励,暫存區(qū)的目錄樹被更新责语,同時工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區(qū)的文件索引中侯勉。
  • 當執(zhí)行提交操作(git commit)時,暫存區(qū)的目錄樹寫到版本庫(對象庫)中铝阐,master 分支會做相應(yīng)的更新址貌。即 master 指向的目錄樹就是提交時暫存區(qū)的目錄樹。
  • 當執(zhí)行 git reset HEAD 命令時徘键,暫存區(qū)的目錄樹會被重寫练对,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響吹害。
  • 當執(zhí)行 git rm --cached <file> 命令時螟凭,會直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變它呀。
  • 當執(zhí)行 git checkout . 或者 git checkout -- <file>命令時螺男,會用暫存區(qū)全部或指定的文件替換工作區(qū)的文件棒厘。這個操作很危險,會清除工作區(qū)中未添加到暫存區(qū)中的改動下隧。
  • 當執(zhí)行 git checkout HEAD . 或者 git checkout HEAD <file> 命令時奢人,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個命令也是極具危險性的淆院,因為不但會清除工作區(qū)中未添加的改動何乎,也會清除暫存區(qū)中未提交的改動。

6土辩、Git 基本操作圖

Git 最常用的 6 個命令:git clone支救、git pushgit add 拷淘、git commit各墨、git checkoutgit pull

在這里插入圖片描述
  • workspace:工作區(qū)
  • staging area:暫存區(qū)/緩存區(qū)
  • local repository:版本庫或本地倉庫
  • remote repository:遠程倉庫

具體命令詳解待整理成系統(tǒng)的實操后下次寫辕棚。

zan.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欲主,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逝嚎,更是在濱河造成了極大的恐慌扁瓢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件补君,死亡現(xiàn)場離奇詭異引几,居然都是意外死亡,警方通過查閱死者的電腦和手機挽铁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門伟桅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叽掘,你說我怎么就攤上這事楣铁。” “怎么了更扁?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵盖腕,是天一觀的道長。 經(jīng)常有香客問我浓镜,道長溃列,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任膛薛,我火速辦了婚禮听隐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哄啄。我一直安慰自己雅任,他們只是感情好风范,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椿访,像睡著了一般乌企。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上成玫,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天加酵,我揣著相機與錄音,去河邊找鬼哭当。 笑死猪腕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钦勘。 我是一名探鬼主播陋葡,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彻采!你這毒婦竟也來了腐缤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肛响,失蹤者是張志新(化名)和其女友劉穎岭粤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特笋,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡剃浇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猎物。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虎囚。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔫磨,靈堂內(nèi)的尸體忽然破棺而出淘讥,到底是詐尸還是另有隱情,我是刑警寧澤堤如,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布蒲列,位于F島的核電站,受9級特大地震影響煤惩,放射性物質(zhì)發(fā)生泄漏嫉嘀。R本人自食惡果不足惜炼邀,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一魄揉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拭宁,春花似錦洛退、人聲如沸瓣俯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彩匕。三九已至,卻和暖如春媒区,著一層夾襖步出監(jiān)牢的瞬間驼仪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工袜漩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绪爸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓宙攻,卻偏偏與公主長得像奠货,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子座掘,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容