有些服务可以使用 git push 部署,典型的例子就是 github pages. 这里,我就以 github personal pages 为例子,讲讲这种情况。
假设 Jekyll 模板是来自 Alice 的 templete 仓库。在使用这套模板的过程中,难免会需要修复 bug, 添加功能。我希望修复的 bug 能合并到上游,因此,我在 Github 上 fork 了这个仓库。
最后,为了发布 github personal pages, 还需要建立仓库 bob.github.io. 这样,本地的仓库就会有3个 remotes.
开始时,本地仓库的配置和两个 remotes 的情况类似。
然后,我希望每次 push 时,默认 push 到 bob.github.io. 于是我要把 origin 改掉。
注意:这里用的是 github personal pages, 用来生成 pages 的是 master 分支(而不是 gh-pages 分支)。
然后我把新的 post commit 到 master, git push
就可以了。
现在,本地仓库只有两个 remote. 一个是 upstream: alice/templete.git
, 另一个是 origin: bob/bob.github.io
. 现在考虑这个情况:templete 中有个 bug, 我在使用过程中发现了,然后自己修复了,直接提交到 master 分支。现在,我希望把这个 bugfix 提交到 upstream.
按照 github 的工作流,我应该往在 fork 出的仓库中推送一个新分支,然后发起 pull request. 所以,我首先把 fork 出来的 bob/templete.git 添加到 remotes 中。
然后,要在 fork/master 上创建一个新分支:
然后,要把 bugfix 应用到这个分支上,并把这个分支推送到 bob/templete.git. 假设 bugfix 对应的 commit id 为 abcdef.
现在,就可以在 github 上发起 pull request. 等到 Alice 合并后,再同步 templete 的 master.
最后,我希望 bob.github.io 用的模板要跟随上游的更新。考虑到这是个私人性质的 repository, 我可以用 rebase 来修改它的历史。我直接把它 rebase 到新的 upstream/master 上。
在 rebase 前,master 分支和 upstream 分支上都有 bugfix 的 commit. 但在 rebase 的时候,master 分支上的 bugfix 应该会被自动丢弃掉。最后的结果是只有 upstream/master 上的那个 bugfix.
最后,由于使用 rebase 改变了历史,在 push 的时候,需要加上参数 -f
强制覆盖掉远端 repository 的历史。
Posted Wednesday 27 August 2014 Share
- You might also like: