就目前而言,廣泛應用中的版本控制工具大致能夠分紅兩類:集中式版本控制系統和分佈式版本控制系統,前者的表明是SVN,後者的表明就是Git了。記得哥剛出道那會仍是遍地SVN,吃Git這隻螃蟹的人仍是少數,新的事物,傳播和接受都須要一點時間。可是很快,憑藉自身強大的優點,同時藉着Github這個強大的開源代碼管理平臺的擴張,Git迅速崛起爲最流行的分佈式版本控制系統。git
Git能超越SVN,憑藉的是哪些優點呢?那就要分析下這兩個系統的區別:github
關鍵詞就是「集中」,全部代碼庫都只保存在一箇中心服務器上,做爲每一個終端的數據源。開發的時候你們都從這同一源位置拉取代碼,開發完成將代碼提交到遠程版本庫中,同時會生成一個最新的版本號。源碼庫就這麼一個,要是不當心出了點故障,那你們都沒得玩了,這是集中式系統在安全性上一個重要問題。緩存
另外,開發的時候都是直接跟遠程源碼庫對話,新添加的內容或者修改的文件,要麼放在本地,要麼就提交到中心版本庫。可是在實際開發中常常是這樣的情景:一個需求要開發好幾天,我可能會分幾個模塊開發,每開發完一個模塊就想提到遠程庫去作個標記,做爲階段性成果,可是又怕這部分還不完整可能還包含BUG的代碼影響到別人,或者壓根就不想讓這些半成品讓別人看見。這個時候類SVN的集中式版本控制系統就沒什麼好辦法了。安全
上個簡單的圖說明下:
服務器
既然集中很差那就分散唄,確實,分佈式系統與集中式系統最核心的區別就是去中心化,每一個人的電腦上都是一個完整的版本庫。不用擔憂中心服務器出故障怎麼辦,代碼管理在本地就能夠完成。固然通常爲了協做和維護方便,都會指定一箇中心服務器,可要知道,這並不是必須的。jsp
一個分佈式管理系統看起來應該是這樣的:
分佈式
Git相較於SVN的優點還有不少,好比強大的分支管理等,後續會慢慢補充,但上面所述部分是它們根本的不一樣之處。工具
本文的標題是Git初識,內容主要針對Git初學者,我本人也是在學習中,這裏主要記錄本身的學習過程和心得,有錯漏的地方還請你們多多指正~學習
Git官網上提供了一個在線模擬Git操做的網站:tryGit(https://try.github.io/levels/1/challenges/1)。對於瞭解Git操做流程,學習它的核心命令頗有幫助,我本人很是喜歡,因而利用空閒時間製做了一個圖解教程,但願對學習Git的同窗有所幫助。fetch
上圖先(畫的糙,你們將就着看):
首先介紹下圖中幾個倉庫/文件目錄的含義:
working directory:很好理解,本地的文件目錄,存放本地倉庫代碼的地方。
staging area:這個單從字面翻譯就頗有意思:「部隊從一個戰場轉往另外一個戰場的集結地」 ,嗯,這只是一個臨時的集合場所而已!
local repository: 本地倉庫,這是Git區別於SVN的關鍵所在,咱們大部分操做都只須要在本地倉庫進行就能夠了。
remote repository: 遠程倉庫,其實它與本地倉庫沒有本質區別,只是爲了方便你們協做開發而共同認定的一箇中心庫。
$ cd ~/<working directory> $ git init
建立本地倉庫,將當前工做目錄歸入Git管轄,會在當前目錄下生成一個隱藏的.git文件夾,這個目錄是Git來跟蹤管理版本庫的,不要瞎動。
$ git clone <遠程版本庫的地址>
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。能夠指定不一樣的目錄名:
$ git clone <遠程版本庫的地址> <自定義目錄名>
$ git add a.txt
將a.txt 提交到暫存區(staging area),提交到暫存區的文件會被標示上staged狀態,至關於軍隊集合的時候你是在列狀態同樣~
add 命令有幾個使人困惑的地方在這裏說明下:
首先,這個命令與SVN裏的add命令意思差別較大,用過SVN的同窗應該知道,SVN中的add是將文件歸入SVN管理的意思,而Git裏add就是將文件暫時保存一下。
其次,add命令自己就容易給人形成誤解,若是不習慣能夠改爲stage命令,他們是等價的,還好理解一些。
$ git commit a.txt
將緩存區的內容提提交到本地倉庫
$ git push <遠程主機名> <本地分支名>:<遠程分支名> $ git push origin master:master
將本地倉庫master分支的代碼推送到遠程origin主機上的master分支
$ git pull <遠程主機名> <遠程分支名>:<本地分支名> $ git pull origin track:track
從遠程origin主機的track分支拉取代碼到本地倉庫的track分支
pull 命令能夠分解成兩個部分,首先是從origin主機拉取代碼到本地倉庫(fetch),緊接着將拉取的代碼與本機目錄上得代碼進行自動合併(auto merge)。所以咱們能夠用fetch + merge的方式來代替pull命令,且後者是更值得推薦的,由於自動合併有時會出現問題,報錯也沒有手動merge的報錯直觀。
$ git checkout -- test.jsp
將工做空間裏test.jsp(該文件此時尚未被add)的改動撤銷
此外checkout命令還能夠用來切換分支:
$ git checkout master //切換到master分支
$ git reset --hard <commit ID> //將本地代碼回退到指定的某次commit,目錄和緩存區的修改都被丟棄 $ git reset --soft <commit ID> //將HEAD指向<commit ID>所在位置,本地的修改(即<commit ID>位置以前的修改)回退到緩存區 $ git reset --mixed <commit ID> //將HEAD指向<commit ID>所在位置,本地的修改(即<commit ID>位置以前的修改)回退到工做目錄
以上 hard/soft/mixed 是reset命令經常使用的三模式,默認是mixed。除此以外還有merge和keep兩種模式,可是不經常使用,感興趣的能夠去了解下。
$ git branch <自定義分支名> //新建一個分支 $ git branch -d <自定義分支名> //刪除新建的分支
切換到新分支用 checkout 命令便可