【问题标题】:Use git rebase to retroactively make commits land on a different branch?使用 git rebase 追溯性地使提交落在不同的分支上?
【发布时间】:2011-01-14 22:43:18
【问题描述】:

我有一些提交:

 - 1 - 2 - 3 - 4 - 5 (HEAD, master)

之后我注意到提交 2 和 3 真的应该在他们自己的分支上。它们完全独立于提交 4 和 5 我可以使用git rebase 来制作吗?

 - 1 - 4 - 5 (HEAD, master)
    \
     2 - 3 (TestBranch)

最重要的是,Commit 2Commit 3 的 SHA1 是否会与 rebase 之前保持一致?

【问题讨论】:

  • 我已将您的提交列表修改为更标准的图表,就像您将在 git 手册页和整个互联网上看到的那样。如果您更喜欢垂直列表,欢迎您重新编辑它 - 但我建议您颠倒顺序。你在底部有最新的,这与git log 等命令的输出以及gitk 和其他历史查看器中的视图的输出相反。我还假设 Head 实际上是 HEAD,并且您也有一个分支检出;我把它命名为大师。
  • 感谢@Jefromi,让这个问题更容易理解。

标签: git rebase


【解决方案1】:

首先,请注意您想要的 TestBranch 仅指向当前提交 3;除了git branch TestBranch <commit 3> 之外,您无需执行任何操作即可完成此操作。请记住,分支只是提交的指针。这应该可以回答您关于提交 2 和 3 的 SHA1 的问题。您根本没有更改这些提交,因此它们的 SHA1 当然是相同的。

要将当前分支(主分支)放在您想要的位置(提交 1、4、5),您确实会变基。这是其交互模式的一个非常简单的案例。首先,运行:

git rebase -i <commit 1> master     # -i is a synonym for --interactive

Git 将启动您的编辑器,并显示自您的主分支 (2,3,4,5) 上的提交 1 以来的所有提交,以及有关如何操作的一些提示。您只需要删除提交 2 和 3 的行,然后保存并退出。然后它将应用剩下的(4 和 5),让你得到你想要的。当然,如果提交 4 和 5 依赖于提交 2 或 3,那么当 git 在 rebase 期间尝试应用它们的补丁时,您将遇到合并冲突。

请注意,这更改提交 4 和 5 的 SHA1,因为提交的 SHA1 取决于其父项。这会惹恼任何拉过该分支的人。 (您已被警告。)您的实际最终结果将更准确地描述如下:

- 1 - 4' - 5' (HEAD, master)
   \
    2 - 3 (TestBranch)

提交 4' 和 5' 与提交 4 和 5 具有相同的差异,但具有不同的父级,因此它们是不同的提交。

【讨论】:

  • 难道不能使用git rebase --onto &lt;commit 1&gt; TestBranch master 代替交互式变基吗?
  • @Sven:当然,是的。我倾向于推荐交互式的,因为您可以清楚地看到自己在做什么,尽管我个人可能会以非交互方式完成它。
【解决方案2】:

如果您签出3,则可以在此时创建一​​个新分支TestBranch,并获得您想要的分支。

然后你可以回到分支masterrebase it interactivelygit rebase -i HEAD~6,删除他们的行删除23

【讨论】:

  • 为什么要使用交互式变基来创建 TestBranch?您可以直接在提交 3 处创建它。
  • 没错,我错误地认为在 1 和 3 之间存在虚假提交。
猜你喜欢
  • 2017-02-12
  • 2023-01-13
  • 2019-11-17
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2011-05-30
  • 2021-08-20
相关资源
最近更新 更多