实现这一目标的最简单方法是什么?
从:
--A--B
\
1--2--3
为:
--A--B--2
\
1--3
我无法用任何简单的方法来实现这一目标(少于5步)。
答案 0 :(得分:8)
你遗漏了标签;让我们把它们放进去。在"之前#34;
--A--B <-- master
\
1--2--3 <-- feature
这是&#34;&#34;。我会用勾号标记这些(或者#34; prime&#34;或者你喜欢称之为的任何东西),因为它们将是原始提交的副本,具有新的和不同的提交ID。
--A--B--2' <-- master
\
1'-3' <-- feature
这不能一步完成:至少需要两次。
首先,我们必须重新排序1--2--3
序列,以便2
首先出现。最简单的方法可能是交互式rebase(在分支feature
上,使用git命令git rebase -i master
):只需更改pick
顺序,rebase将选择2,然后是1,然后3并移动feature
标签:
--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,因为2'
上已存在提交master
。
答案 1 :(得分:4)
主要是:
--A--B (master)
\
1--2--3 (B)
git checkout B
git rebase -i master # reorder commits
--A--B (master)
\
2--1--3 (B)
git branch -f master 2
答案 2 :(得分:2)
您可以从
获取提交哈希 git reflog
然后去主分公司。</ p>
git checkout master
然后樱桃选择相关的提交
git cherry-pick <commit-hash>
如果没有冲突,提交将应用于主分支。