博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用 GitHub Flow 给开源项目贡献代码
阅读量:7128 次
发布时间:2019-06-28

本文共 2898 字,大约阅读时间需要 9 分钟。

前言

是什么?

GitHub 是通过 Git 进行版本控制的软件源代码托管服务。 截止到 2015 年,GitHub 已经有超过 2800 万注册用户和 7900 万代码库。事实上已经成为了世界上最大的代码存放网站和开源社区。

所以,如果你想要给开源项目贡献代码或者翻译文档,学会如何使用 GitHub 来正确地贡献代码是必不可少的。

本文会通过提供一个细化的且简单的 GitHub Flow 的例子,教会你使用正确的方法在 GitHub 上给开源项目贡献代码。

准备工作

  1. 关于 git 的基本操作。
  2. GitHub 网站的账户。
  3. 将示例仓库(https://github.com/golang/go)记录在某处。
  4. 这里我们假设你的用户名为 yourname

Fork

打开示例仓库的 URL,在右上角点击 Fork 按钮后,开始等待完成。

等待的时间视仓库的大小而定。

Fork 完成后,你应该可以在你自己的 GitHub 仓库看到同名的一个项目。

它的 URL 应该为:https://github.com/yourname/go

发现了吗?这里 URL 的变化只不过是将原本的 golang 替换成了 yourname

这个 Fork 后的项目是你自己可以随意修改而不会影响到真正的 go 项目的。下面我们把它称之为子仓库。

在没有示例仓库的 push 权限的情况下,想要做出的修改能够反映到示例仓库,也就是父仓库,还需要做接下来的一些操作。

Clone

把你 Fork 后的子仓库 Clone 到本地。

git clone https://github.com/yourname/go go # Clone 到本地的 go 目录复制代码

Branch

进入仓库目录后,可以使用如下命令创建并切换到 test 分支。

git checkout -b test # 创建并切换到 test 分支复制代码

Commit

在这个 test 分支下经过一些修改后,你需要提交这些修改到本地仓库。

可以使用相关命令:

git add -A # 添加所有文件git commit -m 'Add test' # 提交 commit复制代码

先别急着 push,我们还有个大问题要解决。

Upstream

前面已经说过,在子仓库做的修改是不会影响到父仓库的。同样,在父仓库的更新也不会反映到子仓库来。

在 GitHub,如果你子仓库的进度落后于父仓库还坚持发起 Pull Request,后果只会是被拒绝。

那么问题来了,我们应该如何同步父仓库的更新呢?

答案是:区别于 origin,它是用来向子仓库提交更新的远程仓库;我们添加一个 upstream,也被称为 上游 是专门用来同步父仓库更新的的远程仓库。

在默认情况下,在你 Clone 后的仓库目录里,git 已经自动将 origin 和你的子仓库关联在一起了,也就是 https://github.com/yourname/go

你可以通过如下命令查看。

git remote -vv # 两个 verbose 参数查看远程仓库复制代码

然后,通过如下命令添加这个 upstream,使用这个名字只是约定俗成,你可以用你觉得更好的名字来替换它。

git remote add upstream git@github.com:golang/go.git # 添加 upstream 远程仓库复制代码

现在,我们假设在做出修改后,上游(upstream)已经更新了很多提交。

此时如果对上游的变化视而不见,强行 push 并发起 Pull Request 只会被拒绝。

可以通过如下命令拉取并合并上游的更新:

git checkout master # 切换到默认存在的 master 分支git pull --rebase upstream master:master # 使用 rebase 模式拉取 upstream/master 上的更新# 且与本地的 master 合并。第一个 master 是远程分支,第二个是本地分支。git checkout test # 切换到前面建立的 test 分支git rebase master # 使用 rebase 模式合并本地的 test 和 master 分支复制代码

也可以通过另一种方式:

git checkout master # 切换到 master 分支git fetch upstream master # 获取 upstream 上的 master 分支git checkout test # 切换到 test 分支git rebase upstream/master # 使用 rebase 模式合并本地的 test 和 upstream/master 分支复制代码

总的来说,可以把本地的 master 分支当作一个只负责从上游获取更新的分支,所有本地的改动都不会直接在 master 上面进行。

而是先将上游的 master 和本地的 master 合并,此时,本地的 master 是上游的最新版本;

再通过合并 test 和本地的 master 来完成本地改动的更新。整个过程在未开始合并之前,你的代码更新应该只会出现在 test 分支上。

注意:在使用 git rebase 相关的命令时,需要谨慎应用在已经提交的更新或远程仓库上。

Push

现在,我们已经完成代码的修改、上游的同步更新并且完成了合并。

接下来应该将代码 Push 到子仓库。

git push origin test # 将本地 test 分支的代码 push 到 origin 的 test 分支# 如果该分支不存在则会创建复制代码

这个 push 只会更新子仓库,并不会影响到父仓库。

要将代码贡献到父仓库,还要发起 Pull Request

Pull Request

现代的 GitHub 网站已经为我们发起 Pull Request 做了大多数的幕后工作。下面分别说明两种方法:

  • push 代码后,直接登录到 GitHub 网站,它会智能识别并弹出按钮 Compare & pull request,点击后填写一些信息即可发起。
  • 还有一种方式,在子仓库的页面点击你更新的分支,再点击 New pull Request,点击后填写一些信息即可发起。

接下来,父项目的相关负责人就会审查(review)你的提交,并决定是通过还是拒绝。

  • 当你的提交有问题时,负责人还会让你做出一些修改才给予通过。
  • 当你发现想要对其贡献代码的开源项目已经很久没有更新时,需要谨慎一些。否则会发现在你发起 Pull Request 后无人理会,做了许多无谓的工作。发生这种情况可能是负责人已经放弃了这个项目。

至此,我们已经完成使用 GitHub Flow 向开源项目贡献代码的全部步骤。

扩展阅读

转载于:https://juejin.im/post/5b4611f4f265da0f970d1a0c

你可能感兴趣的文章
centOS 安装mp4box
查看>>
导入org.apache.poi.xssf 读取excel
查看>>
Could not load file or assembly 'System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral..
查看>>
SpringBoot注入Mapper提示Could not autowire. No beans of 'xxxMapper' type found错误
查看>>
教你拉筋的方法
查看>>
WP老杨解迷:如何营造让人花钱的游戏
查看>>
3673: 可持久化并查集 by zky
查看>>
【疑】checkpoint防火墙双链路切换导致丢包问题
查看>>
cobbler setting dnsmasq
查看>>
安全重要还是隐私重要?面部识别技术帮助警方发现枪击案枪手
查看>>
PHP + NGINX 控制视频文件播放,并防止文件下载
查看>>
二叉搜索树
查看>>
ASP.NET Core MVC I/O编程模型
查看>>
Android收起虚拟键盘
查看>>
基于二分查找(折半查找)的时间范围匹配
查看>>
PYTHON1.day10
查看>>
ThinkPHP/---获取今天开始的时间戳与结束的时间戳
查看>>
【OCP-12c】2019年CUUG OCP 071考试题库(79题)
查看>>
Centos 7.0 Linux - 给普通用户加sudo权限
查看>>
OO第二阶段总结
查看>>