Git:基于未被 git 跟踪的旧 commit/tag 合并(或变基)代码的正确方法是什么?

Git: What's would be the correct way of merging (or rebasing) code based on an old commit/tag that was not being tracked by git?

前提:

假设 git 存储库的 master 分支当前标记为 v4.0

在某个时候(几年前)有人克隆了一个 v2.0 标签并对其进行了一系列更改,但没有维护他自己的分支,甚至没有将他的代码保留在 git.

更糟糕的是,最大的问题是他从一个实际上是这个 v2.0 标记的子分支的分支上抓取了一个提交,而那个分支现在已经消失了(一定是 rebase ,不是 100% 肯定)。所以我真的没有确切的共同祖先。

什么有效:

未跟踪代码与 v2.0 之间的差异可以应用 almost (w/some Fuzz) 干净地达到当前提交历史中的某个点(围绕我们的 v2.7 标签),但是在 v3.0 主要内容发生变化(目录移动、文件重命名等)之后,diff 显然在那里停止工作。

因此,可以从当前存储库中的任何内容 v2.0..v2.7 创建分支,以尝试以某种方式 跟踪旧代码。

问题:

将此未跟踪代码正确合并到更接近master的分支的正确方法是什么?

我从来不需要 rebase 任何东西,但是如果我对这个概念的理解是正确的,我会有效地将 master 的分支提交推入我应用差异的新分支(针对 v2.0 era),然后我可以尝试将其合并回 master 分支。

我的 flow/process 从来没有成功过,当 v2.8..v3.0 提交开始弹出时,冲突变得非常难以管理,就好像提交被抓取了 原始克隆(一些补丁失败,因为它们 似乎 已经应用)并且它使一切变得一团糟(或者也许,正如我提到的,我最初选择的共同祖先是错误的)。

如果找到 correct/closest 共同祖先是最重要的,是否有 git 方法 来做这样的事情?我所能想到的就是制作一个脚本,该脚本将计算旧代码与范围内每个提交之间的差异行和 return 产生最小差异的一个提交。

TL;DR

是否有适当的 procedures/methods/tools/alternatives 用于将 分支出来的、未跟踪的、旧的 代码合并到 git 中最近的~ish 分支?

I've never had to rebase anything, but if my understanding of the concept is correct, I would be effectively pushing the master's branch commits into my new branch where I applied the diff (against the v2.0 era), which I can then attempt to merge back into the master branch afterwards.

否:git checkout oldBranch; git rebase master 会在 master 之上重播来自 oldBranch 的提交。

然后,合并回 master 将是一个微不足道的 fast-forward 合并。
但是 rebase 在这里不是一个实际的解决方案(太多的提交要重播,太多的冲突)

Are there proper procedures/methods/tools/alternatives for merging branched-out, untracked, old code into a recent~ish branch in git?.

合并(合并 master 到您的旧分支)比重放大量旧提交(这会为每个重放的提交引入冲突)更可取。

在那次合并中(首先从 master 到您的分支),您将在您的旧分支中单独解决这些冲突一次(以创建稳定的合并提交)。
这并不容易(没有神奇的解决方案可以使旧代码与更新的代码兼容),但至少你正在处理 one 提交(合并提交)到修复。

一旦您对合并工作感到满意,就可以合并回 master