Git是一個分佈式的版本控制工具,本篇文章從介紹Git開始,重點在於介紹Git的基本命令和使用技巧,讓你嘗試使用Git的同時,體驗到原來一個版 本控制工具能夠對開發產生如此之多的影響,文章分爲兩部分,第一部分介紹Git的一些經常使用命令,其中穿插介紹Git的基本概念和原理,第二篇重點介紹 Git的使用技巧,最後會在Git Hub上建立一個開源項目開啓你的Git實戰之旅git
Git 在Wikipedia上的定義:它是一個免費的、分佈式的版本控制工具,或是一個強調了速度快的源代碼管理工具。Git最初被Linus Torvalds開發出來用於管理Linux內核的開發。每個Git的工做目錄都是一個徹底獨立的代碼庫,並擁有完整的歷史記錄和版本追蹤能力,不依賴 於網絡和中心服務器。github
Git 的出現減輕了許多開發者和開源項目對於管理分支代碼的壓力,因爲對分支的良好控制,更鼓勵開發者對本身感興趣的項目作出貢獻。其實許多開源項目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已通過渡到使用Git做爲本身的版本控制工具。對於咱們這些喜歡寫代碼的開發者嘛,有兩點最大的好處,咱們能夠在任何地點(在上班的地鐵 上)提交本身的代碼和查看代碼版本;咱們能夠開許許多多個分支來實踐咱們的想法,而合併這些分支的開銷幾乎能夠忽略不計。服務器
如今進入本篇文章真正的主題,介紹一下Git的基本命令和操做,會從Git的版本庫的初始化,基本操做和獨有的經常使用命令三部分着手,讓你們可以開始使用Git。網絡
Git一般有兩種方式來進行初始化:app
git clone: 這是較爲簡單的一種初始化方式,當你已經有一個遠程的Git版本庫,只須要在本地克隆一份,例如'git clone git://github.com/someone/some_project.git some_project'命令就是將'git://github.com/someone/some_project.git'這個URL地址的遠程版 本庫徹底克隆到本地some_project目錄下面分佈式
git init和git remote:這種方式稍微複雜一些,當你本地建立了一個工做目錄,你能夠進入這個目錄,使用'git init'命令進行初始化,Git之後就會對該目錄下的文件進行版本控制,這時候若是你須要將它放到遠程服務器上,能夠在遠程服務器上建立一個目錄,並把 可訪問的URL記錄下來,此時你就能夠利用'git remote add'命令來增長一個遠程服務器端,例如'git remote add origin git://github.com/someone/another_project.git'這條命令就會增長URL地址爲'git: //github.com/someone/another_project.git',名稱爲origin的遠程服務器,之後提交代碼的時候只須要使用 origin別名便可svn
如今咱們有了本地和遠程的版本庫,讓咱們來試着用用Git的基本命令吧:工具
git pull:從其餘的版本庫(既能夠是遠程的也能夠是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能相似於SVN的update測試
git add:是將當前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交以前所須要執行的一步,例如'git add app/model/user.rb'就會增長app/model/user.rb文件到Git的索引中spa
git rm:從當前的工做空間中和索引中刪除文件,例如'git rm app/model/user.rb'
git commit:提交當前工做空間的修改內容,相似於SVN的commit命令,例如'git commit -m "story #3, add user model"',提交的時候必須用-m來輸入一條提交信息
git push:將本地commit的代碼更新到遠程版本庫中,例如'git push origin'就會將本地的代碼更新到名爲orgin的遠程版本庫中
git log:查看歷史日誌
git revert:還原一個版本的修改,必須提供一個具體的Git版本號,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本號都是生成的一個哈希值、
上面的命令幾乎都是每一個版本控制工具所公有的,下面就開始嘗試一下Git獨有的一些命令:
git branch: 對分支的增、刪、查等操做,例如'git branch new_branch'會從當前的工做版本建立一個叫作new_branch的新分支,'git branch -D new_branch'就會強制刪除叫作new_branch的分支,'git branch'就會列出本地全部的分支
git checkout:Git 的checkout有兩個做用,其一是在不一樣的branch之間進行切換,例如 'git checkout new_branch'就會切換到new_branch的分支上去;另外一個功能是還原代碼的做用,例如'git checkout app/model/user.rb'就會將user.rb文件從上一個已提交的版本中更新回來,未提交的內容所有會回滾
git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執行後,其實是將分支點從C移到了G,這樣分支也就具備了從C到G的功能
git reset: 將當前的工做目錄徹底回滾到指定的版本號,假設以下圖,咱們有A-G五次提交的版本,其中C 的版本號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,咱們執行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那麼結果就只剩下了A-C三個提交的版本
git stash:將當前未提交的工做存入Git工做棧中,時機成熟的時候再應用回來,這裏暫時提一下這個命令的用法,後面在技巧篇會重點講解
git config: 利用這個命令能夠新增、更改Git的各類設置,例如'git config branch.master.remote origin'就將master的遠程版本庫設置爲別名叫作origin版本庫,後面在技巧篇會利用這個命令個性化設置你的Git,爲你打造獨一無二的 Git
git tag: 能夠將某個具體的版本打上一個標籤,這樣你就不須要記憶複雜的版本號哈希值了,例如你可使用 'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'來標記這個被你還原的版本,那麼之後你想查看該版本時,就可使用 revert_version標籤名,而不是哈希值了
Git之因此可以提供方便的本地分支等特性,是與它的文件存儲機制有關的。Git存儲版本控制信息時使用它本身定義的一套文件系統存儲機制,在代碼根目錄下有一個.git文件夾,會有以下這樣的目錄結構:
有 幾個比較重要的文件和目錄須要解釋一下:HEAD文件存放根節點的信息,其實目錄結構就表示一個樹型結構,Git採用這種樹形結構來存儲版本信息, 那麼HEAD就表示根;refs目錄存儲了你在當前版本控制目錄下的各類不一樣引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、 remotes、stash、tags四個子目錄,分別存儲對不一樣的根、遠程版本庫、Git棧和標籤的四種引用,你能夠經過命令'git show-ref'更清晰地查看引用信息;logs目錄根據不一樣的引用存儲了日誌信息。所以,Git只須要代碼根目錄下的這一個.git目錄就能夠記錄完 整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那麼下面就來看一下Git與SVN的區別吧
SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git最大的優點在於兩點:易於本地增長分支和分佈式的特性。
下面兩幅圖能夠形象的展現Git與SVN的不一樣之處
對 於易於本地增長分支,圖中Git本地和服務器端結構都很靈活,全部版本都存儲在一個目錄中,你只須要進行分支的切換便可達到在某個分支工做的效果。 而SVN則徹底不一樣,若是你須要在本地試驗一些本身的代碼,只能本地維護多個不一樣的拷貝,每一個拷貝對應一個SVN服務器地址。舉一個實際的例子,之前我所 在的小組使用SVN做爲版本控制工具,當我正在試圖加強一個模塊,工做作到一半,因爲會改變原模塊的行爲致使代碼服務器上許多測試的失敗,因此並無提交 代碼。這時候上級對我說,如今有一個很緊急的Bug須要處理, 必須在兩個小時內完成。我只好將本地的全部修改diff,並輸出成爲一個patch文件,而後回滾有關當前任務的全部代碼,再開始修改Bug的任務,等到 修改好後,在將patch應用回來。前先後後要完成多個繁瑣的步驟,這還不計中間代碼發生衝突所要進行的工做量。但是若是使用Git, 咱們只須要開一個分支或者轉回到主分支上,就能夠隨時開始Bug修改的任務,完成以後,只要切換到原來的分支就能夠優雅的繼續之前的任務。只要你願意,每 一個新的任務均可以開一個分支,完成後,再將它合併到主分支上,輕鬆而優雅。
分 布式對於Git而言,你能夠本地提交代碼,因此在上面的圖中,Git有利於將一個大任務分解,進行本地的屢次提交,而SVN只能在本地進行大量的一 次性更改,致使未來合併到主幹上形成巨大的風險。Git的代碼日誌是在本地的,能夠隨時查看。SVN的日誌在服務器上的,每次查看日誌須要先從服務器上下 載下來。我工做的小組,代碼服務器在美國,每次查看小組幾年前所作的工做時,日誌下載就須要十分鐘,這不能不說是一個痛苦。後來咱們遷移到Git上,利用 Git日誌在本地的特性,我用Ruby編寫了一個Rake腳本,能夠查看某個具體任務的全部代碼歷史,每次只須要幾秒鐘,大大方便個人工做。固然分佈式並 不是說用了Git就不須要一個代碼中心服務器,若是你工做在一個團隊裏,仍是須要一個服務器來保存全部的代碼的。
總結
本篇介紹了Git的基本概念、一些經常使用命令和原理,你們能夠嘗試動手體會一下,下一篇會重點介紹Git命令的使用技巧,Git附帶的工具,最後會在Git Hub上建立一個開源項目。