从命令行中为 'git commit -m' 添加换行符

1052
我正在使用命令行中的 Git,并尝试在提交信息中添加换行符(使用 git commit -m ""),而不进入 Vim。这是否可能?

11
作为一条注释,这里有一个总结良好提交信息惯例的链接 - https://github.com/erlang/otp/wiki/Writing-good-commit-messages ,如果对某人有所帮助。 - Neerkoli
8
类似GIT_EDITOR="emacs" git commit -m '段落1' -m '段落2' -e这样的命令可以帮助你避免使用vim - jotik
18个回答

942

当然,如何完成取决于你的shell。在Bash中,您可以在消息周围使用单引号,然后将引号留空,这将使Bash提示您输入另一行,直到您关闭引号。就像这样:

git commit -m 'Message

goes
here'

或者,您可以使用“here document”(也称为heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

70
Peter Farmer的答案提到,Git的惯例似乎是:1行摘要,两个换行符,然后是详细信息。 - Nick Spacek
5
请参考 @esse 发布的下面一条帖子。一个简单的换行符就可以解决问题。 - Hakan Ensari
9
在Windows系统中,命令行解析的工作方式与其他系统不同。原文链接:https://dev59.com/kXRB5IYBdhLWcg3wgHWr - Simon Richter
2
@KelvinShadewing,是的,但有一个区别,即shell替换规则适用于消息,因此您需要转义美元符号和其他元字符。另一方面,它允许您使用变量。 - Simon Richter
3
@Nikhil,许多程序支持单破折号作为文件名,表示标准输入或标准输出。通过“here文档”,“git”命令可以从标准输入中读取消息文本,“-F”选项指定要从中读取消息的文件名。 - Simon Richter
显示剩余8条评论

837
如果你只需要一个标题和一行内容,可以使用以下代码:

If you just want, say, a head line and a content line, you can use:

git commit -m "My head line" -m "My content line."
请注意,这将创建单独的段落-而不是行。 因此,在每两个-m行之间会有一行空行,例如:
My head line

My content line.

114
这样做的好处是可以在 Windows 上运行,而其他地方提到的引号技巧不起作用。每行单独使用“-m”。不错! - ddotsenko
11
使用此方法创建的消息可以正确显示在GitHub、GitHub for Windows和TortoiseGit上。 - Richard
18
这是在Linux/Mac工作的好处,我们有一个很不错的shell =) - Ciro Santilli OurBigBook.com
8
man git commit 中翻译得到: -m <msg>, --message=<msg> 使用给定的 <msg> 作为提交信息。如果提供多个 -m 选项,则它们的值将作为单独段落连接在一起。 - Amedee Van Gasse
64
请注意,这将创建独立的“段落”——而非单行。因此,在每两个“-m”行之间会有一个空行。 - Ohad Schneider
显示剩余6条评论

443

在Bash命令行中使用Git,您可以执行以下操作:

git commit -m "this is
> a line
> with new lines
> maybe"

只需输入并按下Enter,即可在需要新行时创建一个新行,">"符号表示您已按下Enter键,并且有一个新行。其他答案也可以。


11
Abizern的答案为我解释了为什么这个方法可行——Bash shell会将<kbd>Enter</kbd>键解释为一个新行,直到第一个双引号被“关闭”(即后面出现了一个相应的双引号)。 - Kenny Evitt
1
我必须承认这是一个比被接受的答案更有效、更简便和实用的解决方案。在使用Git 1.8.2.1时,它对我非常有效。我给你点赞。 - crmpicco
2
这不是 Enter 键的特殊功能,而是与引号相关。无论您使用双引号还是单引号都没有太大关系,除了变量扩展和转义特殊字符 - 这就是我在答案中选择单引号的原因。 - Simon Richter
2
不要在zsh中使用这个!终端会关闭并且你会失去你输入的内容。 - laike9m
5
适用于Windows的GitBash工作。 - Omar Tariq
显示剩余7条评论

164

给你的 Git 提交添加换行符

尝试以下内容以创建多行提交信息:

git commit -m "Demonstrate multi-line commit message in Powershell" -m "Add a title to your commit after -m enclosed in quotes,
then add the body of your comment after a second -m.
Press ENTER before closing the quotes to add a line break.
Repeat as needed.
Then close the quotes and hit ENTER twice to apply the commit."

然后验证你所做的:

git log -1

你最后应该得到类似这样的东西:

在 PowerShell 中使用多行 Git 提交信息

这个截图是我用 PowerShell 和 Poshgit 设置的一个示例。

据我所知,这适用于所有终端和操作系统。

这里有一个 bash 的示例:

Git 中的多行提交信息

生成如下提交:

多行提交


11
非常好的回答。我已经寻找这个方法很久了,并尝试了许多不同的方式来格式化我的Git提交消息,但这个方法是最好的。我可以确认在使用Git 1.8.2.1的命令提示符下它是有效的。 - crmpicco
1
在 Powershell 中,您可以使用 `n 进行换行。 - Ecropolis
4
它在Windows上的Git Bash中对我有很好的作用。 - Ulysses Alves
3
由于这种方法最为兼容,不像其他建议那样依赖于特定的CLI提示符号,因此这应该被选作答案。 - user909694
1
这是一个更好的答案,应该被选为答案。不仅如此,它符合默认行为,并提供了更清晰的提交信息,而且在多个-m方面也更加灵活。尽管它看起来是针对Windows的,吸引了与Windows相关的评论,但在Linux中也可以正常工作。 - 0xc0de
显示剩余4条评论

135
你应该可以使用。
git commit -m $'first line\nsecond line'

Bash手册中得知:

表达式形如$'string'的字符串会被特殊对待。这种字符串会扩展为string,其中反斜杠转义字符将被替换为符合 ANSI C 标准的指定字符。

上述内容包括支持换行符,以及十六进制和Unicode编码等。请前往链接的部分查看反斜杠转义字符列表。


@rsy:你使用的Bash版本是什么?当你执行echo $'one\ntwo'时,你看到了什么? - Dennis Williamson
1
rsy$ bash --version GNU bash,版本3.2.53(1)-release(x86_64-apple-darwin13) 版权所有(C)2007自由软件基金会。该命令的输出如预期所示,显示为两行! - ccoutinho
4
这里的 $ 很关键,一开始我没有注意到它。否则,我的消息中间就会出现 \n 。 - ChrisBob
2
你甚至不需要在整个字符串中使用 $'...',只需在换行符周围使用它即可:git commit -m "first line"$'\n'"second line"。请注意,在开始 $'string' 之前,您必须关闭先前的字符串。 - PlasmaBinturong
1
@PlasmaBinturong:没错,但在我看来,这样做会显得更混乱,而且很容易忽略确保所有额外的引号匹配。 - Dennis Williamson
显示剩余5条评论

96

没有必要使事情变得复杂。在 -m "text... 后的下一行是通过按下 Enter 获得的。当按下 Enter 时,会出现 >。完成后,只需放置 " 并按下 Enter

$ git commit -m "Another way of demonstrating multicommit messages:
>
> This is a new line written
> This is another new line written
> This one is really awesome too and we can continue doing so till ..."

$ git log -1
commit 5474e383f2eda610be6211d8697ed1503400ee42 (HEAD -> test2)
Author: ************** <*********@gmail.com>
Date:   Mon Oct 9 13:30:26 2017 +0200

Another way of demonstrating multicommit messages:

This is a new line written
This is another new line written
This one is really awesome too and we can continue doing so till ...

[2021年5月5日更新]

对于Windows用户,请使用GitBash for Windows。内置的Windows cmd无法与此方法配合使用。


1
这是一个很好的答案,在Github上新行会正确显示。第一行显示为标题。 - Yogesh Umesh Vaity
2
@DRP,请使用GitBash for Windows。我使用的是Windows电脑,当使用GitBash for Windows时,它可以完美地运行。 - blongho
5
现在我有一个新的使用 GitBash 的理由。以前只是因为它支持表情符号。 - ps2goat
1
刚在 PowerShell 7.2.2(在 Windows 终端中)测试了一下,结果是一样的。在这种情况下不需要 GitBash for Windows。 - Alex Povel

56

我希望这不会偏离问题的主题,但是设置默认编辑器然后使用。

git commit -e

可能会更加舒适。


3
这个应该是最佳答案。 - Galaxy
11
您可以去掉“-e”,它仍然会打开编辑器。 - djangonaut
这个是我在寻找的答案。 - Tinmarino

54

来自Git文档:

-m <msg>
--message=<msg>
使用给定的<msg>作为提交信息。如果提供了多个-m选项,则它们的值将作为单独的段落连接。

因此,如果您要对多个提交消息进行分组处理,这应该可以解决问题:

git commit -m "commit message1" -m "commit message2"

4
不考虑Shell的解决方案。谢谢您的帮助,我们需要查阅手册 :) - Mat M

51

执行类似以下的操作:

git commit -m"test\ntest"

无法工作,但类似于

git commit -m"$(echo -e "test\ntest")"

这样做是有效的,但不太美观。您可以在PATH中设置一个git-commitlb命令,类似于以下操作:

#!/bin/bash

message=$1

git commit -m"$(echo -e "$message")"

然后像这样使用:

git commitlb "line1\nline2\nline3"

提醒一句,我觉得一般的约定是在提交信息中将摘要行放到第一行,然后插入两个换行符,再加上详细的描述信息,因此这样做会打破这个约定。当然,你可以这样做:

git commitlb "line1\n\nline2\nline3"

38
在 Bash/Zsh 中,你可以在引号内直接使用字面换行:
git commit -m 'Multi-line
commit
message'

ANSI-C引用也适用于Bash/Zsh:

git commit -m $'多行\n提交\n信息'

你还可以指示Git使用你选择的编辑器来编辑提交消息。参见git-commit中的文档:

用于编辑提交日志消息的编辑器将从环境变量GIT_EDITOR、配置变量core.editor、环境变量VISUAL或环境变量EDITOR(按此顺序)中选择。有关详细信息,请参见git-var

因此,例如,要使用nano编辑你的消息,可以运行:

export GIT_EDITOR=nano
git commit

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