git fork 的仓库如何与原仓库保持同步

Page content

最近阅读golang源码,有时候需要对比不同版本之间的差异,所以fork了一份golang的源码到自己的github仓库,这样可以很方便checkout 到指定的版本,阅读源代码。需要注释源码时,就基于当前的代码切一个分支出来,比如 tt/chore/1.19.5,然后边阅读边写注释。

那如果golang源码仓库有更新,比如 1.20 版本发布了,我该怎么把最新的代码同步到自己的代码仓,方便阅读呢?

先说操作再做解释:

操作

  • 第一步: 添加原始项目(upstream)作为远程仓库

执行 git remote -v

一般的仓库,应该是这种情况

origin	git@github.com:taozhang-tt/go.git (fetch)
origin	git@github.com:taozhang-tt/go.git (push)

fork 的仓库,会是这种情况

origin	git@github.com:taozhang-tt/go.git (fetch)
origin	git@github.com:taozhang-tt/go.git (push)
upstream	git@github.com:golang/go.git (fetch)
upstream	git@github.com:golang/go.git (push)

如果发现没有 upstream,那就执行如下语句设置一下

git remote add upstream git@github.com:golang/go.git
  • 第二步: 获取原始项目的更改
// 获取最新的更改,但并不会合并到你的当前分支
git fetch upstream
  • 第三步: 将原始项目的更改整合到自己的仓库
// 切换到自己仓库的主分支上
git ck master

// 将原始项目的mater分支rebase进来,当然你也可以merge进来
// 这里假设原始项目的主分支是mster
git rebase upstream/master

解释

在 git 中,origin 和 upstream 是远程仓库的默认命名。它们表示了远程仓库的引用,但在不同的上下文中具有不同的含义。

  • origin

    • origin 是默认的远程仓库名称,通常指向你最初克隆或者从中拉取代码的远程仓库。
    • 当你执行 git clone 命令时,git 会自动创建一个远程仓库引用,通常被命名为 origin。
    • 你可以将 origin 视为你的主要远程仓库,是你的代码的默认来源和推送目标。
  • upstream

    • upstream 通常是相对于你的 fork 的原始仓库。当你从一个项目中 fork 出一个副本时,原始项目通常被称为 upstream。
    • upstream 不是默认命名,它更多地是一个通用的概念,可以根据需要为远程仓库命名。
    • 通过将 upstream 设置为远程仓库,你可以从原始项目中获取更新并将你的更改贡献回去。