论与美女搭讪的正确姿势

2022-06-29 14:41:48 浏览数 (1)

不好意思放错片子了。。。同样是搭讪,今天来聊聊如何与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的工程代码。

代码语言:javascript复制
git clone git@github.com:USERNAME/FORKED-PROJECT.git

如果我们不是仅仅做一个quick fix,我们最好让fork项目和原始的upstream repo代码库保持一致。要做到这一点,仅需要设置下upstream即可。

代码语言:javascript复制
# 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原始上游分支的最新代码

代码语言:javascript复制
# 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合并。如果有冲突,则遵循上游的更改解决冲突。

撸代码

创建分支

无论什么时候开发新featurebug fix,我们需要养成习惯git checkout -b xxx/xxx一个新的分支。这样做的好处多多,比如你可以并行工作互不影响等等。

代码语言:javascript复制
# 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之前,你最好整理下你的分支尽可能保持简洁,这样方便项目维护者进行testacceptmerge

如果上游分支有了新提交,你需要rebase你的开发分支,这样merge代码的时候可以直接fast-forward不需要解决冲突。

代码语言:javascript复制
# 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来进行操作。

代码语言:javascript复制
# Rebase all commits on your development branch
git checkout 
git rebase -i master

上面命令会打开一个对话框,你可以指定commit进行压缩。

提交commit

当你已经将修改提交并pushGitHub,可以到fork的工程GitHub页面,选择你的开发分支然后点击pull request按钮发起PR。如果之后你的开发分支有新的修改,只需要将改动 pushGitHub,更新的内容会被自动追踪。

项目管理者

如果你是一个开源项目管理者,你需要处理上面的pull request

Checking Out and Testing Pull Requests

打开.git/config文件,然后在[remote "origin"]下新增一行配置:

代码语言:javascript复制
fetch =  refs/pull/*/head:refs/pull/origin/*

然后你可以fetch并且checkout任意的pull request进行测试

代码语言:javascript复制
# 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分支并推送

代码语言:javascript复制
# 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

总结

无规矩不成方圆。希望本文对也有回馈开源社区想法的你能有些许帮助。

0 人点赞