ChatGPT解决这个技术问题 Extra ChatGPT

Add line break to 'git commit -m' from the command line

I am using Git from the command line and am trying to add a line break to the commit message (using git commit -m "") without going into Vim.

Is this possible?

As a note, here's a link which summarizes good commit message conventions - github.com/erlang/otp/wiki/Writing-good-commit-messages if it helps someone.
Something like GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -e would help you avoid vim.

S
Sandra

Certainly, how it's done depends on your shell. In Bash, you can use single quotes around the message and can just leave the quote open, which will make Bash prompt for another line, until you close the quote. Like this:

git commit -m 'Message

goes
here'

Alternatively, you can use a "here document" (also known as heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

@Peter Farmer's answer later on mentions that Git convention is apparently something like: 1 line for summary, two line breaks, then a detailed message.
Also, see below post by @esse. A simple carriage return does the trick.
@MohamadAli, on Windows, commandline parsing works differently
@KelvinShadewing, yes, but with the difference that shell substitution rules apply to the message, so you need to escape dollar signs and other metacharacters. On the other hand it allows you to use variables.
@Nikhil, many programs support a single dash as a file name to mean stdin or stdout. With the here document, the git command can read the message text from stdin, and the -F option gives the file name to read the message from.
S
Simon

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."

Note that this creates separate paragraphs - not lines. So there will be a blank line between each two -m lines, e.g.:

My head line

My content line.

This has a benefit of working on Windows where quoting tricks mentioned elsewhere don't work. Separate -m for each line. Nice!
Messages created using this method display correctly on GitHub, GitHub for Windows and TortoiseGit.
@ddotsenko this is the benefit of working on Linux / Mac, where we have a decent shell =)
From man git commit: -m <msg>, --message=<msg> Use the given <msg> as the commit message. If multiple -m options are given, their values are concatenated as separate paragraphs.
Note that this creates separate paragraphs - not lines. So there will be a blank line between each two -m lines.
P
Peter Mortensen

Using Git from the command line with Bash you can do the following:

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

Simply type and press Enter when you want a new line, the ">" symbol means that you have pressed Enter, and there is a new line. Other answers work also.


Abizern's answer clarified for me why this works – the Bash shell interprets a <kbd>Enter</kbd> key-press as a new line until the first double-quote character is 'closed' (with a subsequent double-quote character).
I have to agree that this is a much more effective, easier and practical solution that the accepted answer. It works well for me using Git 1.8.2.1. +1 from me.
This isn't a special function of the Enter key, but rather related to the quotes. Whether you use double or single quotes doesn't really matter, except for variable expansion and escaping special characters -- that's why I chose single quotes in my answer.
Don't use this in zsh! Terminal will close and you lose what you typed.
Works in Gitbash for Windows.
J
Jon Crowell

Adding line breaks to your Git commit

Try the following to create a multi-line commit message:

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."

Then verify what you've done:

git log -1

You should end up with something like this:

https://i.stack.imgur.com/Pgvhm.png

The screenshot is from an example I set up using PowerShell with Poshgit.

This works in all terminals and Operating Systems AFAIK.

Here's an example with bash:

https://i.stack.imgur.com/eRgFc.png

Resulting in this commit:

https://i.stack.imgur.com/x7il3.png


Awesome answer. I've looked around for this for ages and tried numerous different ways to format my Git commit messages, but this works the best. I can confirm it works at the prompt with Git 1.8.2.1.
In Powershell you can do `n for line break
It worked greatly for me in Git Bash for Windows.
This should be the chosen answer as it is the most compatible method, this doesn't rely on any specific CLI prompt like some other suggestions do..
This is a better answer and should be selected as the answer. Not only this goes in line as a default behaviour, and provides a much cleaner commit message but also it is somewhat more flexible with multiple -m. Also even though it looks windows specific and has attracted windows related comments, it works fine in Linux as well.
D
Dennis Williamson

You should be able to use

git commit -m $'first line\nsecond line'

From the Bash manual:

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.

This includes support for newlines as shown above, plus hex and Unicode codes and others. Go to the linked section to see a list of the backslash-escaped characters.


@rsy: What version of Bash are you using? What do you see when you do echo $'one\ntwo' ?
rsy$ bash --version GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. The output of that command is, as expected, shown in two different lines!
The $ is key here and I didn't notice it at first glace. Otherwise I just get a \n in the middle of my message.
You don't even have to use the $'...' for the whole string; using this just around the newline character will work: git commit -m "first line"$'\n'"second line". Just note you have to close the previous string before starting your $'string'.
@PlasmaBinturong: That's true, but to me it looks a lot messier and would be easier to miss making sure all the extra quotes match up.
b
blongho

There is no need complicating the stuff. After the -m "text... the next line is gotten by pressing Enter. When Enter is pressed > appears. When you are done, just put " and press 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 ...

[EDIT 05-05-2021]

For Windows users, use GitBash for Windows. The built-in Windows cmd does not work with this method.


This answer isn't getting enough love!
This is a great answer, new lines are shown correctly on Github. First line shows as a heading.
@DRP, use GitBash for Windows. I use a Windows computer and this works perfectly when using GitBash for Windows
I now have a new reason to use gitbash. before, it was only for emoji support 🤣
Just tested this in PowerShell 7.2.2 (in Windows Terminal) and it works the same. No need for GitBash for Windows in that scenario.
P
Peter Mortensen

From Git documentation:

-m --message= Use the given as the commit message. If multiple -m options are given, their values are concatenated as separate paragraphs.

So, if you are looking for grouping multiple commit messages this should do the work:

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

Agnostic solution (shell-independent). Thanks for this. We need to RTFM :)
T
Tobse

I hope this isn't leading too far away from the posted question, but setting the default editor and then using

git commit -e

might be much more comfortable.


This one should be the best anwser.
you can leave away the -e and it will still open the editor
This one was the answer I was looking for.
P
Peter Mortensen

Doing something like

git commit -m"test\ntest"

doesn't work, but something like

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

works, but it's not very pretty. You set up a git-commitlb command in your PATH which does something like this:

#!/bin/bash

message=$1

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

And use it like this:

git commitlb "line1\nline2\nline3"

Word of warning, I have a feeling that the general convention is to have a summary line as the first line, and then two line breaks, and then an extended message in the commit message, so doing something like this would break that convention. You could of course do:

git commitlb "line1\n\nline2\nline3"

E
Eugene Yarmash

In Bash/Zsh you can simply use literal line breaks inside quotes:

git commit -m 'Multi-line
commit
message'

ANSI-C quoting also works in Bash/Zsh:

git commit -m $'Multi-line\ncommit\nmessage'

You can also instruct Git to use an editor of your choice to edit the commit message. From the docs on git-commit:

The editor used to edit the commit log message will be chosen from the GIT_EDITOR environment variable, the core.editor configuration variable, the VISUAL environment variable, or the EDITOR environment variable (in that order). See git-var for details.

So to edit your message using nano, for example, you can run:

export GIT_EDITOR=nano
git commit

P
Peter Mortensen

I use zsh on a Mac, and I can post multi-line commit messages within double quotes ("). Basically I keep typing and pressing return for new lines, but the message isn't sent to Git until I close the quotes and return.


You can do the same in bash.
P
Peter Mortensen

If you are using Bash, hit C-x C-e (Ctrl+x Ctrl+e), and it will open the current command in your preferred editor.

You can change the preferred editor by tweaking VISUAL and EDITOR.

That's what I have in my .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'

So why did somebody downvote this? This is the most convenient way to work with multiline commands in bash, you just have to configure it right once. I've been using other stupid suggestions shown in other answers here, but once you learn to edit your commands in your favorite text editor there is just no way back.
This is so heartbreakingly useful I just can't believe I lived my past years without this.
B
Basj

Here is a list of failing solutions on Windows with standard cmd.exe shell (to save you some trial-and-error time!):

git commit -m 'Hello Enter doesn't work: it won't ask for a new line

git commit -m "Hello Enter idem

git commit -m "Hello^ Enter idem

git commit -m 'Hello^ Enter World' looks like working because it asks "More?" and allows to write a new line, but finally when doing git log you will see that it's still a one-line message...

TL;DR: Even if on Windows, commandline parsing works differently, and ^ allows multiline input, it doesn't help here.

Finally git commit -e is probably the best option.


a
amphibient

Personally, I find it easiest to modify commit messages after the fact in vi (or whatever your git editor of choice is) rather than on the command line, by doing git commit --amend right after git commit.


You can achieve this same result without having to amend by just using git commit -e.
Or simply git commit, and it will open an editor with a commit message template.
R
Rodrigo Graça

I don't see anyone mentioning that if you don't provide a message it will open nano for you (at least in Linux) where you can write multiple lines...

Only this is needed:

git commit

o
oliver

Sadly, git doesn't seem to allow for any newline character in its message. There are various reasonable solutions already above, but when scripting, those are annoying. Here documents also work, but may also a bit too annoying to deal with (think yaml files)

Here is what I did:

git commit \
    --message "Subject" \
    --message "First line$(echo)Second line$(echo)Third Line"

While this is also still ugly, it allows for 'one-liners' which may be useful still. As usually the strings are variables or combined with variables, the uglynes may be kept to a minimum.


IMO it would be a fantastic, elegant solution, but on Cygwin 3.3.3 it doesn't work.
m
maciejwww

I've just been looking for any answer to that question because many times, I used to see regexes for checking commit messages. Anyway, no idea worked during commit creating with -m flag.

https://i.stack.imgur.com/m2JZU.png

No more complicated way is needed.


Y
Yug Singh

IMO the initial commit message line is supposed to be to short, to the point instead of paragraph. So using git commit -m "<short_message>" will suffice

After that in order to expand upon the initial commit message we can use

git commit --amend

which will open the vim and then we can enter the explanation for the commit message which in my opinion easier than command line.