SVN是集中式版本控制系統,版本庫集中放在中央服務器上,而幹活時用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做。jquery
Git則是分佈式版本控制系統,即它就沒有中央服務器,每一個人的電腦就有一個屬於本身的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。最終,各自將本地分支先合併,再將合併後的分支推向同名的遠程庫。git
Git和GitHub的區別:Git是分佈式版本管理工具,而GitHub是一個網站,能夠在github上創建一個網上倉庫,而後提交本身的代碼到該網上倉庫,這樣你的每次提交,別人也均可以看到你的代碼,同時別人也能夠幫你修改你的代碼,這種開源的方式很是方便程序員之間的交流和學習。程序員
GitHub是一個很是適合程序員交流的網站,不少國際上的技術大牛都在github上有本身的開源代碼,其餘人只要申請個帳號就能夠隨意的看到這些大牛寫的程序。同時國內的不少互聯網公司如百度,阿里等也在github上公佈有開源的代碼。 github
工做區、本地庫、遠程庫三者之間的工做原理及流程以下圖:windows
Git之因此能實現分佈式版本控制,就是基於其分支管理策略。本地庫所作的操做都是在某分支上進行的,不一樣分支之間能夠合併。能夠拉取遠程分支到本地,也能夠推送本地分支到遠程。bash
git branch <branchName> #建立新的分支服務器
git branch -d <branchName> #刪除已有分支ssh
git checkout <branchName> #切換到其它分支上分佈式
git merge <branchName> #合併branchName分支到當前分支上工具
git branch #查看當前分支
git branch -r #查看遠程分支
git branch -a #查看遠程及本地的全部分支,當前分支前加"*"號
Git的分支管理策略中,代碼庫應該有且僅有一個穩定的主分支,一般是默認的master分支。主分支上不作開發,僅用做發佈新版本,故主分支也叫作版本分支。
一般,開發應在另外一個develop分支上完成。若是想正式對外發布,就在master分支上對develop分支進行"合併"(merge)。
#從master上分出一個develop分支
git checkout -b develop master
#將develop分支合併到master分支的命令以下兩個:
#切換到master分支
git checkout master
#對develop分支進行合併
git merge --no-ff develop
【注】git checkout -b <newBranch> <originalBranch>命令從原有分支originalBranch上分出一個新分支newBranch,並切換到該分支上。
默認狀況下,Git執行"快進式合併"(fast-farward merge),會直接將master分支指向develop分支。使用--no-ff參數後,會執行正常合併,在master分支上生成一個新節點,這能夠清晰地保留版本演進過程。
前面講到版本庫的兩條主要分支:master和develop。前者用於發佈新版本,後者用於平常開發。其實,常設分支只須要這兩條就夠了,不須要其餘了。
可是,除了常設分支之外,還有一些臨時性分支,用於應對一些特定目的的版本開發。臨時性分支主要有三種:
1)功能(feature)分支
2)預發佈(release)分支
3)修補bug(fixbug)分支
這三種分支都屬於臨時性須要,使用完之後應該刪除,使得代碼庫的常設分支始終只有master和develop。
1)功能(feature)分支:它是爲了開發某種特定功能,從develop分支上面分出來的。開發完成後,要再併入develop。
功能分支的名字,能夠採用feature-*的形式命名。
建立一個功能分支:
# git checkout -b feature-x develop
開發完成後,將功能分支合併到develop分支:
# git checkout develop
# git merge --no-ff feature-x
刪除feature分支:
# git branch -d feature-x
2)預發佈(release)分支:它是指發佈正式版本以前(即合併到master分支以前),咱們可能須要有一個預發佈的版本進行測試。預發佈分支是從develop分支上面分出來的,預發佈結束之後,必須合併進develop和master分支。它的命名,能夠採用release-*的形式。
建立一個預發佈分支:
# git checkout -b release-1.2 develop
確認沒有問題後,合併到master分支:
# git checkout master
# git merge --no-ff release-1.2
對合並生成的新節點,作一個標籤
# git tag -a 1.2
再合併到develop分支:
# git checkout develop
# git merge --no-ff release-1.2
最後,刪除預發佈分支:
# git branch -d release-1.2
3)修補bug(fixbug)分支:軟件正式發佈之後,不免會出現bug。這時就須要建立一個分支,進行bug修補。修補bug分支是從master分支上面分出來的。修補結束之後,再合併進master和develop分支。它的命名,能夠採用fixbug-*的形式。
建立一個修補bug分支:
# git checkout -b fixbug-0.1 master
修補結束後,合併到master分支:
# git checkout master
# git merge --no-ff fixbug-0.1
# git tag -a 0.1.1
再合併到develop分支:
# git checkout develop
# git merge --no-ff fixbug-0.1
最後,刪除"修補bug分支":
# git branch -d fixbug-0.1
工做區、暫存區以及版本庫三者之間的關係。
工做區:就是你在電腦上看到的目錄,好比目錄testgit下的全部文件(.git版本庫目錄除外)。或者之後須要再新建的目錄文件等等都屬於工做區範疇。
暫存區(stage):工做區有一個.git隱藏目錄,這個不屬於工做區,這是版本庫。其中版本庫裏面存了不少東西,其中最重要的就是stage(暫存區),還有就是Git爲咱們自動建立的第一個master分支。
在Git中每次提交都分爲兩個步驟:
第一步:用add命令將文件添加到版本庫的暫存區
第二步:用commit命令把暫存區的全部內容提交到當前分支上
case1:若已知待撤銷的內容,直接手動更改待撤銷的文件,而後從新add到暫存區,最後再commit到當前分支。
case2:文件添加到暫存區後又作了修改,撤銷修改回到添加暫存區時的狀態。使用git checkout –fileName撤銷工做區的修改,實例:
git checkout —readme.txt
【注】命令git checkout -readme.txt 中的"-"很重要,若是沒有"-"的話,該命令是切換分支命令。
case3:撤銷已提交到當前分支的修改
使用reset版本回退命令回退到上一個版本,以達到撤銷修改的目的。具體操做以下:
使用git log或git reflog命令查看版本日誌,再用git reset --hard 版本號命令回退到上一版本便可(或者經過git reset --hard HEAD^直接回退到上一版本)。實例:
git reset --hard 6fcfc89回退到上一版本
因爲本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的,因此必需要讓github倉庫認證你的SSH key,在此以前,必需要生成SSH key。
第一步:生成SSH Key
在windows下查看[c盤->用戶->本身的用戶名->.ssh]下是否有id_rsa、id_rsa.pub文件,若是沒有須要手動生成。打開git bash,在控制檯中輸入如下命令:$ ssh-keygen -t rsa -C youremail
參數-t用於指定密鑰類型,若未指定則默認生成用於SSH-2的RSA密鑰,這裏使用的是rsa。
參數-C用來指定對該密鑰的註釋,方便用戶標識這個密鑰,指出密鑰的用途或其它的信息,這裏通常輸入在GitHub上註冊時填的郵箱做爲該密鑰的標識。
第二步:登陸github,打開setting->SSH keys,點擊右上角New SSH key,把公鑰id_rsa.pub的所有內容放進key輸入框,再爲當前的key起一個title來標識每一個key。
由遠程庫向本地庫同步時遠程庫充當的是來源,本地庫充當的是去向。
$ git clone <遠程庫的網址>
$ git clone <版本庫的網址> <本地庫目錄名>
$ git clone –o 遠程主機名 <版本庫的網址> <本地庫目錄名>
注:該命令會在當前目錄生成一個新目錄,與遠程主機的版本庫同名。若是要指定不一樣的目錄名,能夠將目錄名做爲git clone命令的第二個參數。並在克隆的時候將遠程主機默認命名爲origin,若是想用其它的遠程主機名,須要用git clone命令的-o選項指定。實例:
$ git clone -o jQuery https://github.com/jquery/jquery.git
一旦遠程版本庫有了更新(Git術語叫作commit),咱們須要將這些更新取回到本地。這時就要用到git fetch命令,獲取遠程分支到本地,並以遠程主機名/分支名命名。獲取的遠程分支不會與本地分支進行合併,故對本地代碼無影響。默認狀況下git fetch命令獲取遠程全部分支(branch)。若是隻想獲取特定的分支,則能夠指定分支名。
語法:
#將遠程主機上的更新所有取回到本地。
$ git fetch <遠程主機名>
#取回origin主機的master分支到本地
$ git fetch <遠程主機名> <分支名>
【注】fetch從遠程所取回的分支在本地是以"遠程主機名/分支名"的形式命名。好比origin主機的master分支,就要用origin/master讀取。
git branch命令的-r選項,能夠用來查看遠程分支,-a選項查看全部分支。
$ git branch -r
origin/master
$ git branch -a
* master
remotes/origin/master
git pull命令先拉取遠程分支到本地,再與本地指定的分支合併。
語法:$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
實例:$ git pull origin next:master
若是是將遠程分支與本地當前分支合併,則冒號後面的目的分支可省略。
實例:$ git pull origin next
上面命令表示取回origin/next分支,再與當前分支合併。實質上,這等同於先作git fetch,再作git merge。
$ git fetch origin
$ git merge origin/next
【注】1.從遠程fetch到的分支在本地都是以"遠程主機名/分支名"表示的。
2.若是遠程主機刪除了本地所關聯的分支,git pull在拉取遠程分支時不會刪除所關聯的本地分支。這是爲了不,因爲其餘人刪除了遠程主機的分支,致使git pull時不知不覺刪除了與本地關聯的分支。
3.從遠程克隆倉庫到本地時默認給遠程主機命名爲origin,能夠經過選項-o來指定遠程主機名。
爲了便於管理,Git要求每一個遠程主機都必須指定一個主機名。git remote命令就是用於管理遠程主機名的,這包括對遠程主機名的增、刪、改、查操做。
添加遠程主機
語法:$ git remote add <遠程主機名> <網址>
刪除遠程主機
語法:$ git remote rm <遠程主機名>
修改遠程主機名
語法:$ git remote rename <原主機名> <新主機名>
查詢遠程主機
查詢全部與本地庫關聯的遠程主機名
語法:$ git remote
查詢全部與本地庫關聯的遠程主機名及其地址
語法:$ git remote –v
實例:
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
查看某遠程主機的詳細信息
語法:$ git remote show <遠程主機名>
當本地分支有了更新,就須要將其推送到遠程與之關聯的分支上
語法:$ git push <遠程主機名> <本地分支名>:<遠程分支名>
若是略去了冒號後的遠程分支名,則表示將本地分支推送到遠程與之關聯的分支上;若該遠程分支不存在,則會在遠程主機新建該分支;若省略本地分支名,則表示刪除指定的遠程分支。
實例:
#推送master分支到origin主機的master分支上
$ git push origin master
#本地分支爲空,表示刪除遠程的master分支
$ git push origin :master
# 等同於
$ git push origin --delete master
【注】1.從遠程向本地拉取時遠程分支是來源,由本地向遠程推送時本地分支是來源
2.由遠程向本地拉取時,若省略冒號前的來源分支(即遠程分支)則表示拉取與當前分支關聯的遠程分支進行合併;若省略冒號後的目的分支(即本地分支),則視當前分支爲目的分支。可是,由本地向遠程push時,若省略冒號前的來源分支(即本地分支)則表示刪除冒號後的遠程分支。