共计 5240 个字符,预计需要花费 14 分钟才能阅读完成。
软件开发过程中一个重要的产出就是代码,软件的编码过程一般是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中能够顺利完成,我们需要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码的历史以便于对代码的更改进行追溯,另外一些版本控制工具还提供了冲突合并等高级功能来协调多人对同一代码文件修改。所以版本控制工具可以看做整个编码工作的基础,如果没有版本控制来统一代码库,那么对于复杂且参与人数较多的项目是难以完成的,同时如果没有统一的代码库基础,那么如持续集成、发布等工作将无法开展。
本文将从以下几个方面介绍版本控制工具及 Git 的使用方法:
- 常用的版本控制工具简介
- 使用 Git 来管理源代码
- Git 简介
- 安装 Git
- 创建一个本地仓库
- Git 的常用操作
- 文件的跟踪、修改、提交
- 文件的比较
- 文件状态及历史查看
- 操作的撤销
- 标签
- 别名
- 将本地仓库提交到远程
- 小结
常用的版本控制工具简介
CVS:
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 非常适合开源项目的代码管理,所以使用非常广泛。
使用 Git 来管理源代码
Git 简介
Git 是一个 基于文件快照 的分布式版本控制工具 ,对于文件快照来说它体现在当提交更新时,它会对所有文件制作一个快照,在快照中对于 没变的文件以链接的方式指向之前存储的文件:
图中每一个 Version 都是一个包含所有文件的快照,其中虚线框代表的是未改变的文件,通过链接指向前面的文件。
而分布式可以理解为去中心化,没有特定服务器,每一个节点都拥有所有的内容 ,而每一台安装了 Git 的计算机就可以看作一个节点,所以Git 几乎所有的操作都是在本地执行 的(可以在本地创建仓库、添加 / 修改 / 提交文件等等)。
Git 中对于文件有三个重要的工作区:
- 数据仓库:保存了所有 Git 提交的状态为 Commited 的文件,相当于集中式版本管理工具中服务器管理的文件数据库,数据仓库文件位于.git 目录下
- 工作目录:工作目录就是用于开发的区域,工作目录的内容从数据仓库中检出指定版本进行修改,修改完成后可将修改内容提交到暂存区域。
- 暂存区域:暂存区域保存了工作区域提交的文件,“暂存”的意思就是只是对用户修改后需要提交到数据仓库的文件进行暂存,最后可一次性将暂存的内容提交到数据仓库。
它们的工作流程如下 ( 将它们看作普通的文件目录,它们的操作看成目录间文件的复制操作更容易理解 Git 的工作原理,其中 git 仓库比较特殊会保存每一次复制 (提交) 的内容,而其它两个目录相同内容会被覆盖):
安装 Git
说到 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 有哪些常用操作呢?
文件的跟踪、修改、提交
将新的文件添加到 git 中管理涉及到的相关操作:
- 跟踪新文件:(git add 文件名 或 git add -a 后者添加除被忽略以外的所有文件)
- 提交文件:(git commit -m “ 提交信息 ”)
- 文件修改:(当已经提交的文件再次被修改时,如果要再次提交该文件仍然需要使用 git add 命令,或者使用 git commit - a 来跳过暂存区进行提交。注:git commit - a 只能提交已经被 git 管理的修改文件)
跳过暂存区提交:
- 手动删除工作区文件(即直接删除目录下文件):
- 从 git 中删除文件:(git rm 1.md 或 git rm 1.md -force 强制删除)
文件的比较
- 比较修改内容:(git diff)
- 比较暂存区的修改内容:(git diff –cached 或 git diff –staged)
注:需要保证暂存区有内容才会有结果。
- 使用内置 vimdiff 比较器查看修改内容:(git difftool)
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
文件状态及历史查看
- 查看状态:(git status)
- 查看提交历史:(git log)
- 查看状态概要:(git status -s)
状态由 2 位字符构成,第一位代表暂存区状态有(添加 A、修改 M)第二位代表工作区状态(修改 M),另外?? 代表 git 未跟踪的文件。
操作的撤销
- 撤销工作区的修改:(git checkout — README.md)
- 撤销暂存区的文件:(git reset HEAD README.md)
- 提交补充(多次提交合并为一个后续提交信息会覆盖之前的):(git commit –amend)
上图对文件 READ.md 进行了 2 次修改和提交,但是日志中只会看到最后一次提交的信息:
标签
- 打标签:(git tag -a v0.1 -m “version 0.1”)
- 对提交历史打标签:(git tag -a v0.01 -m “created repository”)
- 推送标签到远程服务器:(git push origin v0.1 注:需要有远程仓库)
GitHub 上的标签:
- 检出标签代码:(git checkout -b version0 v0.01 注:需要有远程仓库)
注:该命令创建了一个新的分支 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