Git将feature_branch中的单个提交移动到master

时间:2014-01-20 11:18:49

标签: git rebase git-rebase cherry-pick

实现这一目标的最简单方法是什么?

从:

--A--B         
      \
       1--2--3 

为:

--A--B--2
         \
          1--3

我无法用任何简单的方法来实现这一目标(少于5步)。

3 个答案:

答案 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>

如果没有冲突,提交将应用于主分支。