最近维护 testerhome 的代码,偶尔会遇到一些 bug fix 的提交。为了避免以前的 merge ruby-china 时发生的冲突地狱,现在策略改为了非 testerhome 特性的提交都尽可能提交到 ruby-china 这个源分支,因此就产生了标题里面的需求:提交单一或者指定的数个 commit 到远程仓库。
因为这个技巧可能以后其他想提交代码到 testerhome 的同学都用得上,所以放到 站务 板块
目前有一个我的个人仓库(后续称为 chjRepo),fork 自 testerhome(后续称为 testerhomeRepo),而 testerhome 的又 fork 自 ruby-china(后续称为 ruby-chinaRepo)。
testerhomeRepo 中有不少 testerhome 自己的提交,而 fork 自这个仓库的 chjRepo 仓库自然也有这些提交。这导致了我在 chjRepo 中直接发起 pr 到 ruby-china 时,github 自动对比两个仓库的 diff 会把 testerhome 自己的提交包含进来。
pr 到 testerhomeRepo:
pr 到 ruby-chinaRepo:
希望达成的目标是 pr 到 ruby-chinaRepo 也能和给 testerhomeRepo 一样的效果。
仔细想想,pr 的原理是对比两个 branch 之间的差异,那么把这两个 branch 差异缩小到只有那个想 pr 的 commit 不就行了?那么可以再 fork 一份 ruby-chinaRepo ,然后在那一个仓库上添加这个提交,再发 pr ?
但去 github 点击 fork 的时候,发现不行。因为 testerhomeRepo 也是 fork 自 ruby-chinaRepo 的,所以 chjRepo 已经被视为是一个 ruby-chinaRepo 的 fork 了。
最后,在万能的 stackoverflow 上得到了启发:http://stackoverflow.com/questions/5256021/send-a-pull-request-on-github-for-only-latest-commit 。虽然不能 fork ,但本地有一个 branch 里面的提交记录和 ruby-chinaRepo 的 master 一致不就行了?
git remote add ruby-china git@github.com:ruby-china/homeland.git
git fetch ruby-china
git checkout -b pr-branch-for-ruby-china ruby-china/master
git cherry-pick aaa
git log
确认提交树只是新增了想加上的提交后,把这个分支提交到远程仓库 chjRepo(默认本地别名为 origin):git push --set-upstream origin pr-branch-for-ruby-china
然后再在 github 上用 pr-branch-for-ruby-china
做 pr ,那么变更树里面就只会有 aaa 这次提交的内容了~