关于版本控制
什么是“版本控制”?我为什么要关心它呢?想象这么一个场景,三个人同时开发一个项目,每个人都有自己的代码库,每个人在自己的mac上进行代码开发工作。如果三个人的分工特别明确还好,各自负责各自的模块儿,最终合代码时以其中一个人为主导,把其他两个人的修改的模块儿直接替换。但是如果分工比较混乱,存在两个甚至三个人同时修改一个文件的时候,不必多说,必然乱成一锅粥了。其实,版本控制远远不止合代码这么简单。 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。之前一直使用svn做版本控制,现在逐步转入git, 不能说谁好谁坏,只能说各有千秋
XCode初始化本地项目库(公司服务器)
xcode对于git的支持还是很强大的。一些基本的操作,例如push, pull ,commit ,merge,新建删除分支等都可以通过图形界面直接完成。省去了在命令框的很多操作。
1, 添加远程库到xcode
依次点击 Xcode -> Preferences -> Accounts . 弹出框左下角点击+号。选择 Add Repostory...
出现了仓库配置界面----->>>>
Address : 填写github上项目的网址或者公司自己的git 服务器上项目的地址。具体如下,打开github, 选择自己所要添加的项目。点击复制网址。粘贴到地址项。注意:如果是公司内部自己的git lab 需要把 http://myserver /项目名 中的 myserver 更改为内网的git项目的IP地址。端口号也要加入。
Autnentication : 验证方式, 选用 Username And Password
User Name: 你的Github 的用户名以及密码
点击Add -- > 验证成功后左侧的Repositories 会多出一个远程仓库。这个时候就可以从git 服务器上叉代码下来尽情撸了。
2,从远程仓库拉取代码
Xcode 中依次点击 Source Control -> Check out
刚才添加的代码仓库出现在列表中。选中点击Next.
选中分支,第一次添加的库只有一个master主分支。选择存放的位置。然后下载即可。
3,创建分支以及merge
多人开发时没开发一个功能都自几拉取一个分支,在自己分支上进行开发,功能开发结束后merge 到主分支。依次推进,不至于污染主分支的代码。
(1)打开第二步叉下来的工程,查看当前分支,并新建自己的分支:
在当前在master分支上,通过New Branch…新建自己的分支(建议分支名以自己名字缩写为开头,这样便于区分)
(2)点击Create后,则在本地新建了“cyb_photopick”分支,并且会自动切换至新分支。至此我们基于master建好了一个本地分支,但是该分支并未推送到远端。可以看到:
当前远端并没有我们新建的分支。
我们可以通过 Source -> Push,将当前分支(cyb_photopick)推送到远端。
(3)提交代码:接下来就是进行代码编写,功能测试完毕后 Source control -> commit -> Source control -> push
(4)merge代码:
当我们在本地自己分支上完成开发之后,需要将代码与master的进行合并。
4.1 首先确保自己分支的代码已经提交并push
4.2 切换到master分支
点击switch。此时切换为主分支。
4.3 进行代码更新 Source Control -> pull
此时可能别的成员已经对远端对master分支代码进行了合入,会有代码冲突,解决冲突后本地master 分支已经是最新的代码
4.4 切回到自己的分支(cyb_photopick),过程不再赘述, 同4.2切换分支同样的步骤。
4.5选择Merge from Branch…: 把其他分支的代码合入自己本地分支。这里就是把主分支的代码合入到本地分支。merge过程中可能会有冲突需要解决。
4.6 Merge into Branch... 选择我们与哪个分支进行合并(这里既master分支),此merge过程可能涉及conflict解决(但是一般都 没有conflict了,因为上一步已经解决了),merge完成后,分支已经被自动切换到master分支上了。
4.7 注意以上切换到本地分支之后的所有操作均为本地操作。远端仓库并不知道这些merge的存在。所以还需要再进行依次push操作。push结束后如果这个功能分支就可以删除后重建分支开发其他功能了。
四,git tag功能
4.1、列出标签
$ git tag # 在控制台打印出当前仓库的所有标签
$ git tag -l ‘v0.1.*’ # 搜索符合模式的标签
4 .2、打标签
git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。
4.2.1 轻量标签
$ git tag v0.1.2-light
4.2.1 附注标签
$ git tag -a v0.1.2 -m “0.1.2版本”
创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。
4.3 补打标签
$ git tag -a v0.1.1 9fbc3d0
打标签不必要在head之上,也可在之前的版本上打,这需要知道历史某个提交(通过git log获取)。
4.4 切换到标签
与切换分支命令相同,用git checkout [tagname]
先列出所有标签
$ git tag
4.5 删除标签
误打或需要修改标签时,需要先将标签删除,再打新标签。
$ git tag -d v0.1.2 # 删除标签
参数d即delete的缩写,意为删除其后指定的标签。
给指定的commit打标签
打标签不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取)。
4.6 标签发布
git push不会将标签对象提交到git服务器,我们需要进行显式的操作:
$ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器
$ git push origin –tags # 将本地所有标签一次性提交到git服务器
再用git show命令可以查看标签的版本信息:
gitshow v0.1.2再切换标签 git checkout v0.1.2