是否有正确的方法来组合两个不按顺序的提交?

时间:2016-09-22 20:24:16

标签: git

我想将两个不合规的提交合并为一个。

例如,如果我执行命令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

到目前为止,我没有目睹任何危险的副作用。有谁知道我是否可以通过这样做真的打破一些东西?是否有更好,更安全的方式去做我想要完成的事情?

2 个答案:

答案 0 :(得分:3)

这是实现它的最好方式(也是唯一的方法)。你无法做任何无法恢复的事情(例如你总是可以在冲突时中止变革过程)。

答案 1 :(得分:2)

交互式rebase(git rebase -i)提供的列表,在一个简单的视图中,只是一个自动执行cherry-picks的脚本。该列表是完全可编辑的,您甚至可以删除所有内容并编写一个全新且完全不同的列表。 Git只会检查基本提交,然后按顺序执行list命令。

有一种方法可以自动重新排序列表中的提交:使用 autosquash 。来自git-rebase文档:

--autosquash
--no-autosquash
     

当提交日志消息以" squash开头时! ..." (或" fixup!..."),并且有一个提交标题以相同的...开头,   自动修改rebase -i的待办事项列表以便提交   标记为压缩是在提交修改后立即进行的,并且   将已移动提交的操作从pick更改为squash(或fixup)。   忽略后续"修正! "或者"壁球! "在第一次之后,万一   你提到了git commit --fixup/--squash的早期修正/壁球。

     

此选项仅在使用--interactive选项时有效。

     

如果使用配置变量--autosquash默认启用rebase.autoSquash选项,则此选项可用于   覆盖并禁用此设置。

在您的示例中,在创建提交 c 时,如果提交已存在,请使用git commit --squash <commit-a>(也适用于--amend)。发出git rebase -i后(假设您设置了rebase.autoSquash),列表将根据您的需要显示。

关于交互式rebase的唯一问题是在合并-p-i选项时。同样,来自git-rebase文档的错误部分:

  

--preserve-merges --interactive提供的待办事项列表没有   表示修订图的拓扑。编辑提交和   重写他们的提交消息应该工作正常,但尝试   重新提交提交往往会产生违反直觉的结果。