Github多人协作

最近有门课程需要几个人一起开发一个项目,此前我们基本都是单干的,多人合作意味着需要及时将我们每个人的代码进行合并,U盘传文件这种方式太慢了,效率不行,而且没法解决两个人同时修改一个文件的问题,这次我们就尝试使用Github来协助开发。下面就来记录一下这次开发遇到的一些问题和解决的方法。

1 前期准备

1.1 Git的安装

从官网下载最新版按照默认安装即可。

此处不多加说明。

1.2 Git常用命令

在此放上一张别人的图。

Github多人协作_第1张图片
Git的详细教程可以参考:廖雪峰的Git教程

2 使用Github进行多人协作

Github的官网:https://github.com

2.1 建立远程仓库

Github多人协作_第2张图片
在Repository Name填上仓库名字。
Description填上这个仓库存的啥,想填就填,不填也行。

这里重点提一下我们在开发的时候遇到的一个坑。

在创建仓库的时候可以看到下面有个 Add .gitignore 按钮。
起初我们并不了解这个文件是做什么用的,所以没留意,默认就是 None 。后面经过了解,该文件的作用就是指示Git忽略项目中的一些文件,比如Android的App开发中,项目文件夹中编译生成的apk,一些跟个人配置相关的文件等等。

血与泪的教训:一开始我们没有添加 .gitignore 文件,将项目中的所有文件全部跟踪了,几个人push了几次以后,pull下来各种冲突。那时候还不知道冲突怎么解决,最后重新建仓库添加 .gitignore 文件。

点开以后就会发现里面有许多语言可以选择,选择自己的开发语言即可。

Github多人协作_第3张图片

建仓库的时候没有选择添加 .gitignore 文件怎么办?

https://github.com/github/gitignore

这个项目里面有全部的 .gitignore 文件,下载下来添加进去自己的项目中即可。

最后总结:多人协作一定要用 .gitignore 把不需要跟踪的文件筛掉。

PS:想创建一个没有名字的 .gitignore 文件直接输入.gitignore是不行的,会提示要输入文件名,在后面再加个.就可以了,即.gitignore.

PPS:要让 .gitignore 文件生效好像还要一条命令,但是我现在想不起来了。

2.2 添加合作者

为了能够一起开发,必须要赋予每个参与本项目的开发者push的权限。

Github多人协作_第4张图片

在仓库Settings页面的Collaborators处,可以根据用户名搜索,添加合作者。

在自己这边点击了Add collaborator以后,Github会给对方发一份邮件到注册的那个邮箱,对方要在邮件中确认以后才算是添加成功。

PS:一开始看了好多教程,都没看到哪个教程有说要确认邮件的,然后我又没有打开邮件提醒,最后在看到官方的文档才发现有邮件这回事。就因为这个废了一下午o(╥﹏╥)o

下面再扯一点摸索过程中了解到的东西。

多人协作其实是分两种的:

  • 第一种是上面提到的,将其他人添加到合作者当中,这样每个人都可以对仓库内容进行修改。适用于一个团队进行开发。
  • 第二种是不需要添加合作者,其他人fork你的仓库,然后他们完成某个功能以后向你提交pull request,你确认以后将其他人的修改合并到自己仓库内。这种情况其他人是无法对你的仓库进行修改的。

最开始我找到的多人协作方式就是第二种,仔细想了想,发现这种方式并不适用于我这种几个人一起现场开发的场景。假如B和C都fork了A的仓库,经过一番修改以后,B向A提交pull request,A确认了以后合并到自己的仓库中,但是Cfork的仓库并不会跟着修改,如果C要进行的操作依赖于B的修改,那C要怎么拿到B的修改呢?我只想到了重新fork A仓库这个方法(有其他方法可以告诉我一下)。那样整个开发过程就需要大量fork操作,这不科学啊,所以这肯定不是我要的方式。这种方式我觉得应该是适用于那种 外部 的合作者来开发某一个功能,就像那些大的开源项目,有人发现个bug,然后fork下来,修了一下,提交pull request,仓库拥有者审核一下,确认没问题就合并,应该就是用于这种场景。

PS:我记得我好像研究这第二种方式研究了一上午,然后发现不对劲。一上午加一下午,对!我一天都在废在这里面了!

2.3 合并冲突

多人协作的重头戏就在这里了。

我不信你们几个人能够一直自动合并而不产生冲突,除非你们团队有十分明确的分工(具体到哪个文件哪个人负责,其他人不许碰)、看见别人多敲了个空格不会去删掉、看见别人单词拼错不会去纠正、看见多余的空行不会去删(好吧,后面三条都是因为我有强迫症)。

冲突怎么产生的?

Git其实是有自动合并功能的,比如A修改了a文件,B修改了b文件,这两个修改互不相干,是可以自动合并的。但是A和B同时修改a文件,两人修改的地方不相同的话有些时候也是能自动合并,如果连修改的地方都相同,那程序就无能为力了,只能够由人来确定到底应该保留谁的修改,这就是冲突。

怎么知道有没有冲突?

看见出现conflict这个词就是有冲突了。没截图,遇到再补上吧。

怎么解决冲突?
找到产生冲突的文件修改即可。

在本地仓库根目录中调出Git Bash界面,输入命令git status,就可以看到哪些文件是被同时修改了。(图略,待补)

至于修改方法,Git Bash那种vim方式我用不惯。我借助了VS Code,用VS Code打开仓库的文件夹,然后你就会惊奇的发现,产生冲突的文件都用紫色标记出来了(在我这个暗主题是紫色的),点开冲突文件以后更是发现冲突的部分还高亮显示出来了,上面还有四个选项:

  • “保留当前更改”:字面意思
  • “保留传入更改”:字面意思(PS:当前更改和传入更改要保留哪个是不固定的,要看你实际情况,比如有a和b分支,a合并到b,a就是传入,b就是当前;b合并到a,b就是传入,a就是当前,最后合并的结果是一样的)
  • “保留双方更改”:有些情况双方的修改也要保留
  • “还有个忘记了”:

(图略,待补)

PS:一开始用VS Code打开冲突文件的瞬间我真的被震惊了,原来VS Code对Git的支持这么友好,有那么一瞬间我想一直遇到冲突2333

3 后记

这次多人合作开发经历在Github这边主要的东西就这么多了,主要就是记录一下踩坑的地方,以后想起再补吧。

你可能感兴趣的:(Git)