文档章节

详解在visual studio中使用git

李朝强
 李朝强
发布于 2013/05/14 13:03
字数 5124
阅读 282
收藏 5
点赞 1
评论 1

很多人已经在使用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 软件包。

openssh:SSH 客户端,提供 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 改成它自己的,你可以在“全局设置”中改回来。

补充1:git 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)工作目录,就是你在硬盘上操作的这些目录和文件;

2)Git 版本库,就是前面说的 .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 上右键点击“删除标签”即可。

3)tag 推送

在向远程服务器 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窗口

A 窗口

Base

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

B 窗口

Local

当前分支文件

C 窗口

Remote

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


Output

合并之后的文件

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

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

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

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

本文转载自:http://xcodebox.com/2013/04/8688.html

共有 人打赏支持
李朝强
粉丝 80
博文 275
码字总数 138377
作品 0
郑州
产品经理
加载中

评论(1)

夏至如沫
夏至如沫
没有找到这一步 加载SSH密钥
微软 Team Foundation Server 开始支持 Git

开源软件技术在微软的产品中扮演着越来越重要的角色。这个事实越发明显,特别是微软刚刚宣布其产品 Team Foundation Server (TFS) ALM (应用生命周期管理) 平台支持 Git 分布式版本控制系统。...

oschina
2013/02/01
3.7K
7
g4e基础篇#3 Git安装与配置

g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索。 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git 分布式版本控制系统的优势...

leixu
01/09
0
0
完整实现的 C++ 版 Go 语言运行时--tin-project

tin 项目是完整实现的 C++ 版 go 语言运行时。它参考 go 语言运行时,将 go 语言运行时用 C++ 重写了一遍, 让你可以在 C++ 中使用 go 的风格写程序。 平台 Windows XP or later OS X 10.8 ...

mycloudpeak
2017/09/28
137
0
Source Code Control (源代码控制)

XCode XCode支持使用SVN管理代码。 配置XCode: 1. 在Xode的菜单中选择 SCM -> Configure Repositories,填写SVN服务器的信息。 2. 然后选SCM -> Repositories 你就可以Import, Check Out你想...

失足处男的倒霉孩子
2013/12/26
989
0
推荐 7 款好用的 Visual Studio 扩展

本文推荐 7 款好用的 Visual Studio 扩展,简化你的日常开发工作,是时候升级你最爱的 IDE 啦。这里不会列举一些特别流行的扩展,比如 ReSharper 和 OzCode (甚至是 Web Essentials),而是一...

OSC编辑部
2015/10/29
5.4K
13
在Visual Studio Code中配置GO开发环境

一、GO语言安装 详情查看:GO语言下载、安装、配置 二、GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github.com/microsoft/vscode-go 这款...

nothingfinal
04/03
0
0
VS Code 现可作为 snap 包在 Linux 发行版上使用

微软的代码编辑器 Visual Studio Code 在 Linux 上更容易安装了 —— 现在支持通过 snap 包进行安装。此前,你需要从 Visual Studio Code 网站下载 .deb 或 .rpm 文件,这也很简单,但需要较...

局长
2017/05/24
2.4K
21
Unity 5.2 开始支持通用 Windows 平台

今天发布的Unity 5.2增加了部分更新说明,其中包括对Windows10和通用Windows平台的支持。开发者现在可以利用Unity5.2开发Windows Mobile、Windows 10以及XboxOne游戏。除此之外Unity5.2在最近...

oschina
2015/09/09
6.4K
12
oscstudio/git-analyze

Git Analyze tool 在用户使用 git 作为版本控制工具时,可能会将一些体积较大的文件提交到历史记录之中,由于 git 是一个分布式的版本控制系统, 并且基于快照的存储特性,这个时候,用户的存储库...

oscstudio
2016/08/15
0
0
Visual Studio for Mac 正式版发布

微软很早之前就已经开始测试 Visual Studio for Mac Beta 版本,它是一款全功能的开发环境,可帮助 Mac 上的开发人员为移动端、云端和网页打造应用、游戏和服务。它是专门为 macOS 而设计的,...

局长
2017/06/03
4.6K
35

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部