软件开发过程中一个重要的产出就是代码,软件的编码过程一般是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中能够顺利完成,我们需要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码的历史以便于对代码的更改进行追溯,另外一些版本控制工具还提供了冲突合并等高级功能来协调多人对同一代码文件修改。所以版本控制工具可以看做整个编码工作的基础,如果没有版本控制来统一代码库,那么对于复杂且参与人数较多的项目是难以完成的,同时如果没有统一的代码库基础,那么如持续集成、发布等工作将无法开展。
本文将从以下几个方面介绍版本控制工具及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://*.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
下一篇文章将对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://*.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
本文链接:http://www.cnblogs.com/selimsong/p/9051137.html
好代码是管出来的——使用Git来管理源代码的更多相关文章
-
VS Code使用Git可视化管理源代码详细教程
前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...
-
git-svn:通过git来管理svn代码
简介 svn和git都是常用的版本管理软件,但是git无论在理念或是功能上都比svn更为先进.但是有的公司是以svn作为*仓库,这时git与svn代码的同步就可以通过 git-svn这个软件进行,从 ...
-
使用GIT来管理代码的心得
使用GIT来管理代码,第一步当然就是下载一个GIT客户端(不知道是不是这么叫,但是觉得和客户端的功能差不多).电脑的操作系统是windows7的,所以下的是对应的GIT. 就是这玩意,安装的时候不停的 ...
-
使用 Git 来管理 Xcode 中的代码片段
使用 Git 来管理 Xcode 中的代码片段 代码片段介绍 xcode4 引入了一个新 feature: code snippets,在整个界面的右下角,可以通过快捷键:cmd + ctrl + o ...
-
JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理
文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结 JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语 ...
-
代码管理工具:使用github和git工具管理自己的代码
一.git工具和账户创建 1.1 安装 Git 是 Linus Torvalds 最近实现的源代码管理软件."Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系 ...
-
Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)
之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...
-
将代码库从 SVN 迁移至 Git 并保留所有 commit 记录
公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...
-
PHP 代码规范、流程规范、git规范
1. 命名规范 (1).变量命名规范 1.变量使用驼峰命名法 禁止使用拼音或者拼音加数字 2.变量也应具有描述性,杜绝一切拼音.或拼音英文混杂的命名方式 3.变量包数字.字母和下划线字符,不允许使用其 ...
随机推荐
-
在java中如何用键盘输入一个数,字符,字符串
一,利用 Scanner 实现从键盘读入integer或float 型数据 import java.util.*; public class test { public static void mai ...
-
Razor 视图引擎 – ASP.NET MVC 4 系列
Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎. Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演 ...
-
ASP.NET Web API之消息[拦截]处理
标题相当难取,内容也许和您想的不一样,而且网上已经有很多这方面的资料了,我不过是在实践过程中作下记录.废话少说,直接开始. Exception 当服务端抛出未处理异常时,most exceptions ...
-
DuiLib——xml配置项
DUILibxml配置项 根节点 子类 属性 类型 Window |--------Image 图片信息 | o------name string | o------restype string | ...
-
捉Bug:易车注册页布局小臭虫 附demo
--------<!--文章开始-->-------- 开场show:这几天天气异常燥热,早上起来从棉毛衣换到了小短袖,配上一杯冷泡乌龙茶,真是没谁了,这哥们懂得享受哈 开始鼓捣博客,把博 ...
-
ThinkPHP 关联模型(二十)
原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和 user 关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表 ...
-
天猫精灵X1智能音箱使用感想
11.22音箱到手,等了刚好一个月. 主要是测评语音交互功能. 测试条件:正宗普通话. 1)问天气.温度:表现良好.2)找手机功能:试了多次,每次都说手机号码格式不对3)小孩听故事:正常.但是开头会有 ...
-
DragVideo,一种在播放视频时,可以任意拖拽的方案
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到 ...
-
linux下git远程仓库的搭建
一.服务器环境 ubuntukylin-16.04-server-amd64 二.远程服务器创建一个名字叫git的用户,专门用于管理git仓库. $ adduser git 三.安装git.服务器端和 ...
-
Android-Start方式和Bind方式混合开启Service
Android-Start方式和Bind方式混合开启Service 需求如下 需要开发一个音乐APP,需要满足以下的需求: 当退出所有的Activity后仍然能够播放音乐 能够控制音乐的播放比如说,暂 ...