合并后压缩 Git 提交

Squashing Git commits after merging

我有一个功能分支有一些提交(见下文)。自从分支以来,一些提交也被添加到 master 中。

所以我将 master 合并到 feature 分支中。

git checkout feature
git merge master

这导致 feature 分支上的以下日志历史记录:

*    E (HEAD) merging master into feature
|\
| *  D feature commit 2
| |
| *  C feature commit 1
* |  B master commit 2
|/
*    A master commit 1

实际上,功能路径上的提交数量很大 (100+),我想将它们全部压扁。

有没有办法只压缩功能分支上的提交,同时保留 master 行上的提交?

是的,你可以。所以你想把你问题中的提交图变成这个新图:

*    E (HEAD) merging master into feature
|\
| *  D feature commit (squashes 1 and 2)
* |  B master commit 2
|/
*    A master commit 1

程序:

  1. 确保您的工作树是干净的。没有未提交的更改,没有暂存的更改,没有未跟踪的文件。
  2. 确保您在功能分支上。
  3. git reset --hard *Hash of D on feature branch*
  4. git reset --soft *Hash of A on master*
  5. git commit 加上你想要的信息。
  6. git merge master

如果问题仅解决所有提交都存在于本地存储库中的情况,那么问题(除了我的评论)已解决。如果仅涉及语言环境 git 存储库,则它等同于:

git checkout feature
git rebase -i
      // mark all commits to be squashed
git merge master

但是您应该将 masterbranch 重置为 E 以发布您的更改:

git checkout master
git reset --hard feature

或(如果您真的更喜欢与 comitish 一起工作)git reset --hard *Hash of E*。如果 C 已经被推送到远程存储库,我将检查 git reset 的使用是否有效。