標籤:
繼續寫一篇git的文章,介紹下git的曆史和基本原理。
介紹下git的曆史,據磚家考究,遙想當年,linux的創始人,牛人李納斯,開發linux用的版本控制工具BitKeeper,出於公益或友好, 是免費的,但是李納斯手下的幾個駭客試圖破解BitKeeper的協議,結果被BitKeeper公司發現,就從免費轉向收費。
牛人李納斯一努之下,兩周就用C擼了一個新的版本控制系統,這就是Git.
彪悍的牛人,就是這麼囂張!
下面說下它的基本原理:(以下所有內容都可以從它官網得到:https://git-scm.com/doc)
其實git本身是一個檔案系統,是一個Distributed File System,而檔案系統中最常見的資料結構也就是一個樹,一個多叉樹。
Git 以一種類似 UNIX 檔案系統但更簡單的方式來儲存內容。所有內容以 tree 或 blob Object Storage Service,其中 tree 對象對應於 UNIX 中的目錄,blob 對象則大致對應於 inodes 或檔案內容。一個單獨的 tree 對象包含一條或多條 tree 記錄,每一條記錄含有一個指向 blob 或子 tree 對象的 SHA-1 指標,並附有該對象的許可權模式 (mode)、類型和檔案名稱資訊。
這是git的檔案對象圖:
那麼怎麼建立origin?
直接在一個空目錄用命令:
git init
就自動建立了一個Git倉庫.git建立一個倉庫後,我們以這個倉庫為個中心版本庫。在你建立倉庫的時候,master 是"預設的"分支。
這個時候,git在本地建立了幾個重要的目錄區:
workspace---->git index--->git repository
如果這時你相把你現在建立的本地倉庫與一個運程的git倉庫相連,用什麼命令呢?
用這樣的命令:
git remote add pb https://github.com/paulboone/ticgit
其中,pb,是這個遠程倉庫的別名。
現在你可以在命令列中使用字串 pb 來代替整個 URL。例如,如果你想拉取 Paul 的倉庫中有但你沒有的資訊,可以運行 git fetch pb:
git fetch pb
用這個命令,git就會從遠程git倉庫:
https://github.com/paulboone/ticgit
下載最新的代碼。git fetch [remote-name]會抓取從你上次複製以來別人上傳到此遠程倉庫中的所有更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,需要記住,fetch 命令只是將遠端的資料拉到本地倉庫,並不自動合并到當前工作分支,只有當你確實準備好了,才能手工合并。
如果,你想從遠程git倉庫直接下載併合併到你的workspace用什麼命令呢?
$ git pull <遠程主機名稱> <遠程分支名>:<本地分支名>
這裡,可以用這樣的命令:
git pull pb master:master
如果,你想從遠程git倉庫裡直接下載或複製一個git倉庫,而不是在本地用git init命令建立,可以用類似命令:
git clone https://github.com/schacon/ticgit
這樣,本地倉庫與遠程倉庫的關係如:
那怎麼查看目前的目錄是否與遠程倉庫相連呢?
用命令:
git remote -v
如果有另外一個使用者B在他的電腦,也clone了相同的git倉庫,這時候(我們假設只有兩個使用者A,B從伺服器URL:
https://github.com/schacon/ticgit
clone或add到local repository)
這時候,這幾個git倉庫應該是這樣的:
我們跟遠端git倉庫建立關聯關係後,我們在本地電腦修改,修改後怎麼提交到遠程git倉庫呢?
如果在本地建立了幾個C檔案,和license檔案,用下面三個命令:
$ git add *.c
$ git add LICENSE
$ git commit -m ‘initial project version‘
然後,push到的遠程git倉庫:
git push origin master
現在我們在本地建立了一個git倉庫origin,
我們現在想得到這樣的多個分支,如下 :
那怎麼從origin中建立另一個分支bob呢:
用命令:
#切換到master分支
git checkout master
#建立bob分支
git branch bob
用同樣的方式建立另一個clair分支
git branch clair
這時候,三個倉庫是相同的版本樹形式分別儲存在不同的電腦或伺服器裡的,如:
所以,這裡三個倉庫已經是儲存了完整的版本資訊。
那麼,在本地更新了檔案後怎麼提交到master伺服器裡呢?
用命令:
#切換到bob分支
git check bob
#提交到bob分支
git commit -a -m "your comments"
#切換到master,也是origin
git checkout master
#把bob分支合并到mastergit merge bob
[git]git的基本原理|git branch|git