如果这些是你最近提交的(Squash my last X commits together using Git)
,那么压缩你的提交似乎很容易但是,如果我想要压缩我的回购的一些不是最近的回复,请HEAD~3
向HEAD~6
说明。
有办法做到这一点吗?
答案 0 :(得分:2)
这可以通过进行交互式rebase来完成。
如果您在提交master
处有分支A
,那么您创建了分支my-branch
,其中包含提交B
,C
,D
, E
和F
。您希望将提交B
,C
和D
压缩到B'
。
确保您当前的分支是my-branch
,并启动交互式rebase:
git rebase -i master
这将打开您的编辑器,其中包含将要执行的提交列表。每行代表一次提交,该行的第一个单词表示要对该提交执行的命令。将第一次提交(B
)保留为pick
,并将接下来两次提交(C
和D
)的命令更改为squash
。保存并关闭编辑器。
git处理完提交B
,C
和D
后,将打开一个新编辑器,其中包含新提交B'
的提交消息。这将包含来自原始提交的提交消息的组合,但您可以将其更改为您喜欢的任何内容。一旦提交消息成为您想要的消息,请保存并关闭编辑器。
git完成处理分支my-branch
上的其余提交后,my-branch
上的提交将为B'
,E
和F
。< / p>
请注意,如果您没有推送提交,则应该只进行rebase。重新定位将改变提交的哈希值,如果其他人已经撤消了原始提交,则会导致问题。
答案 1 :(得分: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
答案 2 :(得分:0)
如果您尚未发布分支,则可以重写其历史记录而不会产生任何副作用。
假设历史记录为dateTo
,目标是压缩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
。