【问题标题】:git - move specific commits from develop to feature branchgit - 将特定提交从开发移动到功能分支
【发布时间】:2018-06-07 15:52:36
【问题描述】:

所以,在我们的 git 存储库中,一些提交(现在不是最近的提交)被提交到我们的开发分支中,这应该是在一个特性分支中。他们应该是的分支是在更远的地方制作的。提交最终是针对尚未完成的功能,所以现在我们真的需要将它们从开发分支中移除,以便我们可以返回到有一个正常运行的开发分支。

有没有办法可以将特定提交从开发分支移动到功能分支的开头?不是 100% 熟悉 git,所以如果需要任何其他信息,请询问。

【问题讨论】:

  • 您无法真正移动提交,但您可以创建一个应用相同补丁的新提交,并且您可以创建一个新分支,其头部与当前分支具有相同的树,而无需您尝试删除的提交所应用的更改。您需要阅读 git rebasegit cherry-pick 的文档(可能还有其他一些!)
  • 所以也许这是一些我不确定我是否足够清楚的信息。提交是在开发时进行的,然后在之后创建了功能分支,因此提交已经在两个分支上。那么,这是否是一种将功能分支重新定位到较早提交的问题,然后在开发时挑选提交?

标签: git


【解决方案1】:

首先,通常的免责声明:您想要做的(即从分支中删除提交)是指rewriting history,因此请谨慎行事。

假设你的历史看起来像这样:

A--B--C--D--E develop
         \
          F--G feature

而您想将BCdevelop “移动”1 提交到feature,您可以使用rebase --onto 命令来做到这一点:

git checkout develop
git rebase --onto feature A C
# This will apply commits B and C on top of the commit referenced by "feature"

现在您的历史记录将如下所示:

A--B--C--D--E develop
         \
          F--G--B'--C' feature

请注意,B'C'(读作“B prime”和“C prime”)是新提交,其中包含与BC 的更改相同,但提交ID 不同,因为它们有不同的父级。

此时,您可以通过以下方式从 develop 分支中删除 BC

git rebase --onto A C
# This means rebase the current branch on top of commit A instead of C

这将导致提交 BCdevelop 中不再可访问:

A--D'--E' develop
A--B--C--D
         \
          F--G--B'--C' feature

但是,您仍然拥有基于旧提交 Dfeature,现在已将其重写为 D'。为了解决这个问题,您需要再次将 feature 重新设置在新的 D' 之上:

git checkout feature
git rebase --onto D' D

最终导致:

A--D'--E' develop
    \
     F--G--B'--C' feature

这可能是你想要的。


1) 请参阅 @WilliamPursellcomment,了解在 Git 中“移动”提交的含义。

【讨论】:

    【解决方案2】:

    试试樱桃采摘。使用cherry pick,您可以将另一个分支的选定提交获取到当前分支。

    https://git-scm.com/docs/git-cherry-pick

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 2015-12-22
      • 2017-06-07
      • 2019-07-07
      • 2011-04-12
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多