* Git:分佈式,全部的teammates本地能夠clone一份獨立完整的倉庫,而不只僅是某一個版本的鏡像拷貝;
開發者能夠在本地clone倉庫中完成全部vcs的操做,只有當須要協同工做提交代碼到遠程倉庫的時候,才須要聯上網絡。
* Subversion:中央集中式,全部的teammates都面向一樣一個遠程倉庫工做;
checkout出來的本地工做區代碼只是遠程倉庫某一版本的一份鏡像拷貝。
* Git:對於Git而言,倉庫會獨立於開發者的本地磁盤中,在倉庫的根目錄中只包含了一個」.git」文件夾,
全部的branches、trunk(PS:git中名稱爲master)、tags均是經過命令操做而生成的,並不是經過URL路徑。
在Git中,URL相似於ssh://git@example.com/path/to/git-repo.git,僅僅是指向了倉庫的一個標識。
* Subversion:分支的url相似於svn+ssh://svn@example.com/svn/trunk,每個分支獨佔一個惟一URL,
每個URL都會直接定位到每個分支在遠程倉庫中的路徑位置。 對於Subversion,會有一個trunk分支做爲開發主線分支,
會有不少branches分支做爲並行分支,tags則是mark上某一特定的發佈版本。
* Git:Git分支相對於其餘的vcs是很是不同的設計理念,一個Git分支僅僅指的是指向某一肯定版本的簡單指針,
所以,Git的分支是無拷貝、無新建目錄、幾乎無開銷的。
* Subversion:正如咱們所知道的,SVN中的分支僅僅是項目的一份拷貝,是一個具備特殊含義的普通文件夾;
多分支則是多文件夾的形式。
* Git:若你使用的是Git,你的提交操做不受網絡的影響,你的提交僅僅影響了本地倉庫,僅當你須要於遠端倉庫同步內容之時,
才須要使用到網絡; 另外的,在你本地倉庫還存在一個so-called Staging Area,並不是你的全部文件須要在一次提交中所有commit,
你能夠選擇指定的變動放入staging area中,從而在本次提交中僅僅包含你所選定的變動條目;
關於Git的版本號,你們都知道,Git是分佈式的vcs,要想和svn、cvs通常生成revision#5,
revision#6相似的遞增數值做爲惟一版本號是不可取的,可是咱們也一樣須要一個惟一的標識來辨別每一次提交,
而Git的作法是使用了」commit hashes」。
* Subversion:當你使用的是SVN,假設你要提交代碼,如下是你的提交過程:
* 首先設備必須是聯網的,能夠與遠端中央倉庫創建鏈接;
* 將提交的內容當即傳輸到遠端中央倉庫;
* 遠端中央倉庫生成遞增的版本號,並賦予本地分支。
* Git:若你使用的是Git,你須要決定什麼時候將你的本地倉庫的內容同步上傳到遠端倉庫分享出來,
而Git不會爲你做任何的自動上傳的操做; 這樣子的分享過程相對於其餘的中央倉庫式的vcs系統來講是更加安全的,
所發生的衝突也只會發生於你的本地(倉庫)而非遠端服務器的倉庫,這將更能幫助你規避打亂teammates工做內容衝突的風險。
* Subversion:當你將本地分支內容做commit操做之時,你的內容便會分享到遠端中央倉庫中,
其餘teammates也都能同步到你所提交的內容。
SourceTree:開源的Git源代碼管理工具php
TortoiseGit:開源的Git源代碼管理工具git
EGit:Eclipse插件,最新Mars版本已經自帶安全
Gitflow Nightly:Eclipse插件,支持Git-Flow服務器
認識Git的幾個關鍵目錄
Working directory:工做區網絡
Index directory:暫存區架構
Local repository:本地倉庫app
Remote repository:遠端倉庫ssh
經常使用的Git操做
clone:克隆項目到本地工做區,相似svn checkout分佈式
checkout:建立/切換本地倉庫的指定分支到工做區中svn
commit:將本地工做區代碼提交到本地倉庫
push:將本地倉庫代碼同步到遠端倉庫
pull / fetch:將遠端倉庫的代碼同步到本地倉庫/工做區
* pull:fetch + merge,該操做會影響工做區
* fetch:從遠端倉庫獲取並更新到本地倉庫中,不影響工做區
* merge:
* rebase:
* git stash [save -a 「msg」] 備份當前的現場狀態
* git stash list 顯示已保存的現場狀態列表
* git stash pop/apply [--index][<stash>] 恢復工做狀態,若不含帶參數,則從狀態棧中獲取最新的。
pop在獲取完成後,從棧中移除該狀態,apply則不會從棧中移除
* git stash clear 清空狀態棧中的全部內容
* git drop 刪除狀態棧中的指定狀態
什麼是Git-SVN的擴展開發模式,即本地開發應用Git的強大分支特性,當最終push操做的時候,目標倉庫設定爲SVN遠端倉庫。這裏點到爲止,只說起一下,以便有既想使用Git又糾結沒法脫離Subversion的開發者去使用,這確實是一種很讚的「曲線救國」方案。什麼是Git Stash的開發模式,即一個工程師能夠並行開發多項內容,要求用到切換分支的操做,而在沒有提交到本地倉庫以前,可使用git stash命令將當前分支的工做區和暫存區的狀態鏡像下來。當回過頭來須要繼續開發的時候,使用git stash pop將指定的狀態喚出後,能夠繼續未完成的內容。
一圖賽過千言萬語
關鍵幾個分支的概念全解
主分支
branch:保存當前開發成果的分支
master:保存當前可供生產部署的代碼,在每次發佈之時推薦爲每次新增發佈的代碼都打上一個TAG,供後續代碼維護使用
輔助分支
Feature:開發完整功能、新特性,從develop分支發起的分支
Release:用於發佈新的產品版本而設計的,支持從develop分支派生
Hotfix:屬於計劃外建立的可供生產部署的代碼分支,廣泛場景是軟件遇到了異常狀況或發生了嚴重必需要當即修復的缺陷之時。支持從master分支(或者其中的某一個TAG版本)中派生出來
分支命名慣例
Feature分支:feature-*
Release分支:release-*
Hotfix分支:hotfix-*
Single Pattern
Multiple Pattern
http://aboutcoder.com/2015/11/16/work-in-git/