当master和branch在当前提交之前时,git rebase到标记上

dee*_*ote 5 git rebase

我和Git有困难.我在本地机器上关注远程仓库.主分支正在从远程更新,我总是与它同步以获取更新.然后我的本地分支("功能"分支)被重新定位到主分支以应用我的本地更改.问题是我忘了将我的本地分支重新绑定到master分支的版本标签上.相反,我重新加入了最新的master分支提交.现在我想将我的本地分支重新绑定到master的版本标记分支而不会丢失我的本地更改.有什么想法怎么做?

                          o -- o
                         /     ^ feature branch
o --- o --- o --- o --- o --- o --- o 
      ^ V2.0                        ^ master (origin/master)
Run Code Online (Sandbox Code Playgroud)

我想像这样重新定义我的"feauture"分支:

        o -- o
       /     ^ feature branch
o --- o --- o --- o --- o --- o --- o 
      ^ V2.0                        ^ master (origin/master)
Run Code Online (Sandbox Code Playgroud)

som*_*ium 11

查看git rebase手册页https://git-scm.com/docs/git-rebase.

远程分支origin/master(假设您的远程称为origin)是上游主站.Rebase的工作原理是选择两个分支之间的共同祖先,然后切掉一个部分:

                          o -- o
                         /     ^ feature branch
o --- o --- o --- o --- C --- o --- o 
      ^ V2.0                        ^ master (origin/master)
Run Code Online (Sandbox Code Playgroud)

注意,这是和C之间的共同祖先.这是git rebase稍后将在我们使用时使用的内容.feature-branchorigin/mastergit rebase origin/master feature-branch

让我们切断以下内容:

                        [ X -- X ]
                         /     ^ feature branch
o --- o --- o --- o --- C --- o --- o 
      ^ V2.0                        ^ master (origin/master)
Run Code Online (Sandbox Code Playgroud)

并将其附加到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
Run Code Online (Sandbox Code Playgroud)

变基

rebase命令将计算origin/master当前分支与当前分支之间的共同祖先.然后它将切断您的分支独有的所有提交.(考虑一下,因为要求对其中的所有内容feature-branch进行重新定义origin/master).现在我们知道我们切断了什么,我们使用它--onto来指定目标.在我们的例子中是标签.

关于rebase的一个很好的解释可以在这里找到