在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 | origin |
如果
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
还你一个干净的工作目录