将单个Git提交从feature_branch移动到master

7
什么是实现这一目标的最简单方法?
来自:
--A--B         
      \
       1--2--3 

to:

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

我无法想出任何简单的方法来实现这个(少于5个步骤)。

1
结果不再遵循顺序了吗?你确定没有犯错吗? - Willem Van Onsem
变更集 1B 之后添加,它应该如何成为第二个图表上 2 之后的状态?真正的任务是什么? - zerkms
就是这样。我需要从我的功能分支中选择“中间提交”,然后以某种方式将其放入主分支并进行变基。 - svobol13
3个回答

8

您漏掉了标签,让我们把它们放回去。 这是“之前”的样子:

--A--B          <-- master
      \
       1--2--3  <-- feature

这里是“after”。我将用一个勾号(或者您想要称呼的其他名称)标记它们,因为它们将是原始提交的副本,具有新的和不同的提交ID。

--A--B--2'      <-- master
         \
          1'-3' <-- feature

这无法在一步完成:至少需要两步。

首先,我们必须重新排序1--2--3序列,以便先出现2。最简单的方法可能是交互式变基(在分支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的答案中提到的方法(我正在编辑此答案)。
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分支变基到新的master分支上,删除提交记录2:
git checkout feature
git rebase -i master

pick 行更改为复制 1 和 3 并省略 2,因为提交 2' 已经在 master 上了。


做得很好,细节描述得非常好,比我的回答详细多了。+1 - VonC

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

这正是我需要的那么优雅。谢谢! - svobol13

3

您可以从中获取提交哈希

 git reflog

然后切换到主分支。
git checkout master

然后挑选相关的提交

git cherry-pick <commit-hash>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接