Skip to content

Instantly share code, notes, and snippets.

@zxhfighter
Last active April 14, 2024 10:04
Show Gist options
  • Star 78 You must be signed in to star a gist
  • Fork 32 You must be signed in to fork a gist
  • Save zxhfighter/62847a087a2a8031fbdf to your computer and use it in GitHub Desktop.
Save zxhfighter/62847a087a2a8031fbdf to your computer and use it in GitHub Desktop.
如何给开源项目贡献代码

如何给开源项目贡献代码

分两种情况:

  • 代码仓库管理者给你添加该仓库的写入权限,这样的话可以直接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
Copy link

laoyuan commented Jun 11, 2016

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

@laoyuan
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
Copy link

可以转载吗,写的很好

@xayyuu
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
Copy link

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

@AgentEric
Copy link

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

@zhiweiyin318
Copy link

zhiweiyin318 commented Dec 24, 2018

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

@morniverse
Copy link

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

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

@xxjldh
Copy link

xxjldh commented Apr 1, 2019

如何在别人的开源项目中提交自己的Pull Request ?

  1. 先在本地创建一个空文件夹,里面准备放克隆过来的代码. --> 我在本地Downloads文件夹下创建了一个名为 gitMessagekit 的文件夹.
  2. 在"终端"中通过cd命令进入到gitMessagekit文件夹下(将"自己电脑的用户名"换成你自己的电脑的用户名). --> cd /Users/自己电脑的用户名/Downloads/gitMessagekit
  3. 在"终端"输入克隆命令 git clone 开源项目源代码的url. --> git clone https://github.com/MessageKit/MessageKit.git
  4. 进入到克隆所在的文件夹. --> cd /Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit
  5. 用查看命令查看一下开源项目都有多少个分支. --> git branch -a
  6. 找到自己要切换的分支,准备切换分支,在这里我要切换到3.0.0-beta分支. --> git checkout remotes/origin/3.0.0-beta
  7. 基于远程分支新建本地分支(3.0.0-beta),2条命令. --> git branch 3.0.0-beta git checkout 3.0.0-beta
  8. 打开/Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit该路径下的代码,对代码进行修改.
  9. 添加修改. --> git add 你修改的文件
  10. 提交修改. --> git commit -m "fix 某某问题"
  11. 去自己的git仓库,准备fork一下开源项目MessageKit到自己的仓库(repository)中.
  12. 即将关联自己fork过的项目. --> git remote add upstream git@github.com:xxjldh/MessageKit.git
  13. 推送本地的分支(3.0.0-beta)到自己fork过的仓库中,2条命令. --> git fetch origin git merge origin/3.0.0-beta
  14. 在即将提交时出现这样一个错误,git@github.com: Permission denied (publickey).解决办法(https://www.jianshu.com/p/f22d02c7d943)
  15. 最后push自己的分支到自己fork过的仓库中. --> git push upstream 3.0.0-beta
  16. 在开源项目https://github.com/MessageKit/MessageKit.git的pull request中添加自己刚修改过的文件, 点"comment pull request"即可.

@ghostsf
Copy link

ghostsf commented Apr 18, 2019

upstream 添加自己的仓库地址? 什么逻辑 = =
里面好些细节也写得不对 -
还要merge原仓库,不知道有merge commit?

@javakam
Copy link

javakam commented Dec 29, 2020

如何在别人的开源项目中提交自己的Pull Request ?

  1. 先在本地创建一个空文件夹,里面准备放克隆过来的代码. --> 我在本地Downloads文件夹下创建了一个名为 gitMessagekit 的文件夹.
  2. 在"终端"中通过cd命令进入到gitMessagekit文件夹下(将"自己电脑的用户名"换成你自己的电脑的用户名). --> cd /Users/自己电脑的用户名/Downloads/gitMessagekit
  3. 在"终端"输入克隆命令 git clone 开源项目源代码的url. --> git clone https://github.com/MessageKit/MessageKit.git
  4. 进入到克隆所在的文件夹. --> cd /Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit
  5. 用查看命令查看一下开源项目都有多少个分支. --> git branch -a
  6. 找到自己要切换的分支,准备切换分支,在这里我要切换到3.0.0-beta分支. --> git checkout remotes/origin/3.0.0-beta
  7. 基于远程分支新建本地分支(3.0.0-beta),2条命令. --> git branch 3.0.0-beta git checkout 3.0.0-beta
  8. 打开/Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit该路径下的代码,对代码进行修改.
  9. 添加修改. --> git add 你修改的文件
  10. 提交修改. --> git commit -m "fix 某某问题"
  11. 去自己的git仓库,准备fork一下开源项目MessageKit到自己的仓库(repository)中.
  12. 即将关联自己fork过的项目. --> git remote add upstream git@github.com:xxjldh/MessageKit.git
  13. 推送本地的分支(3.0.0-beta)到自己fork过的仓库中,2条命令. --> git fetch origin git merge origin/3.0.0-beta
  14. 在即将提交时出现这样一个错误,git@github.com: Permission denied (publickey).解决办法(https://www.jianshu.com/p/f22d02c7d943)
  15. 最后push自己的分支到自己fork过的仓库中. --> git push upstream 3.0.0-beta
  16. 在开源项目https://github.com/MessageKit/MessageKit.git的pull request中添加自己刚修改过的文件, 点"comment pull request"即可.
    👍

@hz0ne
Copy link

hz0ne commented Jan 8, 2021

感觉这里都没说明清楚问题,命令敲出来的回显也没有

@JE-W7EVS-LABVIEW
Copy link

代码仓库管理者如何给你添加该仓库的写入权限?

@smyle10
Copy link

smyle10 commented Apr 19, 2021

作者是先从原始项目克隆到本地,然后把本地的推送到自己的repo(相当于folk了)。一般人可能喜欢先在 github 网页上 folk,然后再克隆自己 folk 后的 repo 到本地(这样默认情况下你自己的仓库就是 origin 了)
origin, upstream 虽然在 git 眼中只是一个名字而已,但实践中,origin 一般是你直接操作的远程仓库,而 upstream 顾名思义,“上游”显然指代最原始的版本(开源工程中的 upstream 就是这个意思,没有上游,何来下游 ^_^)
作者这里是把自己的仓库设成了 upstream,而把原始项目设置(git clone 时默认配置)成origin,当然你 git 参数写对了也能用,但从命名规范而言不是很合理。

@feng99
Copy link

feng99 commented Jul 30, 2021

第5步 必须用git地址吗? 使用https://github.com/xxx/xxxx.git

https地址可以吗?

@freemedom
Copy link

upstream和origin反了

@Victor-Cooper
Copy link

如果一个merge request已经合入了,想继续提交代码,是要把原来的fork删除然后再fork吗

@freemedom
Copy link

freemedom commented Sep 18, 2023

“要把原来的fork删除然后再fork吗”应该是可以继续用原来的fork分支
也可以选择新fork个分支

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment