你在a comment中提到:
我没有意识到它不是用于提交消息的。
目前没有git commit 选项是 的意思。1 相反,您需要运行git rebase -i(无论如何您通常都会这样做)然后将该特定提交的 pick 行更改为 reword 行。
我还是不明白如何正确使用修复工具...
这里要理解的是git commit --fixup和git commit --squash是比较晚的发明。 首先是git rebase --interactive。 (还有更多的背景知识需要理解,但我们假设您通过重复摘樱桃完全了解git rebase 的作用以及它是如何做到的。如果您不了解,那是一个单独的问题——已经在 StackOverflow 上询问并回答了,所以请搜索那些问答。)
现在,由于 rebase 本质上是一系列精选操作,我们观察到机械的、自动的、按原样复制每个提交的 rebase 有点无聊。我们添加了一些刺激!!! (在此处插入大片的电影爆炸声和巨大的噪音) 通过将一系列精选内容变成一个命令块:
pick a123456 subject line from that commit
pick b789abc another commit subject line
pick cef0123 ... etc ...
pick d456789 and so on
然后,在制作完这份“说明书”之后,我们为您——用户——提供编辑这份说明书的机会。
例如,您可以更改pick 行的顺序。这意味着,它们不是按照原始顺序完成,而是按照您选择的新顺序完成。所以你可以重新调整提交的order。如果你有一个提交错误,并使用后来的提交以某种方式修复它,你可以将错误和修复提交放在一起!
到目前为止,这并没有太多帮助。你改变:
pick a123456 subject line from that commit
pick b789abc another commit subject line
pick cef0123 ... etc ...
pick d456789 and so on
pick eabcdef whoops
进入:
pick a123456 subject line from that commit
pick b789abc another commit subject line
pick eabcdef whoops
pick cef0123 ... etc ...
pick d456789 and so on
“哎呀”提交修复了您在提交b789abc 中所犯的错误。好的,所以如果您运行 这些 指令,重新定位的结果是错误提交和修复提交现在 相邻,而不是由(的副本)分隔提交cef0123,后跟d456789。
但现在我们添加了更多选项。例如,我们不仅添加了pick,还添加了选项squash。这告诉 Git,它应该将 两个 提交转换为 单个组合提交,而不是仅仅挑选提交 eabcdef(修复早期提交的那个)。它还应该从两个提交中获取提交日志消息,并将它们放入一个临时文件中并将该临时文件用作提交消息... 在给你有机会编辑该文件!
因此,现在您可以将两个提交消息编辑为单个提交消息,用于将有缺陷的提交与其修复提交一起压缩而产生的组合提交!这是这里最初的想法。
1正在努力为此添加一个新的提交选项。
让我们暂停一下,盘点一下
因此,通过只知道两个选项(pick 和 squash)的交互式变基,我们获得了以下能力:
- 我们可以重新排序提交,将密切相关的提交放在一起。
- 我们可以合并提交。当我们这样做时,我们会被扔到我们的编辑器中,为组合提交组成正确的提交消息。
既然我们可以做这么多,让我们考虑一下我们可能希望能够做的其他事情:
-
如果某些提交消息中有错字,能够修复它会很好。
所以,在我们现有的两个选项(pick 和 squash)上添加一个 reword 选项。这将挑选提交,但也会让我们进入我们的编辑器,让我们首先更改提交消息。
-
如果提交中有问题,但我们有修复它并且我们不需要修复它的提交消息,如果能够进行修复就好了在提交失败后立即提交。我们已经可以通过移动它并使用squash 来做到这一点。但这会将我们带入我们的编辑器。最好只保留来自被破坏的提交的提交message,同时压缩两个提交。
所以,在我们现有的选项中,让我们添加一个fixup 选项。这将进行压缩,就像 squash 所做的那样,但不会将我们放入我们的编辑器中。它将完全丢弃修复提交的消息,在修复压缩的同时保留来自稍微损坏的提交的消息。
这些为我们提供了一些交互式 rebase 可以执行的命令。在我们停止并声明我们的交互式 rebase 功能很漂亮并且应该成为 Git 的一部分并将其放入 Git 之前,我们得到了更多(例如 edit,它选择提交但随后停止,就好像存在冲突一样)发布。然后它在 Git 中存在了几年。
现在几年过去了,我们说:嘿,如果我们可以在我们提交时让git commit 注释 提交,那就太好了,说这是一个壁球或修复提交,git rebase --interactive 应该自动变成squash 或rebase。这就是你遇到的情况。你在电影中迟到了,并不知道所有这些背景,但现在你已经阅读了一些剧透来解释电影的第一部分以及我们是如何到达这里的。
这解释了为什么会出现错误:--fixup 提交应该是修复已提交文件中的错误。这不是为了修复提交消息。 git commit 目前还没有办法做到这一点。相反,您必须自己运行git rebase -i,并将pick 行更改为reword 行。