当不是你最近的提交时如何压缩你的提交[重复]

Posted

技术标签:

【中文标题】当不是你最近的提交时如何压缩你的提交[重复]【英文标题】:How to squash your commits when not being your recent ones [duplicate] 【发布时间】:2017-06-12 02:06:16 【问题描述】:

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

但是,如果我想压缩我的 repo 中的一些不是最近提交的提交,比如 HEAD~3HEAD~6

有没有办法做到这一点?

【问题讨论】:

答案和你引用的问题完全一样 你是对的@ChrisMaes,没有意识到,谢谢 【参考方案1】:

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

如果你在提交A 有分支master,然后你创建了分支my-branch 并提交BCDEF。您想将提交 BCD 压缩到 B'

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

git rebase -i master

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

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

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

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

【讨论】:

那是干净的伙伴,谢谢【参考方案2】:
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

【讨论】:

【参考方案3】:

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

假设历史是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仓库的大小?

如何通过非交互方式压缩除最近提交之外的所有提交来减少臃肿的 Git 存储库的大小?

bootstrap中模态框提交表单成功后,如果不对网页进行刷新,当再次提交表单时会提交重复数据,求解决

将我所有的提交压缩为一个用于 GitHub 拉取请求 [重复]

你如何使用 git format-patch 将提交压缩到一个补丁中?

有没有办法以非交互方式压缩大量提交?