场景:我已经分叉了一个 github 项目并开始研究它(在将原始项目添加为名为“上游”的远程之后)。在我的 fork 上工作时,上游项目发布了许多版本:v1.3-stable、v1.4-stable、v1.5-experimental 等。现在我需要将上游提交合并到我的主分支,但仅限于特定版本,例如版本 v1.4-stable。这种场景的最佳工作流程是什么?
4 回答
假设 v1.4-stable 是远程标记,您可以通过从包含您的工作的分支调用它来将这些更改应用到本地存储库:
git fetch
git rebase --onto $(git rev-list -n1 v1.4-stable)
Rev-list 从 v1.4-stable 中找到最新提交的 ID,然后重放这些提交,并将您自己的工作整齐地放在最上面。如果您分叉后遥控器发生了显着变化,则会发生冲突。
如果 v1.4-stable 是遥控器上的一个分支,您将想要这样做
git pull --rebase origin v1.4-stable
这假设这v1.4-stable
是一个提交标记,指示发布,在主分支上。结帐大师并提取最新更改:
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
首先确保您在v1.5-experimental
.
其次,将您的 master 分支重置为 upstream/v1.4(确保您没有任何正在进行的工作:硬重置会将它们清除)
git fetch upstream
git checkout master
git reset --hard upstream/v1.4
git push -f
最后,将您的 v1.5-experimental 分支重新设置在 master 之上(即 v1.4 之上)
拳头,激活rerere(以防你以后必须做多次rebase:这将记录你过去如何解决类似的冲突)
git config --global rerere.enabled true
然后 rebase(在 v1.4 之上从您的分支重播您的提交):
git checkout v1.5-experimental
git rebase master
git push -f
您必须解决的冲突应该只有利益冲突(在上游和实验分支中进行的并发修改)。
git pull --rebase origin v1.4-stable