gpt4 book ai didi

git - 如何恢复删除历史记录的分支的 git 历史记录?

转载 作者:行者123 更新时间:2023-12-05 03:26:11 25 4
gpt4 key购买 nike

我有一个包含数百次提交的项目。它是另一个开源项目的分支。在创建 fork 时,git 历史被删除。现在我想重新附加历史。

原始项目有数千次提交,称它们为:A <- B <- C <- D

与此同时,我们的 fork 有:E <- F <- G <- H

分支不共享任何共同的祖先,但提交DE 具有完全相同的文件系统。当E被创建后,git 历史被删除。

如何在不解决 merge 冲突的情况下重新附加它们?

我尝试过的解决方案:

  • git cherry-pick fork/initial..fork/develop - 我尝试从 fork 中挑选更改到原始 repo,但这导致了 merge 冲突。该解决方案尝试线性重放提交,但随着所有分支和 merge 的发生,整个过程中一直存在 merge 冲突。

  • git rebase -i fork/initial fork/develop~0 --onto new-branch - 不幸的是, rebase 而不是 cherry-pick 有与上述相同的问题。它会尝试按顺序重放提交,从而导致 merge 冲突。我也试过 --rebase-merges无济于事。

  • git merge fork/develop --allow-unrelated-histories -- 这是最接近我想要的。它仍然导致了大量的 merge 冲突(出于我不明白的原因?)但我用 git checkout fork/develop -- . 一次性解决了它们和 git commit .这个解决方案的问题是 fork 分支的“初始提交”仍然是接触每个文件的最旧提交,所以我没有得到 merge 这些分支的任何好处。

到目前为止我遇到的所有解决方案都需要我解决冲突。这不是必需的,因为我试图在文件系统相同的地方附加历史记录。

我只想将历史重新附加到它的来源。有什么想法吗?

最佳答案

你可以试试这个

git rebase --onto D E H

那应该将 F、G 和 H 置于 D 之上……嗯,不完全是。当然,那些将是原始修订的复制品。也就是说,假设 E..H 是一条直线。

更新

我创建了一个脚本,可以在另一个修订版之上复制分支的历史记录,实际上没有像 rebase 那样进行任何挑选。它使用来自原始修订的信息即时创建新修订。当然包括 merge 。

https://github.com/eantoranz/git/blob/replay/contrib/replay

单独使用它,所以,如果你想做类似 git rebase --the-real-deal --onto new-base old-base tip 的事情,你可以这样做: ./replay new-base old-base tip.来自问题中给出的示例:./replay D E H。它在 stdout 中打印的单行是您要求重播的 提示 的等效修订的 ID。

关于git - 如何恢复删除历史记录的分支的 git 历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71801465/

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