实现此目标的最简单方法是什么?
来自:
--A--B
\
1--2--3
到:
--A--B--2
\
1--3
我想不出任何简单的方法来实现这一点(不到 5 个步骤)。
最佳答案
您遗漏了标签;让我们把它们放回去。这是“之前”:
--A--B <-- master
\
1--2--3 <-- feature
这里是“之后”。我将用勾号(或“主要”或任何你喜欢的称呼)标记它们,因为它们将是原始提交的副本,具有新的和不同的提交 ID。
--A--B--2' <-- master
\
1'-3' <-- feature
这不能一步完成:至少需要两步。
首先,我们必须重新排序 1--2--3
序列,以便 2
排在第一位。最简单的方法可能是交互式 rebase(在分支 feature
上,使用 git 命令 git rebase -i master
):只需更改 pick
order 和 rebase 将 cherry-pick 2,然后 1,然后 3 并移动 feature
标签:
--A--B <-- master
\
2'-1'-3' <-- feature
现在我们只需要移动 master
标签指向提交 2'
。许多命令都会执行此操作,但最简单的是 git merge
指示执行快进 merge (以避免错误):
git checkout master; git merge --ff-only feature~2
为了避免 checkout master
,我们可以使用 git branch -f
,如 VonC's answer (在我编辑这篇文章时出现),例如:
git branch -f master feature~2
(在这两种情况下,我们都需要命名提交 2'
;对于 git branch
,我们必须命名要移动的分支,而对于 git merge
我们必须在要移动的分支上。
为了完整起见,这里有一个不同但等效的方法(使用四个 git 命令)。首先让我们进入分支master
:
git checkout master
现在我们可以挑选提交 2
,创建一个副本,2'
:
git cherry-pick feature^ # or feature~1
生成此图:
--A--B--2' <-- master
\
1--2--3 <-- feature
现在我们可以将 feature
交互地 rebase 到新的 master
上,删除提交 2
:
git checkout feature
git rebase -i master
更改 pick
行以复制 1 和 3 并省略 2,因为提交 2'
已经在 master
上。
关于Git 将单个提交从 feature_branch 移动到 master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232614/