Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
如何给开源项目贡献代码

如何给开源项目贡献代码

分两种情况:

  • 代码仓库管理者给你添加该仓库的写入权限,这样的话可以直接push
  • 如果不能直接push(大多数情况),采用经典的fork & pull request来提交代码,下面讲述这种情况

fork & pull request

例如有个仓库https://github.com/ecomfe/esui.git,其采用了经典的分支开发模型,稳定后的代码提交到master分支,其余特性则在dev分支上进行开发,待成熟后合并回master分支。

假如现在需要在其分支3.1.0-dev上提交代码(发现了BUG或者想提交新功能),那么比较简洁的做法如下:

第一步:克隆代码到本地

git clone https://github.com/ecomfe/esui.git

第二步:切换到远程分支3.1.0-dev(远程库默认名字为origin)

git checkout origin/3.1.0-dev

第三步:基于远程分支3.1.0-dev新建本地分支3.1.0-dev(注意远程分支和本地分支的区别,名字一样,但是一个是远程,一个是本地)

git checkout -b 3.1.0-dev

# 也可以这样
git branch 3.1.0-dev
git checkout 3.1.0-dev

第四步:在该分支提交你的更改,然后提交

git commit -m "fix memory leak bugs"

第五步:由于没有直接push到origin的权限,我们需要先对ESUI库进行fork,然后在本地添加一个新的推送地址

git remote add upstream git@github.com:zxhfighter/esui.git

第六步:推送本地分支到自己的ESUI fork库(需要先做合并,因为此时远程分支管3.1.0-dev可能合并了其他代码)

git fetch origin
git merge origin/3.1.0-dev

git push upstream 3.1.0-dev

第七步:这样你的ESUI fork库的3.1.0-dev分支包含了你的最新更改,点击上面的“pull request”就可以推送请求了。注意推送的来源和目的地,如果不对需要点击Edit进行修改,另外可以点击下面的标签file changed查看具体的变动,确认无误后填写pull request的标题和具体内容,点击create pull request绿色按钮推送就可以了

如果评审人员给出了反馈需要继续修正代码,可以从第六步重新开始,这样所有的提交都会显示到同一个pull request中,如果想发起一个全新的pull request,可以拉出一个新的分支,然后重复第六步开始的工作。

@laoyuan

This comment has been minimized.

Copy link

laoyuan commented Jun 11, 2016

人生第一次对开源代码 commit,就照这个来了。这个项目 https://github.com/fenos/Notifynder/pulls

@laoyuan

This comment has been minimized.

Copy link

laoyuan commented Jun 11, 2016

fenos/Notifynder#157
终于搞定了,这个项目的 dev 分支十分古老,所以直接往 master 提交了,所有命令如下:

git clone https://github.com/fenos/Notifynder.git
cd Notifynder
git add .
git commit -m "let replacement access all data like {url}"
git remote add upstream git@github.com:laoyuan/Notifynder.git
git fetch origin
git merge origin/master
git push upstream master
@masongzhi

This comment has been minimized.

Copy link

masongzhi commented Aug 13, 2017

可以转载吗,写的很好

@xayyuu

This comment has been minimized.

Copy link

xayyuu commented Sep 5, 2017

”第五步:由于没有直接push到origin的权限,我们需要先对ESUI库进行fork,然后在本地添加一个新的推送地址

git remote add upstream git@github.com:zxhfighter/esui.git“

这里有点不懂。git remote这一个命令,执行了两个操作吗?包含:对ESUI库进行fork和在本地添加一个新的推送地址?

@Unixtrong

This comment has been minimized.

Copy link

Unixtrong commented Sep 26, 2017

@xyspurs 「对 ESUI 库进行 fork」应该是在 web 上操作的。

@AgentEric

This comment has been minimized.

Copy link

AgentEric commented Oct 25, 2018

其实你这样做对有些项目是可以的,但是对有些项目不行,因为你如果merge了已经fork的仓库,会产生merge commit,你再pull request的时候,源仓库的管理人员会退回你的request,因为他们想要保持git history干净整洁,你应该用git rebase自己的分支,这样你提交上去后人家才愿意合并(前提是你的改动是已经被接纳)。可以看看github的help页面有详细解释。

@zhiweiyin318

This comment has been minimized.

Copy link

zhiweiyin318 commented Dec 24, 2018

第六最后应该是 git push origin 3.1.0-dev

@morniverse

This comment has been minimized.

Copy link

morniverse commented Feb 3, 2019

其实你这样做对有些项目是可以的,但是对有些项目不行,因为你如果merge了已经fork的仓库,会产生merge commit,你再pull request的时候,源仓库的管理人员会退回你的request,因为他们想要保持git history干净整洁,你应该用git rebase自己的分支,这样你提交上去后人家才愿意合并(前提是你的改动是已经被接纳)。可以看看github的help页面有详细解释。

题主分享的很好,你补充的也很精髓,点赞!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.