如果这些是您最近的提交,那么压缩您的提交似乎很容易(使用 Git 将我最后的 X 提交一起压缩)
但是,如果我想压缩我的一些不是最近提交的 repo 提交,HEAD~3
比如HEAD~6
.
有没有办法做到这一点?
如果这些是您最近的提交,那么压缩您的提交似乎很容易(使用 Git 将我最后的 X 提交一起压缩)
但是,如果我想压缩我的一些不是最近提交的 repo 提交,HEAD~3
比如HEAD~6
.
有没有办法做到这一点?
这可以通过进行交互式变基来完成。
如果您master
在 commit有分支A
,然后您my-branch
使用 commits B
、C
、D
、E
和F
. 您想压缩提交B
,C
和.D
B'
确保您当前的分支是my-branch
,并启动交互式变基:
git rebase -i master
这将打开您的编辑器,其中包含将要执行的提交列表。每行代表一个提交,该行的第一个单词表示要在该提交上执行的命令。将第一个提交 ( B
) 保留为pick
,并将接下来的两个提交 (C
和D
) 的命令更改为squash
。保存并关闭编辑器。
在 git 完成处理提交B
、C
和之后D
,将打开一个新编辑器,其中包含新提交的提交消息B'
。这将包含来自原始提交的提交消息的组合,但您可以将其更改为您想要的任何内容。一旦提交消息是您想要的,保存并关闭编辑器。
一旦 git 完成处理分支上的其余提交my-branch
,提交my-branch
将是B'
,E
和F
.
请注意,如果您没有推送您的提交,您应该只做一个变基。变基会改变你提交的哈希值,如果其他人已经提取了原始提交,这将导致问题。
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-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'
。