【问题标题】:How to move starting point of branch to an older commit [duplicate]如何将分支的起点移动到较旧的提交[重复]
【发布时间】:2023-03-20 01:03:01
【问题描述】:

我想将我的分支重新定位到旧提交上,以排除新提交添加的代码。

我有什么:

A---B---C---D---E master
                 \
                  F---G---H---I---J experiment

我想要什么:

A---B---C---D---E master
     \
      F---G---H---I---J experiment

假设我想在提交 B 时创建我的 experiment 分支,但没有意识到我在 E 上创建了它。当我意识到时,我已经做了很多提交,其中包括我不想要的代码更改(CDE)。

如何将experiment 的起点移动到较旧的提交B

我已阅读 this post,但没有看到任何关于将分支移动到旧提交的有用信息。

【问题讨论】:

  • 这能回答你的问题吗? Change branch base
  • 请注意,分支experiment 的“起点”是并且仍然是提交A。当你变基时你所做的(见eftshift0's answer)是copy提交F-G-H-I-J到新的和改进的不同的提交F'-G'-H'-I'-J',其中F'建立在B而不是E , G' 基于 F' 而不是 F,等等。
  • 提交 A-B-C-D-E 目前在两个分支上,完成后,A-B 将在两个分支上,C-D-E 仅在一个分支上,F'-...-J'完全在另一个。因此,分支没有(有用的)起点,它们只有终点。这就是为什么你必须使用git log B..experimentgit log master..experiment 来限制git log 显示的内容。

标签: git git-branch git-commit git-history


【解决方案1】:

简单:

git rebase --onto B master experiment

该命令的读法如下:git rebase --onto new-base discard-revisions-in-this-history this-is-what-i-want-to-rebase

Git 实际上并不介意基础比您所在的位置新还是旧(可能相当常见的简单示例:backport)。这完全是关于将要重新调整的每个修订版中引入的更改。

【讨论】:

  • 谢谢!在查看了您的答案和 SO 发现的其他答案并更彻底地阅读了man git rebase 之后,似乎更准确的解释是git rebase --onto commit range-start-non-inclusive range-end-inclusive
  • 嗯,也许,这取决于你如何理解这个概念......只要清楚,我没有异议。关于您所说的 range-start-non-inclusive 的唯一一点是,它可能与您的示例中的 E 不同。假设 master 在 E 之上还有另一个修订版,比如Kexperiment 与 E 不同,没有变化)。在那里,您仍然可以使用master(指向K)作为range-start-non-inclusive。这就是为什么我把它读成discard-revisions-in-this-history
  • 非常有趣的一点!我必须进一步消化。
  • 当然。当我说understand 时,我的意思是visualize。我相信你已经明白了。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 2012-11-21
  • 2013-02-20
  • 2020-07-28
  • 2012-02-15
  • 2012-09-22
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多