先把git的几个基本概念再次描述一下,工作区workspace:就是你的工作目录,新增或修改后并未加入git管理;暂存区stage:执行add命令之后的状态,新增或修改之后加入到git管理,尚未提交到版本库;版本库:执行commit提交后的拥有唯一id的一个定版。
git在本地进行版本控制其实和svn区别不大,svn是连接中央服务器,git相当于自己在本地完成版本控制。不同的是git有远程仓库,你可以从远程下载资源,在本地进行资源版本控制,然后将本地资源推到远程仓库。可以自行搭建一个git服务器,这里就借助一下github公共仓库。
在github上创建一个repository,有了这个远程仓库就可以从这里clone资源,或者关联这个远程仓库,push资源到这里。本地执行push之后,远程仓库就可以看到本地资源了。现在本地可以版本控制,可以同步远程多人协作,可谓进可攻退可守。
#新增一个远程仓库 origin作为远程主机名称
$ git remote add origin git@github.com:maidepiao/git_test.git
#本地推向远程主机origin的master分支 -u指定默认主机
$ git push -u origin master
下面搞一下分支开发,多人协作为了互不干扰免不了创建资源分支,在svn的时代,拉取分支可谓是和创建新目录没什么区别,最后分支修改完还要合并到主干上,相比git而言太重了,看看git是怎么做的。
上篇说过了,git是以修改作为版本控制,所以在这里创建一个分支就相当于创建了一个版本,这个版本与主干版本互不影响,当分支开发完就可以把主干版本指向这个分支版本,这样主干和分支就算合并了。
#创建并切换到分支dev
$ git checkout -b dev
#正常创建分支
$ git branch dev
#正常切换分支
$ git checkout dev
#查看分支 输出带表示当前分支
$ git branch
创建完分支就可以在分支里随便造了,当然造完了需要在分支里先提交,提交就有唯一id版本号了,一会合并的时候把主干指向这边就ok了。
#切回主干分支,主干合并要在主干里做
$ git checkout master
#简单粗暴快速合并
# git merge dev
#合并完删掉分支,这比svn不知6了多少倍
$ git branch -d dev
#查看当前版本库,只剩*master
$ git branch
如果自己本地玩,怎么提交都不过分。当多人协作时,合并时很可能出现冲突,这时需要手动解决冲突,然后再提交。解决冲突需要人工干预,这和svn没什么区别,处理完冲突之后,重新add并commit。
上面的合并属于git快速合并模式(Fast forward),这种模式下删除分支版本时无法追溯当时分支资源,比如分支代码当时提交了,因为解决冲突时没有合并到主干,那么删除分支版本后,分支提交的东西就丢掉了。
#--no-ff禁用ff模式,可以保留一次提交id
$ git merge --no-ff -m '合并并生成一次提交id' bug
合并操作在git log里有详细记录,可以查看下分支合并演进: