有没有办法将第二个根附加到git中的任意提交?

时间:2018-01-11 12:54:24

标签: git

我们在迁移到git时并没有导入我们的整个历史记录,并且在没有某些文件历史的情况下使某些操作变得困难。我正在考虑使用孤立分支将一些历史记录导入到我们的树中,然后以某种方式将其附加到根节点。那可能吗?我意识到我可以使用合并将它附加到后一个,但我想知道是否可以以某种方式保持原始历史时间轴保持不变。

1 个答案:

答案 0 :(得分:1)

有几个选择。哪个最好取决于您的需求,某些其他用户'相信他们可以告诉你哪个是最好的。

选项1:您可以使用git filter-branchparent-filter 将当前根目录移植到新导入的历史记录中。这是一个"历史重写",因此它需要与所有开发人员协调。我做批量重写的首选方法是:

  1. 每个人都推送他们所有的代码。 (它不必合并,但必须在某个地方的偏远地区。)
  2. 每个人都丢弃他们的克隆
  3. 您导入历史记录并执行重写
  4. 每个人都从重写的回购中创建新的克隆
  5. 当然,这种协调可能对您的团队不切实际。你可以继续进行重写,让每个人都知道他们必须恢复他们所有的分支;但这很乏味,只需要一位开发人员搞砸它就可以撤销你的重写工作。

    还要注意所有提交的内容' ID会改变;因此,即使您可以协调切换,如果您使用这些提交ID(例如,在发布文档中),那么重写可能不是您的最佳选择。

    有关此选项的信息,请参阅git filter-branch文档(https://git-scm.com/docs/git-filter-branch); parent-filter示例涵盖了您的需求。

    顺便说一下,这是最接近" rebase"根本没有任何意义的类型解决方案。除了最简单的历史记录之外,你不能轻易地修改任何历史记录,并且rebase会重新计算每个提交的内容(除了创造错误的机会之外什么都没有,因为你实际上并不想要错误您的提交内容需要更改。

    选项2:您可以使用git replace 来打印"历史的突破。执行此操作的最佳方法是提交一个"重叠&#34 ;;所以导入历史记录直到并包括与当前根相当的提交。

    这避免了历史重写,但它不会在克隆和遥控器之间传播;所以每个用户都必须在每个克隆中本地设置它。我觉得这没关系;您可以在需要时进行设置。但也要注意,有一些与replace相关的已知怪癖/错误。请参阅git replace文档。

    如果追求这个,我会做的是导入历史记录,标记其提示,并在现有的根目录上记下如何在给定克隆中设置替换的说明。

    选项3:合并。在约束条件下,这不是真正选项,但值得指出优缺点。

    如您所知,您可以将导入的历史记录合并到分支提示中。由此产生的历史看起来不太正常,但至少历史将会存在。您必须告诉git --allow-unrelated-histories,并且您将与ours策略合并(因为您实际上并不希望合并更改您分支上的任何内容)。

    这坚持git的基本功能,并且不会重写任何参考资料。历史,所以它简单可靠。但我不会期待以这种方式缝合在一起的历史。恕我直言,将历史记录分开(即使您将旧历史导入与孤儿相同的回购中)也是如此,但同样只有您可以确定利弊对您的团队的影响。