Git 合并来自特定上游版本的提交

Git merge commits from a specific upstream release

场景:我分叉了一个 github 项目并开始处理它(在将原始项目添加为名为 'upstream' 的远程之后)。在我的 fork 上工作时,上游项目发布了许多版本:v1.3-stable、v1.4-stable、v1.5-experimental 等。现在我需要将上游提交合并到我的 master 分支,但仅限于特定版本,例如,发布 v1.4-stable。此场景的最佳工作流程是什么?

首先确保您在 v1.5-experimental 的专用分支中工作。

其次,将您的主分支重置为 upstream/v1.4(确保您没有任何正在进行的工作:硬重置会清除它们)

git fetch upstream
git checkout master
git reset --hard upstream/v1.4
git push -f

最后,将您的 v1.5-exprimental 分支变基到 master 之上(即 v1.4 之上)

拳头,activate rerere(以防你以后需要做多次rebase:那会记录你过去是如何解决类似冲突的)

git config --global rerere.enabled true

然后变基(在 v1.4 之上从您的分支重播您的提交):

git checkout v1.5-experimental
git rebase master
git push -f

您必须解决的冲突应该只有利益冲突(在上游和您的实验分支中同时进行的修改)。

假设 v1.4-stable 是远程上的一个标签,您可以通过从包含您的工作的分支调用它来将这些更改应用到本地存储库:

git fetch
git rebase --onto $(git rev-list -n1 v1.4-stable)

Rev-list 从 v1.4-stable 中找到最新提交的 ID,之后这些提交被重放,你自己的工作整齐地放在最上面。如果在你 fork 后遥控器发生了显着变化,就会发生冲突。

如果 v1.4-stable 是远程上的一个分支,你会想要做

git pull --rebase origin v1.4-stable

这假设 v1.4-stable 是 master 分支上指示发布的提交的标记。 检查 master 并拉取最新的更改:

git checkout master
git pull --rebase

接下来,在此提交的基础上对您的开发分支进行变基。确保你的工作树是干净的并且你的 HEAD 指向你的开发分支:

git rebase v.14-stable

此命令将更改分支的基础以包括 v.1.4-stable 标记的提交,以及它之前的所有其他版本。

变基前:

o---o---v.1.2---v.1.3---v.1.4---v.1.5-exp  master
     \
      o---o---o  dev

之后:

o---o---v.1.2---v.1.3---v.1.4---v.1.5-exp  master
                           \
                            o---o---o  dev
git pull --rebase origin v1.4-stable