不好意思放错片子了。。。同样是搭讪,今天来聊聊如何与GitHuber
的"搭讪"艺术。附上封面图补偿一下。。。
撸码多年一直使用开源社区提供的各种好用的库,save me time
如果能回馈下社区也是件极好的事情。最近使用项目搞定时任务白嫖了一个gocron
库,使用过程发现了个小bug,遂起意回馈社区发个PR,但是第一个处女PR,因为没搞清楚PR的规范,导致整个PR搞了好几天 估计也让project reviewer feel trouble
故而有了这篇文章
总的来说一个完整PR的一个相对标准的流程包括:
- 创建fork
- 撸代码
- 发起pull request
- merge pull request
整个PR的流程 主要涉及两个角色代码贡献方和项目管理者。
roles.png
代码贡献方
通常作为贡献方我们想要给开源项目作出些贡献,可能主要分三个方面
- 报告bugs
- 好的idea希望贡献给社区
- 希望开源项目支持一些功能
无论上述哪一点儿,我们最好提出前search&&check下是否已经存在issues
。bug最好提供复现步骤,出现问题的设备信息 库版本信息,以及提供完善的测试case等等。当然贡献撸代码前最好还是首先仔细阅读下我们想要贡献的开源项目的contributing guidelines
,因为很多开源项目都有严格的代码规范,遵循contributing guidelines
能让我们PR更快通过,也能save our time
。最好结合我们上述的前三个步骤操作即可。
创建Fork
这一步很简单,在github页单击fork
按钮,稍等片刻即可。然后cd
到我们的workspace
目录,执行下面的命令clone
我们fork的工程代码。
git clone git@github.com:USERNAME/FORKED-PROJECT.git
如果我们不是仅仅做一个quick fix
,我们最好让fork
项目和原始的upstream repo
代码库保持一致。要做到这一点,仅需要设置下upstream即可。
# Add 'upstream' repo to list of remotes
git remote add upstream https://github.com/UPSTREAM-USER/ORIGINAL-PROJECT.git
# Verify the new remote named 'upstream'
git remote -v
当我们需要更新远程原始代码库代码到我们fork的工程时,首先你需要fetch
原始上游分支的最新代码
# Fetch from upstream remote
git fetch upstream
# View all branches, including those from upstream
git branch -va
然后,将上游远程代码合并到你的指定分支上,比如master到master
代码语言:javascript复制# Checkout your master branch and merge upstream
git checkout master
git merge upstream/master
merge
过程中,如果没有冲突git
会执行fast-forward
合并。如果有冲突,则遵循上游的更改解决冲突。
撸代码
创建分支
无论什么时候开发新feature
或bug fix
,我们需要养成习惯git checkout -b xxx/xxx
一个新的分支。这样做的好处多多,比如你可以并行工作互不影响等等。
# Checkout the master branch - you want your new branch to come from master
git checkout master
# create a new branch and switch to the new branch
git checkout -b newfeature
然后你就可以开心撸码啦。。。
发起pull request
当你代码撸好,测试case跑完没啥问题,你就可以开始发起pull request
Cleaning Up Your Work
在你提交PR之前,你最好整理下你的分支尽可能保持简洁,这样方便项目维护者进行test
、accept
、merge
。
如果上游分支有了新提交,你需要rebase
你的开发分支,这样merge
代码的时候可以直接fast-forward
不需要解决冲突。
# Fetch upstream master and merge with your repo's master branch
git fetch upstream
git checkout master
git merge upstream/master
# If there were any new commits, rebase your development branch
git checkout newfeature
git rebase master
可能,你在开发时提交历史比较混乱,你可能需要将一些较小的提交整理压缩为更加紧密的commits
。你可以使用交互式的rebase
来进行操作。
# Rebase all commits on your development branch
git checkout
git rebase -i master
上面命令会打开一个对话框,你可以指定commit
进行压缩。
提交commit
当你已经将修改提交并push
到GitHub
,可以到fork的工程GitHub页面,选择你的开发分支然后点击pull request
按钮发起PR。如果之后你的开发分支有新的修改,只需要将改动 push
到GitHub
,更新的内容会被自动追踪。
项目管理者
如果你是一个开源项目管理者,你需要处理上面的pull request
。
Checking Out and Testing Pull Requests
打开.git/config
文件,然后在[remote "origin"]
下新增一行配置:
fetch = refs/pull/*/head:refs/pull/origin/*
然后你可以fetch
并且checkout
任意的pull request
进行测试
# Fetch all pull request branches
git fetch origin
# Checkout out a given pull request branch based on its number
git checkout -b 999 pull/origin/999
**需要注意的是:**这些分支你只能测试而不能进行更新推送修改。
自动merge PR
如果pull request
是一个简单的fast-forward
,你可以在GitHub
页面上通过点击merage
按钮自动进行合并。
手动merge PR
手动merge,你需要从原始代码库checkout
目标分支,从fork工程直接拉取代码,merge分支并推送
# Checkout the branch you're merging to in the target repo
git checkout master
# Pull the development branch from the fork repo where the pull request development was done.
git pull https://github.com/forkuser/forkedrepo.git newfeature
# Merge the development branch
git merge newfeature
# Push master with the new feature merged into it
git push origin master
到这里你已经完成了开发分支的合并,可以选择删除开发分支
代码语言:javascript复制git branch -d newfeature
总结
无规矩不成方圆。希望本文对也有回馈开源社区想法的你能有些许帮助。