0

如果这些是您最近的提交,那么压缩您的提交似乎很容易(使用 Git 将我最后的 X 提交一起压缩

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

有没有办法做到这一点?

4

3 回答 3

2

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

如果您master在 commit有分支A,然后您my-branch使用 commits BCDEF. 您想压缩提交B,C和.DB'

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

git rebase -i master

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

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

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

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

于 2017-01-26T15:35:34.923 回答
1
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
于 2017-01-26T15:32:36.443 回答
0

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

假设历史是A-B-C-D-E-F-G-H-I,目标是 squash 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'

于 2017-01-26T15:16:51.810 回答