Git 当 master 和分支领先于当前提交时变基到标签上

Git rebase onto a tag when master and a branch is ahead of the current commits

我在使用 Git 时遇到困难。我在我的本地机器上关注一个远程仓库。主分支正在从远程更新,我总是与它同步以获取更新。然后我的本地分支("feature" 分支)重新基于 master 分支以应用我的本地更改。问题是我忘记将我的本地分支重新定位到 master 分支的版本标签上。相反,我重新定位到 master 分支的最新提交。现在我想在不丢失本地更改的情况下将我的本地分支变基为 master 的版本标记分支。有什么想法吗?

                          o -- o
                         /     ^ feature branch
o --- o --- o --- o --- o --- o --- o 
      ^ V2.0                        ^ master (origin/master)

我想像这样重新设置我的 "feauture" 分支:

        o -- o
       /     ^ feature branch
o --- o --- o --- o --- o --- o --- o 
      ^ V2.0                        ^ master (origin/master)

查看 git 变基联机帮助页 https://git-scm.com/docs/git-rebase

远程分支origin/master(假设你的远程叫做origin)是上游master。 Rebase 的工作原理是在两个分支之间选择一个共同的祖先,然后剪掉一部分:

                          o -- o
                         /     ^ feature branch
o --- o --- o --- o --- C --- o --- o 
      ^ V2.0                        ^ master (origin/master)

注意 Cfeature-branchorigin/master 的共同祖先,这就是 git rebase 稍后我们使用 git rebase origin/master feature-branch 时将使用的内容。

让我们剪掉以下内容:

                        [ X -- X ]
                         /     ^ feature branch
o --- o --- o --- o --- C --- o --- o 
      ^ V2.0                        ^ master (origin/master)

并将其附加到 v2.0。那么让我们开始吧:

git stash          #  move local uncomitted changes away
git checkout feature-branch
git rebase --onto v2.0 origin/master
git stash apply    # reapply uncommitted changes

变基

rebase 命令将计算 origin/master 和您当前分支之间的共同祖先。然后它将切断您的分支所特有的所有提交。 (将其视为 feature-branch 上不在 origin/master 上的所有内容都要求变基)。现在我们知道我们切断了什么,我们使用 --onto 来指定目标。在我们的例子中是一个标签。

可以找到关于变基的很好的解释here