我想将两个不符合顺序的提交合并为一个。
例如,如果我执行命令git rebase -i HEAD~3
pick 8h47n1f Update documentation and release-notes #a
pick 8n32b7a Implemented some random function #b
pick a73ncj1 Update documentation and release-notes #c在推送之前,我希望将a和c行合并为一次提交。
我目前完成此操作的方法是按以下方式重新排序提交:
pick 8h47n1f Update documentation and release-notes #a
squash a73ncj1 Update documentation and release-notes #c
pick 8n32b7a Implemented some random function #b到目前为止,我还没有看到任何危险的副作用。有人知道我这样做真的能打破什么吗?有没有更好、更安全的方法来完成我想要完成的任务?
发布于 2016-09-22 21:06:27
这是实现这一目标的最佳途径(也是afaik的唯一途径)。您不能做任何不能被恢复的事情(例如,您总是可以根据冲突中止重基进程)。
发布于 2016-09-22 21:40:41
从简单的角度来看,交互式重基(git rebase -i)提供的列表只是一个自动执行樱桃选择的脚本。列表是完全可编辑的,您甚至可以删除所有内容,并编写一个全新的、完全不同的列表。Git将只签出基本提交,然后按照顺序执行列表命令。
有一种方法可以自动重新排序列表中的提交:使用autosquash。来自git-rebase文档:
当提交日志消息以"squash!…“(或"fixup!…”)开头时,而提交的标题以相同的…开头时-i,自动修改重基
pick的todo列表,使标记为挤压的提交在要修改的提交之后立即出现,并将移动提交的操作从pick更改为squash(或fixup)。忽略随后的“修正!”或者“南瓜!”在第一个版本之后,万一您引用了前面使用git commit --fixup/--squash进行的修复/压缩。 只有在使用--interactive选项时,此选项才有效。 如果默认情况下使用配置变量rebase.autoSquash启用了--autosquash选项,则可以使用此选项覆盖和禁用此设置。
在您的示例中,在创建提交c++时,使用git commit --squash <commit-a> (如果提交已经存在,也可以使用--amend )。当git rebase -i发布时(假设您设置了rebase.autoSquash),列表将按您的需要显示。
关于交互式重基的唯一问题是当组合-p和-i选项时。同样,在git-rebase文档中,在Bugs部分中:
--preserve-merges --interactive提供的待办事项列表并不表示修订图的拓扑结构。编辑提交和重新措辞提交消息应该可以正常工作,但是重新排序提交的尝试往往会产生违反直觉的结果。
https://stackoverflow.com/questions/39648255
复制相似问题