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

标签 git rebase git-rebase cherry-pick

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

来自:

--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/

相关文章:

git - 无法登录gitlab

git - 忽略特定文件夹(和所有子文件夹)以外的文件类型?

git - "git reflog show <ref>"应该显示什么?

git - 如何在冲突的 Git rebase 中获取 "their"更改?

git - 使用上游分支重新设置本地分支

git - .git/sequencer 目录是什么?

Git:另一个失去一切的例子?

git - 没有冲突的 merge 是否等同于没有冲突的 rebase ?

git - 使用 cherry-pick 或 rebase --onto 选择一系列提交最终会得到相同的结果吗?

git - 整个分支 rebase 后如何更新标签?