Git是一個開源的分佈式版本控制系統,用以有效、高速的處理從很小到很是大的項目版本管理。Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
每個SVN用戶均可以從服務器checkout代碼,一樣也能夠像服務器提交(commit)代碼,能夠更新(update)到別人提交的代碼。git
優點:全部的操做都須要基於SVN中心服務器,因此操做起來必然很簡單。程序員
劣勢:正由於全部的操做都要基於SVN中心服務器,因此只要SVN中心服務出現衝突(conflict)、錯誤(error)都會給整個團隊之中的成員帶來災難。github
git是一個去中心化的分佈式版本控制工具api
每個節點均可以充當控制中心的做用,因此從GIT服務器複製(clone)一份到本地,一樣也能夠單獨對本身的本地git版本進行單獨管理。 在針對單個git版本庫的操做(commit,pull)就如同SVN的commit與update操做。固然,不一樣版本庫之間的操做就是拉取(pull),推送(push)。服務器
以一個APP爲例,咱們研發一款移動APP的過程當中,必然是一個迭代迭代的來。首先是1.0、1.一、1.2…….2.0…..3.0等等~。app
這個時候爲了防止影響已經穩定的線上版本,咱們必然會對已經上線的版本作一個備份(master分支),使用另外一個copy過來的項目進行開發(dev分支)分佈式
這樣公司的程序員小A就能夠在dev分支上開發了,就算開發的時候小A腦殘,不當心把邏輯弄錯,沒法正常運行的時候。咱們還有穩定版本的Master分之,可使用。(固然,你也能夠回滾revert)svn
由於,存在一個本地倉庫,咱們就能夠在一個功能沒有徹底開發完畢的時候先提交commit到本地倉庫,測試好沒有問題以後再push到遠程git服務器。 避免了,沒有開發完成的項目產生任何差池沒法處理。工具
若是隻有一個開發者開發,那麼上訴的操做並無什麼大礙。對於實際的開發工做中咱們每每是多個開發者共同來開發一個項目。多人修改一個文件必然會出現衝突(conflict); 不一樣人的思想開發一個邏輯不免會出現漏洞與錯誤;如何進行code review、代碼質量把控、衝突下降纔是git的優點。gitlab
同理,A、B、C三位員工仍是能夠在本身的我的分之上進行開發,全部的提交都不會影響到其餘人。
儘可能可能的下降耦合性就是git版本控制工具的核心思想。每一個人均可以在本身的分支盡情操做,直到本身的分配的功能開發完畢。 這個時候就須要,將本身新增的功能迴歸到dev分支上,與團隊其餘的成員所開發的功能進行合併。
這個時候,就能夠發起合併請求(merge request)
線上緊急bug處理,快速發版 一個迭代開始的時候,咱們每每相對於上一個迭代修改了不少代碼。這個時候,因爲開發時間與上線的速度問題,咱們很難對上一個線上版本存在的bug進行快速修復。固然,若是出現p0級的bug,咱們不得不進行快速修復上線的時候,咱們以前設計的分之模型就比較有用了。
以下圖所示
由於master分之與線上的代碼保持了一直,咱們但願臨時性處理一些問題,咱們就從master分之臨時性的拉出一個fix bug分之。 將正在開發的分之切換到fix bug分之,快速修復bug上線。而後在切換到本身的dev_xx分之進行迭代開發,作到的環境的快速切換。
使用git的時候,咱們每每使用branch解決任務切換問題,例如,咱們每每會建一個本身的分支去修改和調試代碼, 若是別人或者本身發現原有的分支上有個不得不修改的bug,咱們每每會把完成一半的代碼 commit提交到本地倉庫,而後切換分支去修改bug,改好以後再切換回來。這樣的話每每log上會有大量沒必要要的記錄。
其實若是咱們不想提交完成一半或者不完善的代碼,可是卻不得不去修改一個緊急Bug,那麼使用’git stash’就能夠將你當前未提交到本地(和服務器)的代碼推入到Git的棧中。
usage: git stash list 列舉出本身的暫存代碼 or: git stash show 查看stash的詳情 or: git stash drop 丟棄stash or: git stash ( pop | apply ) 彈出棧中的stash or: git stash branch stash某個分之 or: git stash [save [--patch] 壓入棧stash or: git stash clear 清空
操做流程
建立倉庫
簡易的命令行入門教程:
Git 全局設置:
git config --global user.name "superworker" git config --global user.email "huyanliang@inpingo.com"
建立 git 倉庫:
mkdir api cd api git init touch README.md git add README.md git commit -m "first commit" git remote add origin https://git.oschina.net/superworker/api.git git push -u origin master
已有項目?
cd existing_git_repo git remote add origin https://git.oschina.net/superworker/api.git git push -u origin master
git clone https://git.oschina.net/superworker/api.git
git checkout dev
git checkout -b [new-feature]
git push origin [new-feature]
查看分支:git branch 建立分支:git branch <name> 切換分支:git checkout <name> 建立+切換分支:git checkout -b <name> 合併某分支到當前分支:git merge <name> 刪除分支:git branch -d <name> ``