【问题标题】:Change Root of a Branch to another Branch after Rebase变基后将分支的根更改为另一个分支
【发布时间】:2018-01-07 13:25:10
【问题描述】:

我使用 Git 进行版本控制,并且我正在尝试完成一些我不确定是否容易实现的事情。我有一个功能分支feature1.1,其中有一些提交。我也有一个分支似乎关闭了该功能的最后一次提交feature1.2。这是因为feature1.2 依赖于feature1.1,但不一定需要在同一个分支上。

目前,当我变基 feature1.1 时,我最终不得不将 feature1.2 挑选到我变基 feature1.1 后创建的新分支中。

有更好的方法吗?

基本上,我想要这个

                F feature1.2
               /
      C---D---E feature1.1
     /
A---B---G---H---I---J---K master

变成这样

                                      F' feature1.2
                                     /
                          C'---D'---E' feature1.1
                         /
A---B---G---H---I---J---K master

【问题讨论】:

    标签: git branch git-branch reset rebase


    【解决方案1】:

    分支没有根。

    嗯,这有点夸大了。 feature1.1 的根是提交 A。所以说分支没有有用的根会更准确。

    什么是分支是,是指向一个特定提交的指针:feature1.1 指向您标记为E 的提交,其哈希取决于其内容和一直以来的历史到根。这意味着你有两个不同的提交,你都标记了E:一个的父链去D,C,B,...和一个去@ 987654330@, C, K, ...

    git rebase 所做的是将提交复制 到具有不同父哈希 ID(通常也是不同的基本源代码树)的新提交。新的提交很像旧的提交,但又不一样。所以你需要给他们新的名字,比如C'-D'-E'。

    旧的提交会在您的存储库中保留一段时间(默认情况下至少 30 天)。当您将C-D-E 复制到新链时,不会影响原始F。

    现在您需要将F 复制到F'。如果您天真地使用git checkout feature1.2; git rebase feature1.1 进行操作,可能会出现问题:Git 不知道它不应该 复制C-D-E 了。它有C'-D'-E',它可以在新的feature1.1 上看到,但它并不知道这些来自C-D-E。如果提交闻起来足够相似,1 rebase 会注意到它已经拥有它们,并跳过复制它们。但是如果它们在第一次变基期间发生了足够的变化,它会再次复制它们。

    为了防止 Git 甚至查看原始的 C-D-E 链,您需要 git rebase --onto。或者,您可以使用交互式变基:这里 Git 为您提供了一个文件,其中包含要复制的建议提交集,您可以手动删除已复制的提交。

    请记住,任何拥有自己的原始提交副本(与您的原始提交具有相同的哈希 ID)的人都将保留他们的副本。他们也必须安排开始使用 新 副本代替旧副本。如果您是唯一拥有这些功能分支的人,或者如果您的所有合作者都准备好处理这些变基,那么您就可以开始了。否则,您可能会造成他们无法承受的痛苦。


    1实际上,这意味着“如果他们有相同的git patch-id”。

    【讨论】:

    • 谢谢!你是对的,我应该重命名提交,这样他们就更清楚它们并不是真正相同的。但是,在阅读您的答案后,我确实相信 interactive rebase 是我想要使用的。我以前用它来squash 提交,但我没有想到我可以用它来忽略某些提交。谢谢!
    • 您还可以使用git rebase --onto feature1.1 feature1.1@{1} 自动排除原始提交,使用feature1.1 的引用日志。 @{1} 部分仅依赖于对分支名称 feature1.1 的一次更新,因此后退一步的 reflog 指的是复制之前的分支提示提交。
    • 知道了。我会调查一下,虽然有时我还必须对feature1.1 进行更改,而那时feature1.2 变得难以移动。也许您提出的那些解决方案会对我的过程有很大帮​​助。再次感谢!
    • 我从未完成它的工作,但有一种方法可以使用 --fork-point 代码(请参阅 git merge-base --fork-point)让 Git 自动解决这些问题。我不确定这是否是多分支变基脚本的正确 path,但我已经在多分支变基脚本上 start 并且正在考虑使用这种事情的--fork-point 代码。我陷入困境的地方是处理具有复杂拓扑的多个分支。
    • 听起来很有趣。谢谢。
    猜你喜欢
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2019-08-23
    • 1970-01-01
    • 2015-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多