对 Charley Blog 的代码进行版本控制的想法由来已久,在代码建立之初其实已经使用过 TFS 进行控制,只是后期没能好好用起来,加之后来系统环境的变化导致TFS连接丢失,便算是正式放弃了版本控制这个重要的工具。时隔好几个月后,最近一次偶然的机会,在尝试了 Git 工具来维护《ueditor上传图片到七牛(CSharp版本)》中所使用的代码后,感觉良好,因此便有了利用 Git 来维护 Charley Blog 的原始冲动。

  本片文章中,我会详细介绍如何使用 Git 来连接TFS,请大家接着往下看吧。

  如果懒得看文字,您也可以访问如下视频网站进行观看:土豆优酷56

TFS

  Team Foundation Server 是微软提供的一款团队协作开发工具,提供应用程序生命周期管理(ALM,Application Lifecycle Management)功能,主要包含工作项建立、源代码控制(TFVC,Team Foundation Version Control)、测试管理等,可以有效帮助团队成员进行协作开发。

Git 简介

  Git 是一款分布式的版本控制工具,开发者可以使用 Git 把代码存放到本地代码库或者网络上的代码库(或称代码托管服务器)进行管理。国外比较有名的 git 托管服务器有 GitHub、GoogleCode、BitBucket、CodePlex 及微软的云端TFS。国内有 GitCafe、CSDNCode、开源中国-代码托管。

  而版本控制工具除 Git 外,还有SVN(Subversion)、VSS(Visual SourceSafe)、TFVC等。

  本文默认读者已经对 Git 有了基本的认识,如果尚未了解过,建议大家阅读参考资源[1][2]

在 TFS 中使用 Git

  自2013年1月30日开始,TFS就开始支持使用 Git 签入源代码了,这对很多项目组来说是个不折不扣的好消息。但是想使用该功能必须安装一个 Visual Studio 扩展,该扩展只支持 Visual Studio 2012 Update 2 或以上版本(Visual Studio 2013则原生支持 Git)。[3]  安装了之后,开发团队就可以混合使用 Git 和 TFVC 来签入代码,也可以使用其它第三方的 Git 客户端工具或第三方 Git 托管服务器。如果使用 TFS 作为代码托管服务器,那么还能继续使用 TFS 强大的应用程序生命周期管理工具。

  下面,我会通过实例演示如何使用 Git 签入代码到 TFS。

1. 下载 Visual Studio 扩展

  没有安装扩展之前,团队资源管理器中只显示 TFS。

  选择 “工具” -> “扩展更新”,进入如下界面。

在输入框中输入“git”

  安装完成后,重启 Visual Studio,会发现团队资源管理器界面多了 Git 的栏目。

  2. 新建项目

  选择控制台应用程序,同时勾选 “添加到源代码管理”。

  第一次进入项目的时候,会请你选择想要的源代码管理系统,这里我们选择 “Git”。

  当选择完源代码管理系统后,Visual Studio 会对 Git 进行初始设置。

该项目的 Repository 已经创建成功

  这时候,我们查看解决方案资源管理器,可以看到在每个项目前都多了个源代码控制的状态图标。

“+” 代表该文件是新添加的

  右键单击每一项,会发现在上下文菜单中多了三个新东东: Undo、View History、Commit。这些是源代码控制的快捷菜单。

  3. 配置 Git 源代码管理工具

  打开 “团队资源管理器”,显示如下:

“提示安装第三方命令行工具”,目前用不到,暂时忽略

  点击 “Changes”

  此时团队资源管理器会切换到 “Changes” 界面,该界面会列出所有本次修改过的代码。

  在我们正式签入代码之前,还需要对 Git 进行一次配置,否则 “Commit” 按键将一直显示灰色,无法点击。

  点击 “Config” 就可以进入到配置界面,在此输入用户名、邮箱,用以在源代码管理器的历史记录中显示某次签入的人员信息。填写完毕后,点击 “Update”。

  用户名、邮箱并不作为登录TFS的凭据,只是用于标识某次签入人的代号,可以任意填写。上述配置可以在后期进行修改。

  4. 项目签入

  再回到 “Changes” 界面, 填写本次签入的描述信息后点击 “Commit” 进行签入。

  我们还未连接过任何源代码托管服务器,所以现在的 “签入” 只是签入到本地代码库中。因此你会发现签入的速度极快,签入成功后,显示如下信息。

Commit XXX created locally. Sync to share your changes with the server.

  点击 “Commit 77a04762”,查看本次签入的详细情况。

  回到解决方案资源管理器,会发现原先的 “+” 号变成了一把小锁,这表示该文件已经签入成功了。

  5. 修改代码

  修改Program.cs中的代码,会发现小锁变成了一个 “勾子”,这表示该文件已经在本地进行了修改。

  右键单击解决方案资源管理器中的 “Program.cs” ,选择 “Source Control” -> “Compare with Umodified” 比较一下当前版本和上一个版本的区别。

选择 “Compare with Umodified”

“比较” 面板

  签入本次改动后,查看历史记录。

“历史记录” 面板

  截止目前为止,我们对代码的版本管理操作都只是基于本地的代码库,并没有连接到网络上的服务器。这对于个人开发者来说是个绝妙的事情。

  6. 同步到云端的 TFS 服务器

  6.1 使用 Visual Studio Online 建立服务器[6]

  对于小于5个人的小型开发团队而言,可以使用 Visual Studio Online 来免费维护自己的代码。

  在浏览器中输入 “https://app.vssps.visualstudio.com/” 连接到 Visual Studio Online,一个微软账户只能创建一个 Visual Studio Online 账户。

  创建一个代码库,选择将使用的源代码管理工具。

创建新代码库

创建成功

  点击左上角的 “Code” 选项,进入 “Code” 页面。第一次进入该页面,会提示如何连接到此代码库。复制代码库地址。

  6.2 代码同步到新创建的代码库中

  回到 Visual Studio, 选择 “Unsynced Commits”,将上面复制的地址粘贴到对就的位置。

Unsynced Commits 界面

将地址粘贴到输入框

  点击 “Publish”,便开始将本地代码库中的数据同步到服务器。

点击 “Publish”

提成成功

  7. 在服务器端查看代码

  当数据同步成功后,我们可以进入服务器查看代码状态。

  还是进入 “Code” 页面,此时已经能正常看到刚才提交过的代码了。

  查看历史记录,可以看到所有本地的历史版本都已经被正确同步到了服务器端。

  上面,我只是演示了如何将新建的项目添加到云端的TFS。你完全可以将已有的项目添加到源代码管理控制系统,请见参考资源[6]

Git 与 TFVC

  TFVC

  集中式的版本控制系统。具体来说的话,使用该工具,所有文件的版本历史数据只保存在服务器上,开发人员的机器上只会保留文件的一个版本,想查看历史数据必须从服务器上调取。

  所有对代码的版本控制操作必须连接服务器,无法在本地进行代码的签入、创建分支、历史版本比较等操作。

  分支是基于路径的,而且只在服务器上创建。

  支持在代码签入时进行强制检查,如果不符合预先设定的规范,则TFS会拒绝签入。

  支持挂起所做的修改(即vs2010中的shelve功能,vs2012中的suspend功能),并在日后继续。

  Git

  分布式的版本控制系统,每个开发人员的机器上都会保存完整的版本历史。

  对代码的版本控制如签入、创建分支、历史版本比较时不需要连网。

  分支是轻量级的,可自由切换。

  在代码签入时不支持强制检查。

  详细差异请见参考资源[5]

参考资源

  [1] Pro Git 中文版

  [2] git - 简明指南

  [3] Git init VS

  [4] Use Visual Studio with Git

  [5] 使用版本控制

  [6] 连接到 Visual Studio Online

  本文来自 Charley Blog

如何在 TFS 中使用 Git的更多相关文章

  1. [转]如何在 TFS 中使用 Git

    本文转自 http://www.cnblogs.com/stg609/p/3651688.html 对 Charley Blog 的代码进行版本控制的想法由来已久,在代码建立之初其实已经使用过 TFS ...

  2. 开发团队在TFS中使用Git Repository (一)

    在研发团队中,代码版本管理是最为基础的必要工具.个人使用过的版本管理工具有SVN.VSS.ClearCase.TFS.Git,从团队的角度和使用角度来说,个人倾向于与使用TFS作为团队的基础工具.首先 ...

  3. 开发团队在TFS中使用Git Repository (二)

    使用Git作分支时,仅仅是对提交历史记录的一个引用,创建分支成本非常低,分支的切换快且简单.在分支管理方面,相对其他的版本管理工具,Git可谓是一骑绝尘. 开发过程中,我们可以针对任何的大小功能进行分 ...

  4. 在TFS中使用Git Tags(标签或标记),实现代码的版本管理

    一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...

  5. 如何在cmd中集成git

    1.要在cmd中集成git,要解决在cmd中输入git命令时不提示git不是内部或外部命令: 即需要将git添加到path变量中,即将D:\Git\mingw64\bin和D:\Git\mingw64 ...

  6. 如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)

    故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查 ...

  7. 如何在Eclipse中修改Git项目

    第一步:先在Eclipse创建一个要上传的项目. 第二步:创建一个Git仓库并与远程仓库相连 第三步:将Eclipse创建的项目复制到创建好的Git仓库 第四步:将Eclipse新建项目删除重新imp ...

  8. 如何在VS2015中使用Git命令提示符

    本文转载自 http://qkxue.net/info/176223/Visual-Studio-Git VS2015自带了Git插件,但有时候觉得Git控制台命令更方便些.VS中本身不能把Git B ...

  9. 如何在GitBook中使用Git管理

    1.在GitBook中新建[Book],找到对应目录下的位置,拷贝[book]名称后删除文件夹以及文件,新建文件夹重命名为[book]名称 2.打开文件夹,在根目录下选择创建git仓库,即 git i ...

随机推荐

  1. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  2. Matlab 高斯_拉普拉斯滤波器处理医学图像

    前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...

  3. JAVA问题集锦Ⅰ

    1.Java的日期添加: import java.util.Date ; date=new date();//取时间 Calendar calendar = new GregorianCalendar ...

  4. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  5. jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能

    ▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...

  6. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  7. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)

    好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下. 1.评论功能实现 我们修改一下保存评论按钮的点击事件,用jQuery的方式获取文本框中的值,然后通过aja ...

  8. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  9. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  10. arcgis api for js入门开发系列五地图态势标绘(含源代码)

    上一篇实现了demo的地图查询功能,本篇新增地图态势标绘模块,截图如下: 本篇核心的在于调用API的Draw工具:https://developers.arcgis.com/javascript/3/ ...