详解在visual studio中使用git版本系统(图文)

很多人已经在使用git(或正在转移到git上),在github.com上,也看到园子里不少同学的开源项目,非常不错。但相关教程似乎不多,所以趁着我自己的开源项目源码托管(https://github.com/wojilu/wojilu),写了一篇,算是抛砖引玉吧。

这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正。

 

第一部分: 安装 git 开发工具

  

如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了,图形化工具(无论是 git extentions ,还是TortoiseGit),都只不过是命令行的封装。就功能而言,他们能做的,命令行全部可以做到;但命令行能做的,他们不一定可以做到。命令行更加原生、本色,跨越平台,以一当十。建议熟悉 git 命令行工具。 

但图形化工具也有自己的优点,就是直观。下面推荐的组合方案是: 

Git 命令行(cygwin) + Git Extensions + Git Source Control Provider 

——这个组合可以彻底解决中文文件问题(包括中文文件名、目录名,以及在 github 中的正常显示)。

 

1)安装 cygwin 命令行工具 

安装教程见 http://gotgit.github.com/gotgithub/10-appendix/030-install-on-windows-cygwin.html

安装过程中需要安装的软件:

git-completion: 提供 Git 命令自动补齐功能。安装该软件包会自动安装依赖的 bash-completion 软件包。

opensshSSH 客户端,提供 Git 访问 ssh 协议的版本库。

vim:是 Git 缺省的编辑器。

 

2)安装 git extensions 

【作用】

git extensions 必须依赖于命令行工具,所以第二个安装。

它安装之后不但可以使用,也自动在vs中加上插件,可以在vs中非常直观的、方便的操作。

 

【安装方法】

下载网址:http://code.google.com/p/gitextensions/downloads/list 选择GitExtensions226SetupComplete.msi那个带Complete字样的版本,它里面集成了 KDiff3 工具。

下载之后,双击安装,一路next,中间记得勾选 msysGit  KDiff3

git extensions 安装之后自带一个很全面的教程。

 

【配置】

我们知道,目前git命令行工具有两种,一种是 cygwin 下命令行,一种是 msysGit 命令行,git extensions 可以配置使用哪一种命令行工具,如下图,我们选择使用 cygwin,而不是 msysGit 

 

第一个是:“用户运行git的命令”

第二个是:全局配置文件,请点击“Change HOME”按钮,将目录改为 cygwin 的目录。 

另外,git extensions 会把 cygwin 默认的编辑器 vi 改成它自己的,你可以在“全局设置”中改回来。 

补充1git extensions 的配置文件放在注册表中,如果卸载,这些配置仍然保留,你可以再次安装发生问题,可以检查注册表中相关配置项,是否有问题。 

补充2:在安装 git extensions 过程中,我们勾选了 msysGit,现在安装完毕,其实你可以卸载 msysGit了,不过也可以保留,因为 msysGit 安装目录下自带 git 的所有命令的帮助文档。 

 

3)安装 Git Source Control Provider 

【作用】

Git Source Control Provider  vs 的一个扩展插件,但必须依赖于 git extensions,所以第三个安装,它的作用是,可以显示文件状态、显示文件历史等,让 vs 中文件操作更加方便。

项目网址:http://gitscc.codeplex.com/

源码:https://github.com/yysun/Git-Source-Control-Provider

视频教程:www.youtube.com/watch?v=efS0kKvfi6k

 

 

【安装方法】

vs菜单中点击“工具”的“扩展管理器”

  

然后在线搜索git,出现第一个结果就是 Git Source Control Provider,然后点击“下载”

 

 

然后点击vs菜单的“工具”的“选项”,展开左侧的“Source Control”,在右侧的“当前源代码管理插件”中选择“Git Source Control Provider”,然后点击“确定”

 

 

启用 Git Source Control Provider 之后,所有文件显示出状态图标。你可以在文件上右键进入 Git 菜单进行操作。

  

 

下面通过创建一个全新的测试项目,来演示如何在 vs 中可视化操作 git 版本库。如果完成了基本操作,你可以参与到实际的github项目,比如"我记录开发框架"和“我记录网站综合系统(集成了“SNS/门户CMS/论坛/博客/相册/微博/wiki”等应用程序的互联网产品)”已经托管到github,网址是 https://github.com/wojilu/wojilu 。

一、创建版本库

 

 vs 新建一个项目,然后点击“Git”菜单中的“Initialize new repository

 

 

弹出窗口,让你选择需要纳入git版本管理的目录——

 

 

初始化之后,在项目目录下,出现一个 .git 的隐藏文件夹,这个文件夹就是git版本库。

.git同处一个目录的所有文件,现在就纳入了这个版本库的范围之内。

现在你在这个目录下,可以执行 git 命令了。

 

比如下面就是在 git 命令行窗口中直接操作 git 命令,使用命令行,可以完成所有的 git 版本管理操作。

 

不过我们这一节主要讲如何在 vs 中可视化操作 git,暂时不涉及命令行管理。

 

 

二、将文件提交到版本库

 

只有将项目中的文件纳入版本库,我们才能享受到版本管理系统带来的好处,比如浏览历史版本,切换分支等……

 

1)首先,请关闭vs,然后重新打开。如果不重新打开,插件 Git Source Control 不能监控文件状态。

重新打开之后,文件显示状态符号:前面显示“+”加号,它表示这些文件的状态是“尚未纳入版本库”,需要你添加。

 

你可以点击“Git”菜单中的“Commit”进行提交

 

出现如下提交窗口

 

我们看到,这里需要提交的文件很多,但其实,很多文件是 vs 自动生成的临时文件,和项目内容没有关系,不应该纳入版本管理,比如 ***.suo 文件,这时候,我们需要将这些文件设置为“需要忽略的文件”,让 git 不理会他们。

 

2)设置忽略文件

 

请关闭上面的 commit 窗口,点击 vs 菜单 Git”中的命令“Edit .gitignore

 

 

出现忽略文件的编辑窗口,这个窗口左侧的内容区目前是空白,没有内容。

 

image009

 

不过右侧列举了一些常见的需要忽略的文件(默认),请点击右下侧的“添加默认的忽略项”按钮,将需要忽略的内容添加到左侧内容区,然后点击“保存”。

 

然后打开文件夹,你会看到项目中出现了一个名叫 .gitignore 的文件,它里面的内容就是你刚才保存的内容。

 

 

3)提交步骤a (加入暂存区)

 

再次点击菜单“Git”中的“Commit”提交命令,现在提交窗口中显示需要提交的文件大大减少,比如 ***.suo 文件就已经被 git 忽略掉了。

 

 

这时候如果直接点击“提交”命令,则出现如下提示窗口,意思是“还没有文件在暂存区中。需要暂存并马上提交所有文件吗?”

 

 

这句话什么意思呢?这里涉及到 Git 的一个暂存区( stage )的概念,在 Git 中有三个保存文件的区域:

1)工作目录,就是你在硬盘上操作的这些目录和文件;

2Git 版本库,就是前面说的 .git 隐藏文件夹。版本库里面又分成“暂存区”和真正的版本库。

a)暂存区(stage),其实相当于在提交之前的一个缓冲区;

b)版本库内容区,里面存放了文件的历史内容、各个分支等……

 

总之,将一个文件提交到版本库其实就是这样的流程——

 

1.工作目录 -->  (  2.暂存区  --> 3.版本库 )

 

为什么 Git 需要一个暂存区呢?这是为了方便 commit 提交过程中的反悔撤销等精细的操作。一旦加入暂存区(stage),即加入了 .git 中,但尚未提交到版本库,有了这个缓存,提交操作过程变得更加灵活。

 

总之,你的提交过程分成两步:先 add 加入 暂存区(stage),然后提交(commit)。如果用命令行表示,就是

第一步:git add fileName

第二步:git commit -m "提交描述文字"

 

这两个步骤对应到上图,就是左侧的两个窗口,左侧上部是工作目录,左侧下部是暂存区,两个窗口之间用“暂存(stage)”命令分隔,如下图。

你可以选定一个文件,点击途中左侧的箭头,将此文件加入暂存区;也可以点击右侧双箭头,将所有文件加入暂存区。

 

这个点击双箭头的命令,其实和如下 Add Files 命令(项目中右键进入Git菜单)是相同的,都是将所有文件加入暂存区。特别说明:如果文件名或目录名是中文,请使用 Add Files 命令代替此处的stage操作。

 

 

 

4)提交步骤b (真正提交commit)

 

将文件全部加入暂存区之后,如下图所示,请在右下窗口中输入提交说明信息,请务必认真填写,不要留空。每一次提交都要有明确的说明,这是以后版本浏览、管理的关键线索。

 

 

填写“提交信息(m)”之后,就可以点击“提交”按钮了,之后会弹出如下窗口,表示提交成功。

 

上面的操作非常直观,但如果用git命令行,其实只要简单的两行命令即可:

git add .

git commit -m "我的第一次提交"

 

两种方式各有优缺点。

 

这时候我们再看项目中文件的状态,文件前面的“+加号”变成了“锁”,表示文件已经成功纳入了版本库。

 

 

三、浏览版本库

 

1)准备工作,我们在版本中添加修改2个文件,然后提交2次。

 

2)如何查看历次提交记录?请打开“Git”菜单中的“Browse”命令

 

出现提交历史窗口——

 

窗口中显示了总共三次提交,在提交历史中右键,可以看到相关的操作,比如分支、标签(tag)等……

 

 

如果在项目中右键,然后点击右键菜单的“Git - History

 

还可以图形化的查看提交历史

 

 

 

四、同步到远程服务器

 

因为 git 是分布式版本系统,每个人在自己本机上,都有一个 git 版本库的拷贝,为了和远程其他版本库同步,需要进行同步操作。

 

同步操作分成两种,一种是 pull 拉取,一种是 push 推送。

 

下面,我们将项目推送到 github 我们注册的项目上去。

 

1)我们点击 如下图的“Push”命令

 

 

出现推送窗口,接下来点击“管理远程”,进行 github 项目的添加操作——

 

 

出现远程管理窗口,请依次填写

“名称”、

Url地址”(一般是 git@github.com:yourName/yourProject.git 格式)

浏览“私钥文件”(你用 PuTTY 生成的 .ppk 文件)

“加载SSH密钥”,

 

然后测试连接,最后“保存”

 

系统开始抓取远程信息,成功之后,请切换到“默认拉取行为(获取以及合并)”,在右侧“远程档案库”下拉框中选择“origin”,“默认合并”中填写“master”,最后点击“保存”

 

 

 

2)请关闭“远程档案库”窗口,再关闭“推送”窗口并重新打开(即重启“推送”窗口),会发现刚才设置的 gihub 远程库 origin 已经自动填充了——

 

 

点击“推送”命令,开始推送,根据网速不同,可能需要几秒或几分钟时间,请耐心等待,最后会提示推送成功。

 

此时访问 github 网站,会看到你新推送的项目内容。

《vs中git基本操作图解1》在这里:http://www.wojilu.com/Forum1/Topic/2237 本文是第二部分。

------------------------------------


五、文件管理


【删除文件】

 

 vs 中,因为有插件的支持,所以可以直接删除;删除之后,需要提交一下。提交的时候 git extensions 会将删除操作同步到版本库中。

 

如下图,文件“xxxFile.cs”被删除之后,在 commit 窗口中显示删除标记“—”:

 

说明:如果是在命令行中,请不要直接使用 rm操作,而是使用 git rm 命令。

 

【如何查看被删除的文件?】

 

点击 "Git" 菜单中的 "Browse" 命令,打开提交历史窗口,请点击文件尚未被删除的某个提交,比如下面的 "add class1",然后切换下面的窗口到“文件树”中

 

在文件数中,可以查看当前历史中所有文件。

 

另外,还可以在项目中右键菜单中点击“Git - History”命令,进入相应的“Show Files”窗口中查看文件数。

 

【如何恢复被删除的文件?】

 

在上图中,找到需要恢复的文件,然后右键“另存为”,保存到项目中即可。

 

【移动文件】

 

1)在 vs 中直接移动即可。

 

2)如果被移动的文件是中文名,git extensions 对话框会有bug,需要使用命令行工具。请打开命令行,进入到 .git 文件所在的目录,输入命令——

git add -u .

这个命令,比普通的 "git add ." 多了一个参数 -u,表示将各种变动也添加进来

 

【如何恢复刚做的修改?】

 

在提交窗口中,选中文件,点击“重置选中的文件”,或者右下角的“复位更改”

 

或者在右键中 "Git" ->Undo File Changes

 

【修改最后一次提交信息】

 

对刚才的提交后悔了?想更改最后一次提交?

新增一个提交,并点击上面的“更改最后一次提交”,新的提交信息将覆盖上一次提交。

 

警告:只有当上一次提交尚未push到远程版本库的时候,才可以使用本方法;否则,对上一次提交的修改会引起混乱。

 

七、分支管理

 

 git 中,分支非常简单易用,建议经常创建分支。

 

比如,你有一个实验性的想法,可以创建一个分支去测试,完全不影响正式的代码。

 

再比如,要开发一个新功能,那就创建一个分支专门提交这个功能相关的代码,如果开发完毕,将此分支合并到主分支即可。这种为特定而新开的分支,我们叫“特性分支(Feature Branch)”。它的一个重要优点是:如果新功能不能如期完工,也不会影响主分支的发布。

 

另外在bug修复等方面,git 的分支功能也非常方便易用。可以说,分支功能是 git 最棒的功能之一。

 

1)创建分支

 

 

 

填写“分支名称”,然后点击“创建分支”

 

创建之后,解决方案管理器(Solution Explore 后面显示当前所在的分支,比如下图显示 branch1)

 

2)切换分支

 

注意:在切换之前,记得先提交,以保证尚未提交的文件已经保存到版本库中。

点击Git菜单中的“Checkout branch”命令,

 

 

然后选择需要签出的分支:

 

 

3)合并分支

 

点击下图的“Merge”命令

然后选择需要合并的分支:

合并之后,在你的当前分支中,就会出现目标分支的内容。

 

4)删除分支

 

因为在git中创建分支是很容易、很频繁的事情,所以,当某个分支没有用处的时候,也就经常需要删除。注意,如果分支还没有合并,那么删除分支会导致此分支下的所有commit丢失,所以在删除之前请先合并分支。

 

方法:点击“Git”菜单中的“Browse”,进入git日志列表,在有分支标记的上面右键点击“删除分支”命令:

 

 

5)分支“衍合”(rebase,又叫“变基”)

 

将一个分支在master上衍合,会执行如下步骤:

• 此分支中所有commit都会stash临时缓存;

• 然后删除此分支;

master分支之上重新创建此分支;

• 在新创建的分支上提交刚才缓存的所有commit

在衍合过程中,有可能发生合并冲突,这个往往需要你手工逐个解决。

 

衍合(变基)做法:先进入需要被衍合的分支,然后点击"rebase"命令,在弹窗中 rebase on 后面选择分支,比如在分支 branch1 中选择master分支,表示将branch1衍合到master( rebase on master)

 

 

八、tag 管理

 

 git 中,tag(标签)经常用来标记版本,比如给某个提交打上 "v1.0" tag,以表示这是1.0版本。

 

1)创建tag

 

通过“Git”菜单的“Browse”命令,进入提交(commit)列表窗口,你可以在任意提交(commit)上面右键点击“创建新标签”命令,比如输入“v1.0

 

创建的时候建议一定要勾选“创建带注解的标记”,如下图所示,填写“消息”。因为你打上的tag,别人未必能理解它的意思和目的,有注解的 tag 更加方便协同工作。另外,tag 名称中不允许有空格。

 

2)删除 tag

 

tag 不可以修改和移动,所以如果要修改或移动,请先删除,然后添加一个新的 tag

删除方法:在 tag 上右键点击“删除标签”即可。

 

 

3tag 推送

 

在向远程服务器 push 推送数据的时候,默认状态下,tag 不会被推送,你需要进入“推送标签”(如下图所示),然后勾选“强制推送”,才能将 tag 推送上去。

注意:tag 一旦推送到远程服务器,就不要再改动,因为有可能导致一个相同的 tag 在不同用户那里含义不同,造成混乱。

 

4)在 github 中提供下载

 

Github 非常体贴,只要是打上 tag 的,都自动打包,提供下载。如下图,我给 wojilu 托管之后的第一个commit打上了 "v1.8.5"  tag,在 github 中,其他人就可以直接下载这个版本了。

 

 

下载之后,用vs2010打开即可调试运行。

 

 

九、冲突合并

 

在分支合并的时候,往往发生内容冲突,大多数情况下 git 都会帮你自动合并,省掉很多麻烦。

但有些时候,git 无法处理,需要你手工解决。

 

一般有三种类型的冲突,需要你手工处理:

一个被删除,一个被修改

会提示你:选择修改的文件,还是删除的文件?

一个被删除,一个新创建

会提示你:选择创建的文件,还是删除的文件?

在两个分支中分别作了不同的修改

会提示你:使用 merge 工具手工修改冲突

 

下面简单介绍一下如何使用合并工具 kdiff3

 

比如在分支合并中,如果有冲突,会出现弹窗提醒

 

点击“是”,出现如下合并工具窗口,请选择右上角的“Open in kdiff3

 

kdiff3在启动的时候,也会出现一个弹窗

 

请点击“OK”,然后出现kdiff3的主窗口

 

屏幕上有四个窗口,上面三个,依次是 base/local/remote窗口,下面是output窗口

窗口

Base

需要合并的两个文件的最近的共同祖先版本

窗口

Local

当前分支文件

窗口

Remote

需要合并的另外分支的文件

 

Output

合并之后的文件

 

合并方法:在Output文件中的冲突区域,右键选择A/B/C的相应内容。

 

选择之后,如果不满意,还可以在冲突区域直接编辑输入

 

修改之后,保存并退出即可。

 

补充说明:需要注意的是,有些冲突是逻辑上的冲突,是隐含的,工具无法自动侦测出来。比如你修改一个函数的返回值,使得他的含义变化;而别人是使用这个函数的,那么,当你修改之后,别人的程序也许无法正常运行,但工具并不能发现这种逻辑上的冲突。这个当然不是合并工具的问题,它需要的是程序设计者思维的谨慎周密。

posted @ 2011-11-16 09:58  掷鸡蛋者  阅读(17461)  评论(41编辑  收藏  举报