Visual Studio C# 利用git和github协同开发时产生冲突的解决办

Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法

  1.   前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料,询问了一些人以后,总结一下,不知道是否完全正确,但基本上可以解决大部分冲突。
  2.        过程使用工具列表:
      • 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即可进行合并操作了。

 

至此基本上就能解决冲突并且成功合并了。

posted @ 2019-08-14 15:30  Luomei  阅读(1764)  评论(1编辑  收藏  举报