Git官網html
維基百科git
Git
名字由來是林納斯·託瓦茲自嘲地取了這個名字「git」,該詞源自英國俚語,意思大約是「混帳」github
自2002年開始,林納斯·託瓦茲決定使用BitKeeper
做爲Linux內核主要的版本控制系統用以維護代碼。由於BitKeeper
爲專有軟件,這個決定在社羣中長期遭受質疑。在Linux社羣中,特別是理查德·斯托曼與自由軟件基金會的成員,主張應該使用開放源代碼的軟件來做爲Linux
核心的版本控制系統。林納斯·託瓦茲曾考慮過採用現成軟件做爲版本控制系統(例如Monotone),但這些軟件都存在一些問題,特別是性能不佳。現成的方案,如CVS
(svn
就是cvs
)的架構,受到林納斯·託瓦茲的批評。windows
2005年,安德魯·垂鳩寫了一個簡單程序,能夠鏈接BitKeeper
的存儲庫,BitKeeper
著做權擁有者拉里·麥沃伊認爲安德魯·垂鳩對BitKeeper
內部使用的協議進行逆向工程,決定收回免費使用BitKeeper
的許可。Linux
內核開發團隊與BitMover公司進行磋商,但沒法解決他們之間的歧見。林納斯·託瓦茲決定自行開發版本控制系統替代BitKeeper
以十天的時間,編寫出第一個git版本。bash
說白了Git
解決了咱們什麼痛點的,好比咱們有一個 v1.0.0
版本的項目,若是咱們不是用版本控制工具,發佈一個v1.0.0
版本後,咱們想保留v1.0.0
版本的項目供之後某些狀況下使用或提供用戶不一樣版本項目的使用,咱們只能將v1.0.0
版本的項目複製一份保留起來,若是咱們在發佈一個版本v1.2.0
,咱們又要保留一個v1.0.0
版本的項目,如此一來,若是版本發佈了不少咱們將會有大量的版本項目,這樣咱們管理起來也會很麻煩。而版本工具的出現正好解決了咱們這個問題,固然版本工具也解決了多我的共同開發一個項目的問題以及一些提升團隊開發效率的問題,而且還能夠在不鏈接網絡的狀況下對咱們的版本進行控制,而像svn這樣的集中式管理工具只能在聯網的狀況下才可使用。網絡
作程序的人對於Git和svn應該是在熟悉不過了,當咱們想控制咱們的項目版本時會常常用到這兩個工具,而他們的工做原理卻有很大差異。它們的大體區別以下:架構
怎麼理解分佈式和集中式,我這裏是這裏去理解的,git 和 svn在遠程都有一個倉庫(集中版本庫),可是不一樣的是當咱們克隆下來項目時,git會在本地創建一個和遠程倉庫同樣的本地版本庫,而svn是不存在這個版本庫的,也就是說咱們每一個人在本身的電腦上使用git克隆的項目都會有一個版本庫,咱們在進行咱們的版本控制時添加新分支是不會影響其餘人的。而svn因爲是集中式管理工具,當咱們把本地項目推送到遠程倉庫後,會對其餘人帶來影響,而且由於git在本地有一個版本庫,這使得在沒有網絡連接的狀況下,仍然能夠正常管理咱們項目的版本,而svn則必須在連接網絡的狀況纔可使用分佈式
WARNINGsvn
須要注意的是,上面列舉的git和svn區別並非爲了說明git要比svn好不少,這也不能成爲它們好壞的評判標準,一個工具的優點主要仍是要看咱們項目的實際需求工具
window上的安裝
在window上安裝git官網下載下來後一直點擊下一步就能夠了。 安裝成功後在任意一個文件夾中右擊鼠標會出現, Git Bush Here
和 Git Gui Here
說明咱們已經安裝成功了。點擊Git Bush Here
咱們能夠在命令面板中進行一些git命令操做。
安裝成功後,咱們須要設置咱們的郵箱和帳號,由於Git是分佈式版本控制系統,每一個機器都要進行區分
全局配置:
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
複製代碼
局部配置
$ git config user.name "Your Name"
$ git config user.email "Your Email"
複製代碼
查看全部配置
$ git config --list
複製代碼
假設咱們有一個本地的使用git控制版本的project
項目,目錄結構以下
|--- .git // git版本庫
|--- index.js
複製代碼
接下來在講git工做原理前,咱們先要明白幾個概念
概念 | 說明 |
---|---|
工做區 | 所謂工做區就是指的你的本地目錄也就上上邊的project項目,固然不包括.git目錄 |
暫存區 | (索引) 存放在.git目錄下的index文件中 |
版本庫 | 指咱們工做區中的.git目錄,該目錄是個隱藏目錄 |
遠程倉庫 | 指的是咱們網上託管項目的地方,好比github、碼雲 |
咱們在使用git時常常是用的過程就是:
git
的工做流程以下圖 如下內容來自 菜鳥教程
index
的區域是暫存區(
stage
,
index
),標記爲
master
的是
master
分支所表明的目錄樹,分支範疇下面會講到
圖中咱們能夠看出此時 HEAD 實際是指向 master
分支的一個"遊標"。因此圖示的命令中出現 HEAD
的地方能夠用 master
來替換。
圖中的 objects
標識的區域爲 Git
的對象庫,實際位於 .git/objects
目錄下,裏面包含了建立的各類對象及內容。
當對工做區修改(或新增)的文件執行 git add .
命令時,暫存區的目錄樹被更新,同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
當執行提交操做(git commit
)時,暫存區的目錄樹寫到版本庫(對象庫)中,master
分支會作相應的更新。即 master
指向的目錄樹就更新成了提交時暫存區的目錄樹。
當執行git reset HEAD
命令時,暫存區的目錄樹會被重寫,被 master
分支指向的目錄樹所替換,可是工做區不受影響。
當執行 git rm --cached <file>
命令時,會直接從暫存區刪除文件,工做區則不作出改變。
當執行 git checkout .
或者 git checkout -- <file>
命令時,會用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。
當執行 git checkout HEAD .
或者 git checkout HEAD <file>
命令時,會用 HEAD
指向的 master
分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。
git push
時,咱們本地版本庫中的項目將會推送到遠程倉庫中。