赞
踩
首先得准备两个浏览器和两个 GitHub 账号以便模拟场景。我的账号 Chuntianlaile 是一个用来测试的账号,假定这是项目组长的账号,Manchangdx 是组员的账号。
首先,在组长账号中创建一个仓库,名为 work,在创建仓库时,需要说明以下两个下拉框:
左边的忽略文件下拉框:我们在写代码时,总会出现一些不需要上传到仓库的垃圾文件、缓存文件、备份文件、环境文件等等,可以创建一个忽略文件将这些不需要被上传到远程仓库的文件忽略掉。忽略文件的名字是 .gitignore
,它被放置在仓库主目录下,将不需上传的文件的名字写入其中,Git 就会自动忽略它们。比如这个仓库是用来 Windows 开发的,就在下拉框中选择 Windows,如果这是一个保存 Java 项目的仓库,就选择 Java。这样,在仓库创建成功后,忽略文件就自动出现了,这个忽略文件中有对应的语言或工具中绝大部分通用的忽略规则。当然了,你也可以自己手动增删改。
如果在创建仓库时忘记了选择忽略文件,几个提交后突然想起来,怎么办?GitHub 上有人把忽略文件都做好了,打开链接 github/gitnore,这个仓库里有很多忽略文件,选择你需要的放到自己的仓库即可。
右边的开源许可下拉框:关于开源许可证,不属于本课程所述范围,如有需要大家可以自行搜索。我们的仓库不需要选择这一项。选择这个之后,仓库中会出现相对应的图标,比如上面提到的忽略文件仓库:
在组长账号中创建好新仓库,如下图:
对上图右上角三个按钮进行说明:
现在在组长账号中增加该仓库的合作者,也就是组员:
在浅蓝色输入框中写入组员 GitHub 账号的用户名,选择正确的用户,点击右侧按钮就会发送一封邀请邮件给组员:
点击上图绿色按钮,跳转到下图:
再次点击绿色按钮接受邀请,会跳转到组员访问组长仓库的页面:
点击上图紫色框中的 Fork 按钮,克隆组长的仓库到组员的账号中,完成后自动跳转到下图页面,也就是组员的仓库页面:
切换到组长的 GitHub 页面,在仓库中添加一些项目任务或待解决问题,这些任务就是 issue:
写好任务标题后,可以在右侧指派一位或多位项目参与者来完成,同样 GitHub 也会给被指派者发邮件的(可以在自己的 GitHub 账号上设置拒收哪类邮件):
写好两个 issue,前面说过的,组长仓库里的 issue 不会出现在组员仓库中:
以组员的身份克隆自己的 work 仓库到本地,由于之前已经设置了本地的 SSH 公钥到 GitHub,所以我们使用 git 开头的地址来克隆:
链接的结尾 .git 是不需要的:
现在我们要完成组长仓库的一个 issue,注意每个 issue 在创建后都会生成一个编号,我们首先完成 1 号 issue:
创建文件,添加到暂存区,提交,查看本地仓库分支状态:
注意在执行 commit 命令时,备注信息里有个 “fix #1”,这是必要的,当备注信息中含有此字样的 commit 出现在组长仓库,仓库中编号为 #1 的 issue 就会自动关闭。当然偶尔忘记写这个字样也不要紧的,issue 可以手动关闭,甚至关掉的 issue 还能再开。
完成以上操作,组员的 GitHub 仓库会发生变化,新增一个版本号为 b374 的提交:
接下来,怎么把修改从组员的仓库添加到组长的仓库呢?
这就用到了 pull request 方法,简称 PR。可以理解为这是一个名词性词组,意为 “允许被拉取的请求”,创建一个 PR 就是从甲分支向乙分支提一个请求,该请求中有一个或多个提交,对方觉得可以、没问题,就合并(merge) 这个请求,也就是把请求中所有提交的修改增加到乙分支上,整个过程简称 “提 PR”、“检查合并 PR”。提 PR 既可以在仓库内,也可以跨用户跨仓库。
好,现在我们从组员的 work 仓库 master 分支给组长的 work 仓库 master 分支提一个 PR:
如下图所示,仔细检查紫色框中的内容是否正确,再看绿色椭圆形框中的绿色字样 “Able to merge.”,说明这个 PR 中的修改跟目标分支没有冲突:
从上图还可得知一些信息:该 PR 里有 1 个提交,1 个文件改动,1 个贡献者。点击上图绿色按钮跳转到确认页面,再次点击下图绿色按钮即可完成本次 “提 PR” 工作:
完成后,页面自动跳转到组长的 work 仓库 PR 的合并页面:
该页面只有参与项目协作的成员有权限进入,当前 GitHub 的登录用户是组员,所以可见,且对这个仓库有完全的管理权限,除了删除仓库。当然了,检查合并 PR 的权限也是有的。
重要的一点:提了 PR 之后,一定要求参与项目的其他成员来检查合并,不要自己来,尽管自己有权限。
上图中绿色按钮是个下拉按钮,合并 PR 的方法有三种,分别解释一下:
Create a merge commit
:这种方式会在组长仓库的 master 分支上生成一个新的提交,且保留 PR 中的所有提交信息。这是一种常规操作,用得最多。
Squash and merge
:压缩合并,它会把 PR 中的全部提交压缩成一个。此方法的优点就是让提交列表特别整洁。一个 PR 里有很多提交,每个提交都是很细小的改动,保留这些提交没什么意义,这种情况就使用此方法合并 PR。
Rebase and merge
:这种方法不会生成新的提交,例如 PR 中有 6 个提交,用此方法合并后,组长仓库也会新增 6 个提交。注意,这些提交的版本号与组员的提交不同,此外完全一样。
现在切换到另一个登录组长账号的浏览器,打开合并 PR 的页面,用第一种方法合并:
这就是第一种方式合并的结果,生成了一个新的提交,这个提交里没有修改。因为样子不太美观,这是我最不喜欢用的方式。仔细看上图的 issue,变成了 1 个,也就是说在合并 PR 后,#1 issue 被关闭了。
以上就是一次完整的修改、提交、推送、提 PR、合并 PR 的过程。
需要注意的一点:从 A 向 B 提 PR 后,在 PR 合并或关闭前,A 上所有新增的提交都会出现在 PR 里。
因为组长的 master 分支新增了一个空提交,所以需要让组员的仓库同步组长的仓库,使它们的提交版本一致。
作为组员,要时刻保持自己的 master 分支与组长的一致,以避免在下次提 PR 时出现冲突,该操作叫做 “同步主仓库”,组长的仓库就是主仓库。
提 PR、合并 PR 只能在 GitHub 页面上操作。同步主仓库是要用 Git 本地操作的。现在回到实验环境中操作。首先,使用 remote
系列命令来增加一个关联主机,执行 git remote add [主机名] [主仓库的地址]
,注意,主仓库的地址使用 https 开头的:
如上图所示,主机名是随意定义的,只要不是 origin 就可以,因为自己的仓库地址对应的主机名是 origin,主仓库的主机名通常定义为 up 或 upstream,这个主机名其实就是一个变量,它的值就是仓库地址。
如此说来,关联主仓库后也没什么变化嘛,确实如此,即使地址写错也不会报出来。
现在可以使用前面介绍过的 fetch
命令来拉取主仓库的全部分支信息到本地仓库了,我有时使用这个命令看上一个命令是否有拼写错误:
如何同步主仓库哩?
方法一是执行
git pull --rebase up master
,此命令需联网方法二是执行
git rebase up/stream
,此命令不联网,前提是前面已经执行了git fetch up
这个需要联网的命令,本地已经有了最新的主仓库 master 分支信息。
总结一下:命令git pull --rebase
等同于命令 git fetch
+ git rebase
。现在使用方法二来同步:
同步主仓库已完成。现在可以继续修改提交自己的 master 分支了。然后一并推送到自己的远程仓库。
以上是在自己 Fork 的仓库里进行修改的过程。还有一种常用的方式,就是不用 Fork,直接克隆组长的仓库到本地,然后各自创建自己的分支,在自己的分支上进行修改提交,最后从自己的分支向 master 分支提 PR。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。