GitHub协作开发流程

在GitHub上发现心仪的项目, 想帮忙添砖加瓦, 搞点贡献, 应该怎么做呢?

Fork

首先第一步,你需要点击星星旁边的fork按钮, 则属于你的公开仓库, 里面的代码与原仓库一样. 以下称原仓库为正式仓库.

这里要说一个为啥要fork. 因为默认情况下, 你是没有正式仓库的写权限的. 也即, 你clone正式仓库后, 本地做的修改, 是无法push的, 会得到类似下面的信息:

remote: Permission to xiangming/landscape-plus.git denied to levy9527.
fatal: unable to access ‘https://github.com/xiangming/landscape-plus.git/': The requested URL returned error: 403

而你fork出来的仓库, 是属于你的, 你可以push.

因此你应该clone你fork出来的仓库, 在本地作修改, 再把提交push到fork仓库

Pull request

假设公开仓库没有修改, 而你fork出来的仓库已经有了一些你的提交, 则你的仓库会有类似这样的提示:

This branch is 1 commits ahead bluehexagons:master.

这个时候可以点击右边的Pull request按钮, 提交一个合并代码的申请.

如果项目原作者同意了, 把你提交的代码合并到了正式仓库, 则你fork的仓库提示会变成类似这样:

This branch is even with bluehexagons:master.

Fetch & Merge

实际上公开仓库在你fork之后, 经常也会有新的提交的, 则你fork的仓库提示会是类似这样:

This branch is 67 commits ahead, 8 commits behind xiangming:master.

你提交的部分可以通过Pull request让公开仓库同步你的代码, 那么公开仓库新增的代码如何同步到你fork的仓库呢?

你需要在本地仓库(对应的origin为fork出来的仓库)作如下操作:

  • git remote
1
2
origin
xiangming

如果git remote只有origin, 则需要先添加远程仓库, 格式如下:
git remote add remote_name remote_url

  • git fetch xiangming master

  • git merge xiangming/master --abort 如果有冲突,就放弃合并, 保持工作目录的干净

我运行上述命令时, 得到的如下信息:

1
fatal: There is no merge to abort (MERGE_HEAD missing).

别担心, 这其实就冲突了, 放弃合并了

这里最好使用fetch+merge, 而不是直接pull, 要不然冲突的话, 就麻烦了

  • git push

合并完代码后, 再把代码推送到fork仓库, 这样就跟公开仓库同步了

当然, 如果直接git pull合并代码时冲突了也不用怕, 最简单的方法是

git reset HEAD --hard

还你一个干净的工作目录

参考资料

Fork me on GitHub