【问题标题】:git rebase a floating branchgit rebase 一个浮动分支
【发布时间】:2021-05-09 14:25:11
【问题描述】:

我基于解决方案 here 导入了另一个 repo 作为分支。

现在,新导入的分支是浮动的,它应该按照图像中指定的方式连接。

我应该如何做rebase?

git checkout imported-branch
git rebase ????? --onto ????

【问题讨论】:

  • f8114ad0ece 是什么关系?例如:你知道f8114a的内容和d0ece的内容完全一样吗?
  • @LeGEC,它们可能是相同的或有最小的变化。

标签: git rebase


【解决方案1】:

你不能得到你画的东西,因为你画了提交哈希 ID:例如f8114a。鉴于f8114a 被绘制为根提交,这意味着f8114a始终是根提交,在过去、现在和将来也是如此。但在绘图的右侧,f8114a不是根提交:它有一个父级d0ece。因此,您声称 f8114a 既是根提交(没有父级)又是常规的日常提交(一个父级,d0ece),这根本不可能。

你也许能够得到你想要的。这完全取决于您想要什么。但是,尝试使用 git rebase 执行此操作通常是一个坏主意:如果您尝试移植到 your 分支之一的提交集中有任何分支和合并操作, rebase 本身将不得不重新执行所涉及的任何合并,这是破坏东西的秘诀。

现在,请记住,任何提交,无论其哈希 ID 可能是什么,以及它可能拥有的任何父哈希 ID,都代表了该提交中包含的文件的完整且完整的快照。所以提交f8114a 一个快照。由于它没有父级(在左侧),Git 将 显示 它作为与没有文件的伪提交的比较。1 所以f8114a 包含添加其所有文件,当被视为一组更改时。

如果你把f8114a 复制到一个新的和改进的?提交——我们称之为f9114a,虽然实际的哈希 ID 可能会有所不同,但我们需要有 something 来调用它2——确实 有一个父提交,但现在git show 和其他将副本与其父级进行比较的 Git 操作 有一个快照进行比较。所以现在,不是添加所有这些文件,差异可能会说删除大部分文件,并创建这些大部分新文件,然后更改大量剩余文件。

如果您觉得可以,那么在您自己的 存储库中很容易实现这一点,而不会发生在任何人将其of 作为您的存储库的任何克隆中。只需将git replace--graft 选项一起使用。详情请见the git replace documentation

一旦您对某些替换感到满意,您可以使用无操作 git filter-repo(或旧但仍受支持,并包含在 Git 发行版中,git filter-branch)来重写从提示可访问的提交的imported-branch。这将“将替换物固定到位”并允许您丢弃移植物;克隆此过滤存储库将生成过滤存储库的副本,该副本不再使用替换技巧。


1从技术上讲,Git 使用 empty tree 来伪造这个伪提交。它将您的提交树与空树进行比较,以生成所有“添加整个文件”差异块。

2如果你愿意,可以称它为 Fred、Barney 或 Wilma; just don't call it late for dinner.

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2012-07-01
    • 1970-01-01
    • 2018-06-22
    • 2021-08-18
    • 2012-09-05
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多