Visual Studio C# 利用git和github协同开发时产生冲突的解决办
Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法
- 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料,询问了一些人以后,总结一下,不知道是否完全正确,但基本上可以解决大部分冲突。
- 过程使用工具列表:
- git
- github
- Visual Studio
- TortoiseGit
3. 其中TortoiseGit只是辅助工具,在本次博客中描述的所有利用TortoiseGit进行的操作都可以使用git进行相应的操作,其中的对应关系,在熟练掌握git命令行以后就会明白,这里就不一一介绍了,因为TortoiseGit是图形化界面,所以放在这里易于理解。
1、第一步:拥有个人的Github账号,并创建一个仓库
1.1 在注册成功个人的Github账号以后,可以看到如下界面,点击"New"即创建新仓库,进入下一界面
1.2 进入创建新仓库的界面,接下来就是按照图中的描述,将各信息填完,未说明的部分默认就可以。填完信息以后点击“Create repository”即可。
1.3 接下来会自动进入仓库界面,在这个界面可以对仓库进行一些简单的管理, 这次不介绍其他功能,单纯介绍如何解决协同开发过程中产生的冲突。
2、第二步:协同开发
2.1 这里为了模拟协同开发,我在本地重新创建了两个文件夹,用来模拟两个程序员在合作开发本次项目。
2.2 接下来就是从Github上将仓库克隆到本地的这两个文件夹内。
2.2.1 先复制仓库地址
2.2.2 在test1文件内右击空白处,可以看到“Git Bash here”,点击以后进入git的命令行界面。
2.2.3 接下来按照图片中的介绍克隆远程仓库到本地
文件test2也做相同的操作
这样
2.3 这样两个文件夹内都是最新的仓库的版本。接下来我们创建一下分支。
2.3.1 首先我们先创建一个dev分支,并同步到远程,这个分支是两个人的共同的主开发分支
2.3.2 接下来在两个仓库内为每个仓库都创建一个个人的开发分支,并同步到远程,这里我为test1文件夹里的仓库创建了分支dev-01,为test2文件夹里的仓库创建了分支dev-02,具体操作跟上面创建主开发分支一样
2.3.3 接下来在每个文件夹内都切换至对应的个人分支,在个人分支里进行开发,随后的推送也应该推送到个人的分支,也就是dev-01和dev-02,而不要直接推送至dev分支。
2.4 接下来就是具体的开发过程
2.4.1 先 test1 内添加一个新项目。项目的初始结构如图所示。
2.4.2 接下来就是用git的一系列操作,add-> commit-> push ,这里我用TortoiseGit,
先是添加。
然后会出现一个文件的列表,直接点确定就可以了。然后会出现如下界面
可以直接点确定旁边的提交,也可以点击确定退出这个界面,从右键的菜单中进入提交界面
出现下面的界面,即表示提交成功
接下来,因为我们远端还有一个github替我们管理着仓库,所以我们还要同步到远端的个人分支上
右键菜单中选择“同步”
接下来点击推送即可,这里要注意远端分支是否为个人的开发分支,然后origin的值是否是远端的仓库地址,一般按照前面的操作来,这里的数据就是正确的,如果有错误,可以检查一下这两个值
推送成功后,就会出现如下画面
2.5 接下来是展示一下如何在远端的Github上进行merge的操作。
2.5.1 如图所示,点击 “New pull request”
2.5.2 即使前面没有切换到个人的开发分支,也可以在任意一个分支内点击“New pull request”,按照图片所示,还是可以在下图的界面中切换分支的。点击“create pull request”
2.5.3 接下来点击“Merge pull request”,然后会让你确认一下,继续点击“confirm merge”就可以了
2.5.4 出现如下界面即表示merge成功了
2.6 接下来就是用test2文件夹来模拟另一个人的开发
2.6.1 因为test2的仓库内还没有任何文件,所以先将远程中dev分支内的最新内容拉取下来
2.6.2 如下图所示,选择正确的远端分支,并勾选上“合并”选项,点击确定后,即可进行拉取操作
2.6.3 本来test2 的仓库内是没有任何内容的,成功进行拉取后就会出现相应的文件
2.6.4 打开项目后,并添加一个新的窗体form2
2.6.5 接下来就按照 2.4.2 的步骤操作即可,这里就直接跳到如下图所示的界面,这里我们可以很清楚的看到几个红字,也就是github不能自动合并了,这是为什么了呢?这里我们先来回顾一下我们之前做了什么
首先,我们让test1和test2都处于仓库的最新版本,也就是啥也没有
然后我们在test1和test2的开发过程中切换至各自的开发分支,同步到远端仓库(github)时也是推送到各自的个人分支
然后我们将dev-01的内容成功merge到了dev中,这样应该发现问题所在了把,也就是,test2开发的时候基于的远程仓库版本是什么都没有的,跟test1是一样的,但是test1先于test2 merge到了dev分支中,所以现在的dev已经不是当初的dev了,这个时候如果test2还想要合并的话,在没有冲突的情况下还是可以合并的,但是因为存在了冲突,所以我们接下来进入重头戏,也就是解决冲突。
2.7 解决冲突
2.7.1 首先还是先拉取最新的dev分支的内容到本地test2文件内的dev-02分支上。
按照前面讲述的操作后,会发现出现了如下的界面,提示git 未能顺利结束,并弹出一个提示框,这个的出现很正常,因为你在远端想要合并的时候就已经知道有冲突了,所以在这里自然是不能正常合并成功了。我们需要解决掉冲突文件。这里题外话一句,我们现在拉取的是最新的dev,所以解决了冲突以后,一般来说是可以成功在远端进行merge操作的,至于不一般的情况,暂时本人还没遇到,以后如果有遇到的话再继续补充。
这里直接点击确定就可以啦!
2.7.2 点击确定以后,会继续弹出一个框,点击是可以查看一下变更情况,这里我们点击“是”来展示一下
2.7.3 点击以后出现如下界面,我们可以看到存在一个冲突,这就是我们需要解决的。
2.7.4 首先我们用记事本打开一下这个文件,我们会发现一个神奇的东西,首先要说明一下,这个冲突文件内的格式是xml格式。针对vs 的C#窗体项目来说,这个文件内容出错,是无法正确打开项目的。
红色圈起来的部分就是冲突的部分,
2.7.5 我们在未修改任何东西的情况下尝试打开该项目,会出现这个报错的情况,在我的尝试下,这个的报错,就是上面那个文件内容出错了。
2.7.6 接下来为大家介绍两种解决该冲突的办法
第一种:
第一步:直接删除掉红框内这部分看起来奇奇怪怪的东西,这样删除以后,可以保证项目可以打开,但是聪明的大家肯定会发现,删除掉的是form2的一些内容,所以对form2肯定会产生影响
第二步:我们打开项目发现的确没有看到form2在项目资源里,解决办法很简单,再把form2手动添加一下就可以啦,因为form2的文件是存在的,只是未加载到项目中
第二种:
这一种方法很简单,只有一步,删除掉红线划掉的三行内容即可,这三行是git在合并时自动加上的,用来标注改动的内容,我们需要手动解决这个冲突的原因就在于这,因为自动加了一些内容,所以删除就好了,至于这三行标注中间的内容,就是我们和最新版本不一样的地方,我们需要人为决定是否保留。
删掉三行内容后,项目就可以正常打开了,还可以看见form1和form2。
2.7.7 至此我们就解决了该次冲突,因为本次只是演示,冲突文件只有这一个,其他的冲突大致上解决方法都差不多,代码文件基本上都是可以用记事本打开的,或者有其他的打开软件也可以,如果冲突文件打开以后是乱码,那很有可能这个文件是不应该出现在仓库里的,因为仓库更多地是用来管理代码和一些必要的启动的文件,如果是本地开发工具的自动生成文件,是要忽略掉的,不然非常容易产生解决不了的冲突,这也就是我们为什么在github上创建仓库的时候添加了对应的忽略文件,其他开发过程大多也可以找到相应的忽略文件。
2.7.8 然后我们就继续2.4.2的步骤,依旧是跳过,当然在过程中可能会出现与2.4.2 中不完全一样的内容,随机应变即可,基本上闭着眼睛继续下一步操作就可以了,不需要修改太多的内容,然后一般就可以成功合并了,代码中如果出现这样的情况也一样操作就可以了。
下面展示会出现的一些新界面
然后再推送到远端即可。
2.7.9 接下来就要说一下另一个问题,虽然本地的冲突解决了,但是远程同样也需要推送最新的内容上去,这里可能会出现一个问题就是明明将最新的版本同步到github了,但是实际上github上并没有显示最新的提交,至于为什么会这样,我也不知道了。所以这里再补充一个解决merge冲突的办法;在gituhub端修改冲突文件。具体操作步骤为虽然产生冲突但依旧create pull request -> resolve conflict (这是一行小灰色字体,在之前confirm merge 的那个地方可以找到)
然后就会进入冲突文件的界面,一样进行手动修改就可以了,最后再点击merge,confirm merge即可进行合并操作了。
至此基本上就能解决冲突并且成功合并了。
Visual Studio C# 利用git和github协同开发时产生冲突的解决办的更多相关文章
- Visual Studio Code 使用Git进行版本控制
Visual Studio Code 使用Git进行版本控制 本来认为此类教程,肯定是满网飞了.今天首次使用VS Code的Git功能,翻遍了 所有中文教程,竟没有一个靠谱的.遂动笔写一篇. 请确保你 ...
- 在Visual Studio 中使用git——给Visual Studio安装 git插件(二)
在Visual Studio 中使用git--什么是Git(一) 第二部分: 给Visual Studio安装 git插件 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了, ...
- 在Visual Studio 中使用git——什么是Git(一)
写程序必然需要版本控制,哪怕是个人项目也是必须的,微软从Visual Studio 2019开始默认提供了对Git的支持,Visual Studio 2019之前的版本可以安装相应的插件来实现Git功 ...
- 在Visual Studio 中使用git——使用git管理源代码(三)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 第三部分:使用git管理源代码 ...
- 如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framework.ASP.Net MVC等框架的逐渐开源,也让大家看到了微软开源的步伐.CodePlex 则是 ...
- 跟visual studio 集成的git插件
目前有三个,git extension,微软的 visual studio tools for git extension,还有git source control provider 经测试,最好用的 ...
- [转]如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
本文转自:http://www.cnblogs.com/stg609/p/3673782.html 开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framew ...
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...
- AndroidStudio中利用git下载github或者git.oschina的代码时报错:repository test has failed解决方法
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing AndroidS ...
随机推荐
- Java基础教程:多线程基础(6)——信号量(Semaphore)
Java基础教程:多线程基础(6)——信号量(Semaphore) 信号量 信号量(Semaphore)由一个值和一个指针组成,指针指向等待该信号量的进程.信号量的值表示相应资源的使用情况.信号量S≥ ...
- 玩转CONSUL(1)–WATCH机制探究
1. 前言 consul 经常被用于服务的注册和发现,本文将带你对watch做更深入的探究 2. consul对外暴露了4种通讯接口 2.1 RPC 主要用于内部通讯Gossip/日志分发/选主等 2 ...
- 12、OpenCV实现图像的直方图处理
1.直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度 ...
- 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...
- 2019.10.28 IDEA入门指南(很多人问补充一篇)
Idea快速入门指南 1.安装 1.1.安装 我们使用的是最新的2017.3.4版本: 双击打开, 选择一个目录,最好不要中文和空格: 然后选择桌面快捷方式,请选择64位: 然后选择安装: 开始安装: ...
- java8中常用的新功能
Lambda表达式的用法,并行流.Optional.循环.线程池等
- .NET Core IOC AOP
IOC简介 IOC思想 把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象. 那组件之间的交互怎么处理呢?那最好的方式就是把new ...
- Java基础---Java 数组
数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致. 数组的定义 格式:数组定义格式详解: 数组存储的数据类型: 创建的数组容器可以存储什么数据类型. [] : 表示数组. 数组 ...
- 虚拟环境搭建Django项目
下载虚拟环境包 pip install virtualenv 创建虚拟环境 virtualenv env 进入env文件夹 cd env 进入Scripts文件夹 cd Scripts 启动虚拟环 ...
- 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2
3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...