软件开发过程当中一个重要的产出就是代码,软件的编码过程通常是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中可以顺利完成,咱们须要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码的历史以便于对代码的更改进行追溯,另一些版本控制工具还提供了冲突合并等高级功能来协调多人对同一代码文件修改。因此版本控制工具能够看作整个编码工做的基础,若是没有版本控制来统一代码库,那么对于复杂且参与人数较多的项目是难以完成的,同时若是没有统一的代码库基础,那么如持续集成、发布等工做将没法开展。html
本文将从如下几个方面介绍版本控制工具及Git的使用方法:git
CVS:github
CVS(Concurrent Versions System)是一个开源的版本控制系统,基于C/S模式,CVS将代码存储在服务器上,经过客户端来获取、提交代码及其它操做。
SVN:
SVN(Subversion)和CVS同样是一个C/S模式的开源版本控制系统。
TFS/VSTS:
TFS(Team Foundation Server)/VSTS(Visual Studio Team Services)是微软推出的针对团队协做的软件开发工具,版本控制只是其中一个功能,除此以外还提供敏捷开发支持、持续集成等高级功能,TFS和VSTS功能相同,VSTS能够看做是云版本的TFS。TFS按照服务器来受权,VSTS安装帐户来受权,另外VSTS提供了免费试用版本(注:VSTS支持Git做为版本控制工具)。
Git:
Git是一个分布式的版本控制工具,相对于其它版本控制工具来讲,它有一些特有的性质如:分布式/去中心化(每一个客户端保存了完整的代码仓库),强大的分支能力,速度很是快(由于代码库在本地基本是本地操做)。由于自己的特性因此Git很是适合开源项目的代码管理,因此使用很是普遍。shell
Git是一个基于文件快照的分布式版本控制工具,对于文件快照来讲它体如今当提交更新时,它会对全部文件制做一个快照,在快照中对于没变的文件以连接的方式指向以前存储的文件:数据库
图中每个Version都是一个包含全部文件的快照,其中虚线框表明的是未改变的文件,经过连接指向前面的文件。
而分布式能够理解为去中心化,没有特定服务器,每个节点都拥有全部的内容,而每一台安装了Git的计算机就能够看做一个节点,因此Git几乎全部的操做都是在本地执行的(能够在本地建立仓库、添加/修改/提交文件等等)。
Git中对于文件有三个重要的工做区:vim
它们的工做流程以下(将它们看做普通的文件目录,它们的操做当作目录间文件的复制操做更容易理解Git的工做原理,其中git仓库比较特殊会保存每一次复制(提交)的内容,而其它两个目录相同内容会被覆盖):windows
说到Git有人可能会有疑惑,为何Git能够在Visual Studio中使用,而GitHub也提供了本身的客户端,可是像国内也有码云(gitee)这样的托管平台,那么Git这个工具究竟是怎样的?要如何使用?
Git它有多种表现形式,其一是原生的命令行工具,另外其它工具如VS中的、GitHub的客户端实际上都是对命令的封装以简化用户操做的GUI工具,换句话说Git的工具不管怎么变,它的核心都是原生的命令行工具,同时也说明了只要有命令行工具那么就可使用如GitHub、gitee等不一样的基于Git的代码托管平台。
在Windows下安装git命令行工具(注:Windows下的Git项目是一个独立于Git的项目,好像由微软维护):
下载地址:https://git-scm.com/download/win
安装Git:
选择组件:服务器
注:若是勾选了GitBash Here及Git GUI Here,那么在window的资源管理器中能够经过右键在当前目录打开GitBash(Git专用的命令执行工具,相似cmd/powershell,同时也能够将git的cmd目录配置到环境变量中用Windows的命令行工具执行git命令)或新版本中内置的简单GUI程序:编辑器
安装运行结果:分布式
左为Git Bash右为Windows cmd工具。
注:因为新版本VS会安装内置的Git工具,若是出现一下信息,可检查是否存在路径如“Microsoft Visual Studio 14.0\Web\External\git”的环境变量,删除便可:
本文使用基于.Net Core的My Blog应用程序代码为例进行演示,My Blog的目录结构以下:
src目录中包含全部代码:
1. 在My Blog的根目录下打开Git Bash,使用git init建立一个本地仓库:
同时该目录下将生成一个.git隐藏目录。
2. 为该仓库配置用户信息,在提交代码时将使用该用户信息进行提交:
git config user.name "Selim"
git config user.email "yqszt@qq.com"
注:此处用户信息仅对当前仓库有效,若是要配置全局用户信息需添加--global选项:
git config --global user.name "Selim"
git config --global user.email "yqszt@qq.com"
3. 最后为该仓库添加忽略文件配置(仅管理代码,如编译结果等文件应该进行过滤):
文件内容来源:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
注:windows没法直接建立.gitignore文件,能够用编辑器另存为改变文件名,另外gitignore文件的格式可参考文档:https://git-scm.com/docs/gitignore。
4. 将全部文件添加到暂存区:(git add --a)
注:LF是Unix下的换行符CRLF是Windows下的换行符,默认git中使用Unix换行符,能够经过git config –global core.autocrlf false 禁用自动转换 。
5. 查看状态:(git status)
能够看到全部必须的文件都已经被添加到了暂存区。
6. 将暂存区代码提交到仓库:(git commit -m "create a repository")
7. 查看日志:(git log)
8. 使用VS2017打开该解决方案后,团队资源管理器中将会自动识别这个本地的git仓库:
前面已经完成了代码仓库的建立,那么Git有哪些经常使用操做呢?
将新的文件添加到git中管理涉及到的相关操做:
跳过暂存区提交:
注:须要保证暂存区有内容才会有结果。
windows上可使用winmerge来替换默认的比较/合并工具:
winmerge下载地址:http://winmerge.org/
配置方法参考:https://blog.csdn.net/guoxinian/article/details/52297804
https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
状态由2位字符构成,第一位表明暂存区状态有(添加A、修改M)第二位表明工做区状态(修改M),另外??表明git未跟踪的文件。
上图对文件READ.md进行了2次修改和提交,可是日志中只会看到最后一次提交的信息:
GitHub上的标签:
注:该命令建立了一个新的分支version0,并获取了v0.01tag的代码,改代码是版本库最初的版本。
git中能够设置命令别名,以简化命令:
上图的别名设置是将checkout等命令简化为co、br、ci、st。
更多命令和使用方法请参考:
https://git-scm.com/docs
https://git-scm.com/book/en/v2
本地的git仓库已经实现了代码版本控制功能,可是本地的仓库没法实现团队的合做,并且代码库都在本地没法发挥分布式的特性。因此能够将本地的代码仓库提交到远程托管平台如GitHub、Gitee等等。
在GitHub上建立一个新的仓库(注:须要先注册一个GitHub帐户):
建立成功后GitHub会给出提示如何使用这个库,好比建立新库的流程、导入已有库的流程以及导入代码的流程:
这里咱们须要第二种方法:
注:若是第一次经过git将代码push到github,那么会出现如下登录提示:
在Windows下仅须要登录一次,git就会记住登录信息,避免后续的重复登录,记录登录信息的功能由git credential manager提供,详见: https://github.com/Microsoft/Git-Credential-Manager-for-Windows
这样就可以成功将代码提交到GitHub上:
更多使用GitHub托管代码的内容后续介绍。
本文主要介绍了经常使用的代码版本控制工具,版本控制工具可分为集中式的和分布式的,其中集中式的经常使用的有SVN而分布式的有Git,随着软件开发方式的发展Git更加的符合现代的敏捷、远程协做等概念,因此本系列文章选择了Git做为代码版本控制工具。
另外本文主要是介绍了Git命令行工具的使用方法并使用了GitHub做为远程代码托管平台对代码进行了托管,Git的GUI工具很是多,但全部的GUI工具的原理都是对Git命令封装,而后提供一些便捷的功能,因此理解Git命令是很是必要的,理解了Git的基础命令再去使用GUI工具会更加驾轻就熟。但要注意的是本文介绍的命令并不全面,由于一个命令还有不少参数选项,因此更多内容可参考Git的官方文档或书籍:https://git-scm.com/docs https://git-scm.com/book/en/v2
下一篇文章将对Git的核心特性分支以及pull request进行介绍,敬请期待。
参考:
https://git-scm.com/docs
https://git-scm.com/book/en/v2
https://github.com/Microsoft/Git-Credential-Manager-for-Windows
https://blog.csdn.net/guoxinian/article/details/52297804
https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
https://github.com/github/gitignore/blob/master/VisualStudio.gitignore