Git初識

集中式VS分佈式

就目前而言,廣泛應用中的版本控制工具大致能夠分紅兩類:集中式版本控制系統和分佈式版本控制系統,前者的表明是SVN,後者的表明就是Git了。記得哥剛出道那會仍是遍地SVN,吃Git這隻螃蟹的人仍是少數,新的事物,傳播和接受都須要一點時間。可是很快,憑藉自身強大的優點,同時藉着Github這個強大的開源代碼管理平臺的擴張,Git迅速崛起爲最流行的分佈式版本控制系統。git

Git能超越SVN,憑藉的是哪些優點呢?那就要分析下這兩個系統的區別:github

集中式版本控制系統

關鍵詞就是「集中」,全部代碼庫都只保存在一箇中心服務器上,做爲每一個終端的數據源。開發的時候你們都從這同一源位置拉取代碼,開發完成將代碼提交到遠程版本庫中,同時會生成一個最新的版本號。源碼庫就這麼一個,要是不當心出了點故障,那你們都沒得玩了,這是集中式系統在安全性上一個重要問題。緩存

另外,開發的時候都是直接跟遠程源碼庫對話,新添加的內容或者修改的文件,要麼放在本地,要麼就提交到中心版本庫。可是在實際開發中常常是這樣的情景:一個需求要開發好幾天,我可能會分幾個模塊開發,每開發完一個模塊就想提到遠程庫去作個標記,做爲階段性成果,可是又怕這部分還不完整可能還包含BUG的代碼影響到別人,或者壓根就不想讓這些半成品讓別人看見。這個時候類SVN的集中式版本控制系統就沒什麼好辦法了。安全

上個簡單的圖說明下:
圖片描述服務器

分佈式管理系統

既然集中很差那就分散唄,確實,分佈式系統與集中式系統最核心的區別就是去中心化,每一個人的電腦上都是一個完整的版本庫。不用擔憂中心服務器出故障怎麼辦,代碼管理在本地就能夠完成。固然通常爲了協做和維護方便,都會指定一箇中心服務器,可要知道,這並不是必須的。jsp

一個分佈式管理系統看起來應該是這樣的:
圖片描述分佈式

Git相較於SVN的優點還有不少,好比強大的分支管理等,後續會慢慢補充,但上面所述部分是它們根本的不一樣之處。工具

圖解 try Git

本文的標題是Git初識,內容主要針對Git初學者,我本人也是在學習中,這裏主要記錄本身的學習過程和心得,有錯漏的地方還請你們多多指正~學習

Git官網上提供了一個在線模擬Git操做的網站:tryGit(https://try.github.io/levels/1/challenges/1)。對於瞭解Git操做流程,學習它的核心命令頗有幫助,我本人很是喜歡,因而利用空閒時間製做了一個圖解教程,但願對學習Git的同窗有所幫助。fetch

上圖先(畫的糙,你們將就着看):

圖片描述

名稱釋義

首先介紹下圖中幾個倉庫/文件目錄的含義:

  1. working directory:很好理解,本地的文件目錄,存放本地倉庫代碼的地方。

  2. staging area:這個單從字面翻譯就頗有意思:「部隊從一個戰場轉往另外一個戰場的集結地」 ,嗯,這只是一個臨時的集合場所而已!

  3. local repository: 本地倉庫,這是Git區別於SVN的關鍵所在,咱們大部分操做都只須要在本地倉庫進行就能夠了。

  4. remote repository: 遠程倉庫,其實它與本地倉庫沒有本質區別,只是爲了方便你們協做開發而共同認定的一箇中心庫。

git init

$ cd ~/<working directory>
$ git init

建立本地倉庫,將當前工做目錄歸入Git管轄,會在當前目錄下生成一個隱藏的.git文件夾,這個目錄是Git來跟蹤管理版本庫的,不要瞎動。

git clone

$ git clone <遠程版本庫的地址>

該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。能夠指定不一樣的目錄名:

$ git clone <遠程版本庫的地址> <自定義目錄名>

git add

$ git add a.txt

將a.txt 提交到暫存區(staging area),提交到暫存區的文件會被標示上staged狀態,至關於軍隊集合的時候你是在列狀態同樣~
add 命令有幾個使人困惑的地方在這裏說明下:
首先,這個命令與SVN裏的add命令意思差別較大,用過SVN的同窗應該知道,SVN中的add是將文件歸入SVN管理的意思,而Git裏add就是將文件暫時保存一下。
其次,add命令自己就容易給人形成誤解,若是不習慣能夠改爲stage命令,他們是等價的,還好理解一些。

git commit

$ git commit a.txt

將緩存區的內容提提交到本地倉庫

git push

$ git push <遠程主機名> <本地分支名>:<遠程分支名>
$ git push origin master:master

將本地倉庫master分支的代碼推送到遠程origin主機上的master分支

git pull

$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
$ git pull origin track:track

從遠程origin主機的track分支拉取代碼到本地倉庫的track分支
pull 命令能夠分解成兩個部分,首先是從origin主機拉取代碼到本地倉庫(fetch),緊接着將拉取的代碼與本機目錄上得代碼進行自動合併(auto merge)。所以咱們能夠用fetch + merge的方式來代替pull命令,且後者是更值得推薦的,由於自動合併有時會出現問題,報錯也沒有手動merge的報錯直觀。

git checkout

$ git checkout -- test.jsp

將工做空間裏test.jsp(該文件此時尚未被add)的改動撤銷
此外checkout命令還能夠用來切換分支:

$ git checkout master //切換到master分支

git reset

$ 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 <自定義分支名> //新建一個分支
$ git branch -d <自定義分支名> //刪除新建的分支

切換到新分支用 checkout 命令便可

先到這裏,後續補充~

相關文章
相關標籤/搜索