我一直在阅读有关commitrebase的git文档,但我仍然不明白在执行fixup!时使用squash!rebase --autosquash作为提交消息前缀的区别。我相信我理解fixup!fixing previous commits方面的作用,但是我没有看到使用squash!的好例子。有谁能澄清两者之间的区别,并给出一些上下文,在那里它们会被不同地使用?提前谢谢!

最佳答案

如我在“Trimming Git Commits/Squashing Git History”中所述,总结如下:
带着修理工!指令,您可以在提交消息中保持挤压“不可见”,同时仍然可以使用--autosquash选项从自动提交重新排序中获益。
正如Op Dash评论:
使用squash!将确保在历史记录中记录挤压操作,这与fixup!不同,后者对于更“干净”的方法来说挤压操作是不可见的。
Git 2.16.x/2.17(2018年第1季度)之前的另一个区别是,不能将“git commit --fixup”与附加的提交消息组合在一起。
现在已经不是这样了。
参见commit 30884c9(2017年12月22日)。
帮助者:Ævar Arnfjörð Bjarmason (avar)
(于2017年12月22日由Eric Sunshine (sunshineco)合并)
avar:添加对commit的支持
添加对为--fixup <commit> -m"<extra message>"提供-m选项的支持。
这样做已经出错(“option--fixup不能
-m被引入以来。
在此之前,在提交时修改fixup消息的唯一方法是使用--fixup并在编辑器中修改它。
此功能的用例是:
在创建
为什么要在没有
注意到另一个。
(ab)使用--edit功能“修复”已提交的提交
被推到一个不允许非快进的分支,
也就是说,只要注意“--fixup”,
如果这段历史在未来被改写的话
合并。
在这种情况下你可能想留个小口信,
例如“--fixup”。
请注意,在Git 2.17(2018年第2季度)之前,“this should have been part of that other commit”不允许同时使用“forgot this part, which broke XYZ”选项;允许它用更多文本注释结果提交。
参见Ævar Arnfjörð Bjarmason -- git commit --fixup --commit 30884c9(2017年12月22日)。
帮助者:commit 30884c9
(于2018年2月27日由commit f55e84f合并)
-m<message>:添加对avar的支持
添加对为sunshineco提供gitster选项的支持。这样做已经
自从引入commit之后就被错误删除了。在此之前,唯一
提交时修改修复信息的方法是使用--fixup <commit> -m"<extra message>"
在编辑处修改。
此功能的用例是:
在创建
为什么要在没有
注意到另一个。
(ab)使用-m功能“修复”已提交的提交
被推到一个不允许非快进的分支,
也就是说,只要注意到“这应该是另一个承诺的一部分”,
如果这段历史在未来被改写的话
合并。
在这种情况下你可能想留个小口信,
例如,“忘记了这部分,它打破了xyz”。
这样,--fixup将导致
提交消息如下:

!fixup <subject of <commit>>

More

Details

当最初添加--fixup选项时,“option--edit不能
合并“错误从--fixup--fixup--fixup <commit> -m"More" -m"Details"扩展到还包括
--fixupÆvar Arnfjörð Bjarmason (-m),“commit:--fixup选项用于-c”,2010-11-02,git 1.7.4-rc0)。

08-28 00:09