Git rebase 与在功能分支上 rebase master 后合并

sir*_*ver 2 git git-merge git-rebase git-branch

我正在学习变基,并看到了在功能分支上进行变基然后将其合并到主分支中的工作流程(作为示例):

git checkout feature
git rebase master
git checkout master
git merge feature
Run Code Online (Sandbox Code Playgroud)

然而,我看到最后一个命令的另一个类似选项是(而不是“git merge feature”):

git rebase feature
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最后一部分有何不同?结果不会是与 master 之上的功能提交相同的线性时间线吗?

mat*_*att 5

您可能正在学习 rebase,但我认为您还没有完全理解它。

该命令的git rebase xxx意思是:将我现在所在的分支变基到 xxx. 它不会xxx以任何方式改变。

这很令人困惑,因为git merge xxx含义完全相反:它的意思是,合并xxx到我现在所在的分支中。

因此,例如,如果feature从 分离出来master,并且master有一些提交并且rebase有一些提交,则git switch feature; git rebase master更改分离点。这实际上就是它所做的一切

如果我们从这个开始:

A -- B -- C -- D -- E (master)
           \
            X -- Y -- Z (feature)
Run Code Online (Sandbox Code Playgroud)

然后git switch feature; git rebase master结果是这样的:

A -- B -- C -- D -- E (master)
                     \
                      X' -- Y' -- Z' (feature)
Run Code Online (Sandbox Code Playgroud)

(请注意在移动的提交上使用“prime”标记,因为您实际上无法移动提交;这些提交是原始 X、Y 和 Z 的副本。)