* 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/