没有提交信息的Git提交

159

我怎样可以提交更改而无需指定提交信息?为什么默认情况下需要这样做?


8
最后,git commit -a --allow-empty-message -m ''不再打开编辑器了。请参见我的答案 - VonC
4
在Windows系统中,使用命令 git commit -a --allow-empty-message -m '' 可以提交一个空信息的提交记录(commit),因此最好改用这个命令:git commit -a --allow-empty-message -m ""。新命令的作用与旧命令相同,只是将两个单引号替换为两个双引号。 - tav
10个回答

174

通常情况下,git需要提交非空的消息,因为提供有意义的提交消息是良好开发实践和仓库管理的一部分。提交消息的第一行在git中被广泛使用;更多信息请查阅"关于Git提交消息的注意事项"

如果你打开Terminal.app,cd到你的项目目录,并执行git commit -am '',你将会看到它失败了,因为不允许提交一个空的提交消息。新版本的git具有--allow-empty-message命令行参数,包括最新版的Xcode附带的git版本。这将允许你使用此命令提交一个空的提交消息:

git commit -a --allow-empty-message -m ''

在使用--allow-empty-message标志之前,您必须使用commit-tree命令。在Git书籍"Raw Git"章节中可以看到使用此命令的示例。


34
我认为句子“提供有意义的提交信息是好的开发实践的一部分”是不正确的 - 人们可以说提供有意义的提交信息被认为是好的开发实践的一部分,因为这个陈述本身就是有争议的 - 我个人认为,有时候提供更少的信息会导致更少的混淆,特别是由于Git明显会存储对仓库的实际更改,并且git diff将向感兴趣的方​​​​​​​ ​​​​​​​展示提交包含的确切内容,而不依赖于人工编写的描述。机器应该在可能的情况下为我们节省劳动。 - Armen Michaeli
7
@amn,我也开始对我写过的成千上万条写得很好的提交信息出现过并永远不会被任何人读到这件事感到疑惑。对我来说,这个习惯的价值在于它强迫我查看更改并试图描述它们,有时这会让我注意到bug。不过你说得对,我会考虑更多地关注代码而不是提交信息。 - Sergey Orshanskiy
16
Git不再只用于代码开发。当我更新GitHub维基页面或Overleaf LaTeX文件时,通常没有什么可说的,因为我正在更新“文档”。关于更改的所有语义意义都包含在差异中。实际上,我发现自己将更改的文本用作提交消息本身:完全是冗余的! - Jim Pivarski
8
有时候,即使提交者认为git diff命令的输出结果已经很清楚明了,但实际上并不容易理解。请问您需要翻译其他内容吗? - cowlinator
...可能会使代码更加清晰。但是,如果您将历史记录用于类似于自动保存的方式...那还有什么意义呢?这就是@JimPivarski的评论让我思考的问题。看起来似乎在文档提交消息方面没有太多意义。但也许不是这样?我认为,随着我们被迫越来越快地完成任务...我们不应该放弃历史记录。因为有一天你可能想知道,“为什么或何时改变了那个?”但是,对于文档来说,这可能没有太多意义。请不要太在意,只是分享我的想法。 - x-yuri
显示剩余2条评论

40

如果你为它添加别名,那么它会变得更好,对吧?

git config --global alias.nccommit 'commit -a --allow-empty-message -m ""'

现在你只需要执行nccommit,nc代表无注释,一切都应该被提交。


1
我不得不在“message”中添加一个空格,因此它变成了... -m“”' - scotscotmcc

29

当你在进行重要的代码更新时,如果你真的需要一个中间检查点,你可以这样做:

git commit -am'.'

更短:

git commit -am.

这将添加一条带有消息.的提交。


那是做什么用的? - fishinear
4
提交一个信息为“.”的提交。 - lackadaisical
3
当我完全不记得自己在提交中放了什么内容,又太懒得逐一使用“diff”命令时,我会使用这种方法。 - TheTechRobo the Nerd
是的,-m. 很好用!我使用它在我的 wip 分支上创建临时提交,最后通过创建真正的提交消息,使用 --squash 将该 wip 分支合并。 - Tharindu Sathischandra

24

注意: 自git1.8.3.2版本开始 (2013年7月),以下命令(上文提到Jeremy W Sherman提出)将不再打开编辑器:

git commit --allow-empty-message -m ''

查看commit 25206778aac776fc6cc4887653fdae476c7a9b5a:

如果使用git commit的选项-m指定了空消息,则会启动编辑器。
这是意外和不必要的。
不要使用消息字符串的长度来检查用户是否指定了消息,而是直接记住是否给出了-m选项。


git 2.9(2016年6月)改进了空消息的行为:

查看 commit 178e814 (2016年4月6日) 由 Adam Dinwoodie (me-and) 提交。
查看 commit 27014cb (2016年4月7日) 由 Jeff King (peff) 提交。
(由 Junio C Hamano -- gitster --commit 0709261 中合并,日期为2016年4月22日)

commit: 不要忽略由-m ''给出的空消息

  • "git commit --amend -m '' --allow-empty-message",尽管看起来很奇怪,但是这是一个有效的请求,用于修改提交以完全没有消息。
    由于在命令行上检测到-m的存在而导致的误检,我们最终保留了原始提交的日志消息。
  • "git commit -m "$msg" -F file"应该被拒绝,无论$msg是否为空字符串,但由于相同的错误,当$msg为空时未被拒绝。
  • "git -c template=file -m "$msg""即使$msg为空,也应该忽略模板,但它没有这样做,而是使用了模板文件中的内容。

7

--allow-empty-message -m ''(和 -m "")在 PowerShell 上的 Git 2.29.2 版本中失败:

错误:开关“m”需要一个值

(奇怪的是,一边是反引号,另一边是单引号)


以下内容在 Linux、PowerShell 和命令提示符中均能正常工作:

git commit --allow-empty-message --no-edit
--no-edit参数可以实现不启动编辑器的效果。
我认为这种方法更加明确,比使用-m ''强制发送一个空消息略微好一些。

在Windows上,我会尝试使用双引号:-m "" - VonC
3
我试过了。它们在PowerShell中也失败了(虽然在命令提示符中可以工作,但我不使用那个)。不必为每个平台记住不同的语法,这就是为什么我更喜欢--no-edit的原因。 - Daniel Liuzzi

5

Git要求每个提交都必须有注释,否则它将不接受该提交。

您可以使用git配置默认模板作为默认提交消息,或者在git中查找--allow-empty-message标志。我认为(不是100%确定),您可以重新配置git以接受空提交消息(这不是一个好主意)。通常,每个提交应该是一点工作,由您的消息描述。


4
不确定为什么这个答案会被踩。我认同强制Git接受空提交信息或使用像"save"这样的信息是一个不好的主意。停止抗争,学习这个该死的工具吧。 - Jezen Thomas

5
你不需要Git来完成这个任务。巧妙地使用Bash函数就可以轻松解决。如果你不关心消息,只需设置一个默认消息并忘记它即可。
function gitcom() {
  git commit -m "my default commit message"
}

如果你非常有冒险精神,你可以用一个命令添加、提交并推送。
function gitzap() {
  git add . && git commit -m "whatevs" && git push $1 $2
}

然后你将运行以下命令:

gitzap origin master

你甚至可以更深入地使用parse_git_branch,以此减少一些按键,或者将“origin”和“master”设置为共同的默认值。

1
你能提供一些有关如何设置这个Bash函数的更多细节吗? - adaam
1
假设您使用的是OSX或Linux,您可以复制这些函数并将它们放在您的.profile文件中(应该在您的主目录中,如果没有则创建一个)。打开一个新的控制台窗口,这些命令将对您可用。对这些文件所做的任何更改都需要您刷新bash会话,因此您可以通过将以下别名添加到该文件来加快速度:alias ea="subl ~/.profile" # subl是我的文本编辑器,请用您自己的替换 alias er="source ~/.profile" # 这将重置现在,当您想要添加快捷方式时,只需键入“ea”(编辑别名) 要刷新,请键入“er”。 - Steven Garcia
2
如果你将脚本命名为 git-comgit-zap(没有扩展名),并将它们放在 git 可以找到的地方(即在你的 PATH 中的某个位置),git 就会像处理常规 git 命令一样处理它们,你可以这样调用它们:git comgit zap origin master - Manuzor
1
在Bash中,它可以是function gitcom {gitcom() {。据我所知,需要修复吗? - user5047085

2
我找到了最简单的解决方案:
git commit -am'save'

这就是全部了,你需要处理 git 提交信息的相关事情。

你甚至可以将这个命令保存到bash或其他地方,以使它更加简单。

我们团队成员总是写这些消息,但几乎没有人会再次看到这些消息。

在我们团队中,提交消息是一件浪费时间的事情,所以我们忽略它。


2

我在我的私人项目中有以下配置:

git config alias.auto 'commit -a -m "changes made from [device name]"'

那样,当我匆忙时我就这么做。原始回答。
git auto
git push

最起码我知道是从哪个设备提交的更改。

1

在其他答案的基础上,我提出了以下内容:

git config --global alias.gromit '!git add --all && git commit --allow-empty-message -m ""'

这与dalvarezmartinez1的答案不同,git add --all还会添加新文件,而git commit中的-a标志则不会。此外,我认为这个别名更适合该命令。:-)

未来的自己,请原谅我即将进行的所有沉默、快速、伟大的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接