你漏掉了标签;让我们把它们放回去。这里是“之前”:
--A--B <-- master
\
1--2--3 <-- feature
这里是“之后”。我会用一个勾号(或“prime”或任何你喜欢的名字)标记它们,因为它们将是原始提交的副本,具有新的和不同的提交 ID。
--A--B--2' <-- master
\
1'-3' <-- feature
这不能一步完成:至少需要两步。
首先我们必须重新排序1--2--3 序列,以便2 排在第一位。最简单的方法可能是交互式 rebase(在分支 feature 上,使用 git 命令 git rebase -i master):只需更改 pick 顺序,rebase 将选择 2,然后 1,然后 3 并移动 @987654329 @标签:
--A--B <-- master
\
2'-1'-3' <-- feature
现在我们只需要移动master 标签指向提交2'。许多命令都会这样做,但最简单的是 git merge 指示进行快进合并(以避免错误):
git checkout master; git merge --ff-only feature~2
为了避免签出master,我们可以使用git branch -f,如VonC's answer(在我编辑这个时出现),例如:
git branch -f master feature~2
(在这两种情况下,我们都需要将提交命名为 2';对于 git branch,我们必须命名要移动的分支,而对于 git merge,我们必须 on 来移动要移动的分支)。
为了完整起见,这里有一个不同但等效的方法(使用四个 git 命令)。首先让我们进入分支master:
git checkout master
现在我们可以挑选提交2,创建一个副本2':
git cherry-pick feature^ # or feature~1
生成此图:
--A--B--2' <-- master
\
1--2--3 <-- feature
现在我们可以以交互方式将feature 重新设置为新的master,放弃提交2:
git checkout feature
git rebase -i master
将pick 行更改为复制1 和3 并省略2,因为master 上已经存在提交2'。