当不是你最近的提交时如何压缩你的提交

How to squash your commits when not being your recent ones

如果这些是您最近的提交,那么压缩您的提交似乎很容易 (Squash my last X commits together using Git)

但是如果我想压缩我的回购协议中的一些不是最近的提交怎么办,比如 HEAD~3HEAD~6

有办法吗?

如果您还没有发布分支,您可以重写它的历史而不会产生任何副作用。

假设历史是A-B-C-D-E-F-G-H-I,目标是压扁C-D-E-F-G

git checkout -b squash_branch G
git reset C --soft
git commit
git cherry-pick H I

新的历史记录将是 A-B-S-H'-I'

git rebase -i HEAD~6

然后在交互式编辑器中将 squash(您可以缩写为 s)放在您要压缩的提交前面,并将其他的保留为 pick

示例:

pick 043af87 message
s    8c0fa0e message
s    b6c7116 message
pick c5d91a3 message
pick f20898f message
pick edcbad2 message

这可以通过交互式变基来完成。

如果您在提交 A 时有分支 master,然后您使用提交 BC、[=16= 创建了分支 my-branch ]、EF。您想要将提交 BCD 压缩为 B'.

确保您当前的分支是 my-branch,然后启动交互式变基:

git rebase -i master

这将打开您的编辑器,其中包含将要执行的提交列表。每行代表一个提交,该行的第一个词表示对该提交执行的命令。将第一个提交 (B) 保留为 pick,并将接下来两个提交(CD)的命令更改为 squash。保存并关闭编辑器。

在 git 完成处理提交 BCD 后,将打开一个新编辑器,其中包含新提交 [=22] 的提交消息=].这将包含来自原始提交的提交消息的组合,但您可以将其更改为您想要的任何内容。一旦提交信息符合您的要求,保存并关闭编辑器。

一旦 git 处理完分支 my-branch 上的其余提交,my-branch 上的提交将是 B'EF.

请注意,如果您还没有推送您的提交,您应该只做一个变基。变基会改变你提交的哈希值,如果其他人已经拉取了原始提交,这将导致问题。