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
。
前提:
假设 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
。