6

直到一分钟前,我有一个 Git 存储库,其中最后一次提交有一个空的提交消息。我已经通过将一个新的提交压缩到它上面来填充它git rebase -i(我本来打算修改内容),但我仍然想知道是否有合适的方法来填充空的提交消息。

我试过

git commit --amend

但这没有用,然后我尝试了

git rebase -i HEAD^

和一个reword。两次尝试都导致 Git 说

fatal: commit has empty message

并退出。

编辑:澄清一下,最终奏效的是

# change some stuff
git commit
git rebase -i HEAD~2
# squash the last two commits

但这似乎是一个黑客行为。

4

3 回答 3

10

这似乎是一个尚未修复的错误(尽管有建议的补丁)作为一种解决方法,您可以在命令行上提供消息:

git commit --amend -m "foo"
于 2012-05-08T17:00:32.113 回答
3

如果您需要编辑最后一次提交 (HEAD) 消息,请使用git commit --amend -m 'new message'

$ git commit --allow-empty --allow-empty-message -m ''
[master 5db8236] 

$ git commit --amend
fatal: commit has empty message

$ git commit --allow-empty --amend -m 'new message'
[master d383d5c] new message

请记住,我--allow-empty只是用来强制git commit创建一个空提交并--allow-empty-message强制git commit创建一个带有空消息的提交。

于 2012-05-08T15:49:40.853 回答
3

从 git 2.0.1(2014 年 6 月 25 日)开始,当您变基并尝试放置一个空提交消息时,git 将不再抱怨。

请参阅Jeff King的提交 076cbd6 ( )peff

commit:不要抱怨来自的空消息-C

当我们选择另一个提交的消息时,die()如果我们发现它是空的并且我们不会运行编辑器(即,当运行“ -C”而不是“ -c”时),我们会立即。
但是,这种检查是多余的和有害的。

这是多余的,因为我们稍后会注意到空消息,在我们运行编辑器并死在那里之后(就像我们在普通情况下所做的那样,而不是 " -C" 情况,用户在编辑器中提供了空消息)。

它有害有几个原因:

  1. 它不尊重--allow-empty-message结果,“ git rebase -i”不能“挑选”这样的提交
    因此,您甚至无法通过“ reword”或“ edit”指令及时返回修复它。
  2. 不考虑编辑器以外的其他方式修改消息。
    例如, " git commit -C empty-commit -m foo" 可以从 empty-commit 中获取作者信息,但添加一条消息。
    要使其正常工作还有更多工作要做(现在我们明确禁止“ -Cwith -m”),但这消除了一个障碍。
  3. 现有的检查不足以防止段错误。
    我们尝试\n\n在提交中找到“”标题/正文边界。如果它在字符串的末尾(即,没有正文),或者我们根本找不到它(即,截断的提交对象),我们认为该消息为空。
    有“ -C”,没关系;我们die在任何一种情况下。但是使用“ -c”,我们继续,并且在截断提交的情况下最终可能会取消引用NULL+2

注意:对于 Git 2.19,git rebase--allow-empty-message默认使用。
请参阅“使用空提交消息重新设置 git 历史记录”。


确保使用 Git 2.25(2020 年第一季度):定序器机器比较了 HEAD 和它尝试提交的状态,以确定结果是否为无操作提交,即使在修改提交时也是如此,这是不正确的,并且已更正。

请参阅Phillip Wood ( ) 的提交 2d05ef2(2019 年 11 月 22 日(由Junio C Hamano 合并 -- --提交 c920859中,2019 年 12 月 5 日)phillipwood
gitster

sequencer:修复修改时的空提交检查

签字人:菲利普·伍德

这修复了356ee4659b中引入的回归(“ sequencer:尝试在不分叉 'git commit' 的情况下提交”,2017-11-24,Git v2.17.0-rc0 --批次 #2中列出的合并)。在检查提交是否为空时, 修改提交时使用了错误的父级。修改时我们需要检查not 。
try_to_commit()HEAD^HEAD

该系列将改变这些测试以检查建议是否包括建议rebase --skip跳过将清空提交的修复。

于 2014-07-26T18:39:49.140 回答