【问题标题】:How to move git commits common to multiple branches earlier in the main branch history?如何在主分支历史的早期移动多个分支共同的 git 提交?
【发布时间】:2021-09-26 03:38:37
【问题描述】:

我有一个如下所示的 git 存储库:

   /C''-D''-F (featureB)
A-B-C---D---E (main)
   \C'--D'--G (featureA)

我想将常见的提交 CD 移到 main 分支的前面 历史,所以回购看起来像这样:

       /F (featureB)
A-B-C-D-E (main)
       \G (featureA)

需要注意的是,C/C'/C''D/D'/D'' 提交修改代码的方式相同,但是由于位于不同的分支中,它们都有不同的提交哈希。

【问题讨论】:

  • 在所有三个分支中 C 和 D 实际上是相同的确切提交,具有相同的提交哈希吗?如果是这样,则不清楚您的两种情况之间是否存在差异。一个分支实际上只是一个提交列表,例如featureB 在两个示例中都有相同的列表。所以你可能想澄清你的问题。另外:尽量使您的问题尽可能具体;当有很多好的documentation 可供您阅读时,这里没有人愿意坐下来为您写一个通用的git rebase 教程。
  • @Caleb:他们修改代码的方式相同,但三个分支的提交哈希值不同。
  • @Caleb:谢谢,我会澄清这个问题,提到CD 有不同的提交哈希。
  • 最好给它们起不同的名字来说明清楚,通常我们使用C'来指定一个与C基本相同但不完全一样的提交。

标签: git git-rebase git-cherry-pick git-history-rewrite


【解决方案1】:

让我们重新表述一下手头的任务:

我想获取分支的 N 个最新提交的更改,并以它们的父提交变为不同的方式移动/复制它们。

这就是git rebase 允许您做的事情。您可以告诉它要复制的提交范围以及要将其复制到哪个父提交:

git rebase --onto main^ featureA^ featureA
git rebase --onto main^ featureB^ featureB

会将 featureA 和 featureB 的最新提交重新设置为分支 main 的倒数第二个提交。您也可以直接使用提交哈希:

git rebase --onto D D' featureA
git rebase --onto D D'' featureB

【讨论】:

  • 感谢您的回答,@knittl。然而,git rebase main featureA 似乎导致error: could not apply 697g054... G。我认为 git rebase 正在尝试将提交 G 合并到 featureA 的末尾,即使我仍然希望 G 位于单独的分支上,如第二张图所示。有没有办法我们可以修改你的命令来启用它?
  • 我认为@procyon 想重新定位--onto main~1main^(提交D-on-main),而不是main 本身(提交E)。跨度>
  • @torek 你是对的,我选择了错误的目标。让我快速解决这个问题:)
  • knittl,您的最新答案效果很好!感谢您和@torek 重新表述我的问题以表明我的实际意思:)
【解决方案2】:

[C 和 D]...修改代码相同,但在三个分支中具有不同的提交哈希。

在这种情况下,您可能希望首先从两个功能分支中删除 C 和 D 提交,然后重新定位到主分支。您可以使用git rebase -i 做第一部分,对您不想要的提交使用drop 选项。然后(从每个分支)git rebase mainmain 分支的当前状态之上重放每个分支中的提交。

【讨论】:

  • 感谢您的回答,@Caleb。然而,在使用git rebase -ifeatureA 删除CD 之后,git rebase main 似乎会导致error: could not apply 697g054... G。我认为 git rebase 正在尝试将提交 G 合并到 featureA 的末尾,即使我仍然希望 G 位于单独的分支上,如第二张图所示。有没有办法我们可以修改你的命令来启用它?
  • 听起来你遇到了合并冲突; CC'DD' 实际上是否可能完全相同,即使它们实际上是相同的?即使是空白区域的差异也可能是一个问题。在任何情况下,如果存在冲突,您还应该看到有关该问题的消息以及在解决问题后运行git rebase --continue 的指令。运行git status 找出受影响的文件,然后在其中查找合并标记(例如<<<<<>>>>>)。肯定存在关于解决合并冲突的 SO 问题,因此请查看这些问题。
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2015-04-17
  • 2017-09-11
  • 1970-01-01
  • 2015-07-24
  • 2018-05-29
  • 2011-11-08
  • 2015-01-11
相关资源
最近更新 更多