gpt4 book ai didi

git - 如何在过去的两个任意版本之间注入(inject)一个版本?

转载 作者:太空狗 更新时间:2023-10-29 14:42:58 24 4
gpt4 key购买 nike

假设我的本地分支上有以下版本历史:

A -- B -- C

如何在 A 和 B 之间插入新版本 X,以便版本历史如下所示:

A -- X -- B -- C

注意,how to insert a commit in the past 上也有类似的问题然而,在我的例子中有点不同:X 引入的任何更改都不会传播到 B,在版本 X 插入 A 和 B 之后应该保持不变。

最佳答案

如果你想添加提交,但让它对源没有影响,那么是的,你确实需要一个不同于交互式 rebase 的路径。

没有专门为此设计的东西,但使用 git replace 相对容易:

  1. 检查提交 A(作为分离的 HEAD,或在新分支上,但新分支很快将无用):git checkout <hash-of-A>
  2. 提交 X(无论您希望它如何出现)。
  3. 运行 git replace --graft <hash-of-B> HEAD

你现在有这个真实的历史:

  X--B'    <-- refs/replace/<hash-of-B>
/
A--B--C <-- whatever-branch-this-is

这些“替换”对象的特别之处在于,无论何时 Git 将要对几乎任何对象执行几乎任何操作——例如,包括“出于任何目的使用提交”,Git 都会查看是否有 refs/replace/ 名称与对象的哈希 ID。由于 B 的替代品,Git 现在将查找 B'。因此,git log 和其他 Git 命令的作用就好像历史是:

A--X--B'--C

但是请注意,真实历史仍然存在于此存储库中。替换历史当且仅当 refs/replace/ 名称在存储库中——当然是在这个存储库中——并且替换被启用(它是由默认)。但是,如果您将此存储库克隆或推送到其他地方,提取或推送过程通常不会传输任何 refs/replace/ 名称;所以这个存储库的克隆将切换回旧的历史。 (您也可以通过禁用替换来查看原始历史记录,例如使用 git --no-replace-objects log ...。)

如果愿意,您现在可以运行 git filter-branch ,它只是复制提交。默认情况下,git filter-branch 遵循替换规则。这意味着当它复制分支上的提交时,它将从 A 开始,然后复制 X ,然后复制 B' ,然后复制指向 CB'AXB' 的副本将与原件逐位相同,因此实际上将重新使用原件;但 C 的副本会略有不同:它将使用 B' 作为其真正的父级,而不是替代的、嫁接的父级。因此提交 C 将被复制到新的提交 C' 并且分支名称,无论它是什么,都将指向新副本。

这个过滤后的分支有实际(不仅仅是移植的)历史,从 B'XA C' 并通过 B' 返回到 XA

关于git - 如何在过去的两个任意版本之间注入(inject)一个版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46678238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com