如何以非交互方式压缩具有悠久历史的 git 分支(合并前)?

How to non-interactively squash a git branch with a long history (before merge)?

一些背景知识。

我的公司有一个大型 git 存储库。我们在一个分支上进行开发(希望是短暂的),然后对主分支执行合并(不压缩)。不幸的是,现在我们有一个项目在它自己的分支上存在了几个月。多个开发人员为其做出了贡献,并且它有超过 100 个提交。这些提交中有几十个是来自 master 的合并,它们与我们自己的提交交织在一起。

现在我们想将所有这些代码合并到 master - 但以所有小提交的形式。我们想压扁他们。然而,我们面临来自 DevOps 的反对。合并由工具自动完成,DevOps 坚持认为 git "squash and merge" 操作会导致问题。简而言之,他们不会为我们做任何压缩或变基。我们完全可以丢失我们所有的个人提交历史。但是应该消除任何搞乱 master(或引入错误合并)的可能性。

我们如何在进行合并之前自动压缩拉取请求的提交?

我知道我们可以做到 "git rebase",但这将是一个手动完成所有 100 多次提交的过程。容易出错。对我们来说不够好。

当运行 "git diff" 我可以看到我们分支和主分支之间的所有变化,干净整洁。有没有办法:

  1. 将所有这些更改转化为一次提交;
  2. 自动执行(在此过程中无需人工输入);
  3. 重写分支历史(应该以 master rebasing + 1 个大提交而不是 100 个小提交结束);
  4. 所有在合并之前(不是期间)在分支上完成。

如果你想要的只是一个单一的提交,它具有与 master 的所有差异作为一个单一的提交,你可以这样做:

git checkout the-branch
git merge master -m "get the latest from master"
# set our branch _pointer_ on master, do not change a comma from our working tree
git reset --soft master
# at this point, all the differences between master and the other branch are on index, ready to be committed
git commit -m "single commit with all changes"

大功告成。您的分支是在 master 之上的单一提交,没有麻烦。