在合并到 main 之前压缩许多推送的提交

Squash many pushed commits before merging into main

在一个大的重构分支中,由于某些 git 缺陷,我被迫提交(如果在提交之前内容更改太多,git 会丢失 track/history 移动文件),这使得存储库中包含不可“构建”的提交。 为了安全起见,我也推送了这些提交(现在,以防万一我生病)。 如果我可以将所有这些压缩到一个提交中,在将 main 合并到我的分支之前或之后(然后返回到 main),那就太好了。 这是它的样子:

main:    x --- x --- x --- x --- x
          \                     /
branch:    x' --- a --- b --- c

最终应该是什么样子:

main:    x --- x --- x --- x --- x --- x
          \                       \   /
branch:    x'--- (manySquashed) --- m

此外,因为重构的中间步骤不感兴趣(整个 before/after 是所有感兴趣的部分),我不需要将许多推送的提交作为单个提交。

在许多帖子中,我找不到针对此特定请求的解决方案(或者我只是不太了解 git - 我是 git 的新手)。

编辑:git 丢失历史解释: 我基本上要做的是将组件的核心功能提取到基础库中,以供类似组件重用。为了不丢失现在转到基本库的许多文件的历史记录(过去 8 年的大量编辑),我将许多文件移动到新文件夹。 files/classes 有一个命名约定,即它们所属的那种标记。当我将 SpecialComponent1 的核心功能移至 BaseComponentLib 时,files/classes 需要调整其名称。我发现在移动文件(尚未提交)后,当我编辑它们时(例如在 类 中应用新名称),git(使用 SmartGit)将“修改”从“重命名”更改为当文件内的更改百分比超过一定数量时,“将变为”未跟踪“。当我看到带有“修改”“重命名”的整个文件历史记录时,带有“未跟踪”的文件历史已经 none 了。我发现我只能在进行任何编辑之前提交移动的文件时解决这个问题(因此我有 cluttered/many 提交)。

要将所有提交 a--b--c 压缩为一个提交,运行 :

git reset --soft x'
git commit