我想将两个不合规的提交合并为一个。
例如,如果我执行命令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
到目前为止,我没有目睹任何危险的副作用。有谁知道我是否可以通过这样做真的打破一些东西?是否有更好,更安全的方式去做我想要完成的事情?
答案 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
提供的待办事项列表没有 表示修订图的拓扑。编辑提交和 重写他们的提交消息应该工作正常,但尝试 重新提交提交往往会产生违反直觉的结果。