git 跨 repo 操作

如果使用了一个开源的项目,并且基于这个项目开发了自己的分支,同时又希望把改动反馈到社区,就会遇到在跨 repo 操作的问题。

将 github 项目导入 gitlab

使用开源项目,通常需要把开源项目导入到自己公司的 git ,操作方法见 将github项目导入gitlab

这里的示例情况如下,origin 是公司私有的 repo,upstream 是开源社区的 repo:

$ git remote -v
origin      http://gitlab.xxxx.cn/infrastructure/ingress-nginx.git (fetch)
origin      http://gitlab.xxxx.cn/infrastructure/ingress-nginx.git (push)
upstream    https://github.com/kubernetes/ingress-nginx.git (fetch)
upstream    https://github.com/kubernetes/ingress-nginx.git (push)

添加另一个远程仓库

如果要把改动贡献给开源社区,需要在 github 上 fork 原始项目,通过这个 fork 的 repo 提交 pr。

将 fork 的 repo,作为远程仓库加入:

git remote add lijiaocn https://github.com/lijiaocn/ingress-nginx.git 

加入后,一共有三个远程仓库,分别是 github 上的 fork 分支(lijiaocn)、原始的项目(upstream)、公司私有分支(origin):

$ git remote -v
lijiaocn    https://github.com/lijiaocn/ingress-nginx.git (fetch)
lijiaocn    https://github.com/lijiaocn/ingress-nginx.git (push)
upstream    https://github.com/kubernetes/ingress-nginx.git (fetch)
upstream    https://github.com/kubernetes/ingress-nginx.git (push)
origin      http://gitlab.xxxx.cn/infrastructure/ingress-nginx.git (fetch)
origin      http://gitlab.xxxx.cn/infrastructure/ingress-nginx.git (push)

添加之后,还要把新的远程仓库的内容拉取到本地:

$ git fetch lijiaocn

然后才能够看到新远程仓库 lijiaocn 中的分支:

$ git branch -r
  lijiaocn/gh-pages
  lijiaocn/master
  upstream/HEAD -> upstream/master
  upstream/gh-pages
  upstream/master

创建跟踪另一个远程仓库的分支

$ git branch lijiaocn_master lijiaocn/master
$ git branch -u lijiaocn/master lijiaocn_master (不是必须)
$ git branch -vv
  lijiaocn_master 846ff0036 [lijiaocn/master: ahead 167] Merge pull request #4560 from Shopify/basic-auth-map
* master          846ff0036 [origin/master: ahead 165] Merge pull request #4560 from Shopify/basic-auth-map

将远程仓库 A 中的更新 rebase 到远程仓库 B 中

这里将远程仓库 upstream 中的更新同步到 lijiaocn_master 分支中:

$ git remote -v
lijiaocn    https://github.com/lijiaocn/ingress-nginx.git (fetch)
lijiaocn    https://github.com/lijiaocn/ingress-nginx.git (push)
upstream    https://github.com/kubernetes/ingress-nginx.git (fetch)
upstream    https://github.com/kubernetes/ingress-nginx.git (push)

采用 rebase 的方式,合并过程如下:

$ git fetch upstream    # 将 upstream 的更新同步到本地
$ git rebase upstream/master lijiaocn_master

将另一个分支中的特定 commit 提交到当前分支

$ git checkout lijiaocn_master
$ git cherry-pick 800e5fe9dc852fb0 (800..是另一个分支中的 commit)

将本地分支推送到另一个远程仓库的 master 中

$ git checkout lijiaocn_master
...进行了一些改动 ...
$ git commit -s -m "提交..."
$ git push -u lijiaocn HEAD:master     # 推送到远程仓库 lijiaocn 的 master 分支中

参考

  1. 李佶澳的博客