Agregue el salto de línea a 'git commit -m' desde la línea de comando

746

Estoy usando Git desde la línea de comando y estoy tratando de agregar un salto de línea al mensaje de confirmación (usando git commit -m "") sin entrar en Vim.

es posible?

Alan Whitelaw
fuente
66
Como nota, aquí hay un enlace que resume las convenciones de mensajes de confirmación buenos: github.com/erlang/otp/wiki/Writing-good-commit-messages si ayuda a alguien.
WeirdElfB0y
55
Algo así GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -ete ayudaría a evitar vim.
jotik

Respuestas:

694

Ciertamente, cómo se hace depende de su caparazón. En Bash, puede usar comillas simples alrededor del mensaje y puede dejar la cita abierta, lo que hará que Bash solicite otra línea, hasta que cierre la cita. Me gusta esto:

git commit -m 'Message

goes
here'

Alternativamente, puede usar un "documento aquí" (también conocido como heredoc):

git commit -F- <<EOF
Message

goes
here
EOF
Simon Richter
fuente
53
La respuesta de @Peter Farmer más adelante menciona que la convención de Git aparentemente es algo así como: 1 línea para el resumen, dos saltos de línea, luego un mensaje detallado.
Nick Spacek
44
Además, vea la publicación a continuación de @esse. Un simple retorno de carro hace el truco.
Hakan Ensari
66
@MohamadAli, en Windows, el análisis de línea de comandos funciona de manera diferente
Simon Richter
2
@KelvinShadewing, sí, pero con la diferencia de que las reglas de sustitución de shell se aplican al mensaje, por lo que debe escapar de los signos de dólar y otros metacaracteres. Por otro lado, te permite usar variables.
Simon Richter
2
@Nikhil, muchos programas admiten un solo guión como nombre de archivo para significar stdin o stdout. Con el documento aquí , el gitcomando puede leer el texto del mensaje desde stdin, y la -Fopción le da el nombre del archivo para leer el mensaje.
Simon Richter
515

Si solo quiere, por ejemplo, una línea de encabezado y una línea de contenido, puede usar:

git commit -m "My head line" -m "My content line."

Tenga en cuenta que esto crea párrafos separados, no líneas. Por lo tanto, habrá una línea en blanco entre cada dos -mlíneas, por ejemplo:

My head line

My content line.
Simón
fuente
80
Esto tiene la ventaja de trabajar en Windows, donde los trucos de citas mencionados en otra parte no funcionan. Separar -mpara cada línea. ¡Agradable!
ddotsenko
8
Los mensajes creados con este método se muestran correctamente en GitHub, GitHub para Windows y TortoiseGit.
Richard
12
@ddotsenko este es el beneficio de trabajar en Linux / Mac, donde tenemos un shell decente =)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
77
De man git commit: -m <msg>, --message = <msg> Use el <msg> dado como mensaje de confirmación. Si se dan varias opciones -m, sus valores se concatenan como párrafos separados.
Amedee Van Gasse
55
Tenga en cuenta que esto crea párrafos separados , no líneas. Entonces habrá una línea en blanco entre cada dos -mlíneas.
Ohad Schneider
398

Usando Git desde la línea de comando con Bash puedes hacer lo siguiente:

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

Simplemente escriba y presione Entercuando desee una nueva línea, el símbolo ">" significa que ha presionado Entery hay una nueva línea. Otras respuestas también funcionan.

esse
fuente
66
La respuesta de Abizern me aclaró por qué esto funciona: el shell Bash interpreta una pulsación de tecla <kbd> Enter </kbd> como una nueva línea hasta que el primer carácter de comillas dobles está 'cerrado' (con un carácter de comillas dobles posterior).
Kenny Evitt
1
Tengo que aceptar que esta es una solución mucho más efectiva, fácil y práctica que la respuesta aceptada. Funciona bien para mí usando Git 1.8.2.1. +1 de mi parte
crmpicco
Esta no es una función especial de la tecla Intro , sino que está relacionada con las comillas. Si usa comillas dobles o simples realmente no importa, a excepción de la expansión variable y el escape de caracteres especiales, es por eso que elegí comillas simples en mi respuesta.
Simon Richter
2
¡No uses esto en zsh! La terminal se cerrará y perderás lo que escribiste.
laike9m
3
Funciona en Gitbash para Windows.
Omar Tariq
111

Deberías poder usar

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

Del manual de Bash :

Las palabras de la forma $ ' string ' se tratan especialmente. La palabra se expande a cadena , con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.

Esto incluye soporte para líneas nuevas como se muestra arriba, además de códigos hexadecimales y Unicode y otros. Vaya a la sección vinculada para ver una lista de los caracteres con barra invertida.

Pausado hasta nuevo aviso.
fuente
@rsy: ¿Qué versión de Bash estás usando? ¿Qué ves cuando lo haces echo $'one\ntwo'?
Pausado hasta nuevo aviso.
1
rsy $ bash --version GNU bash, versión 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. El resultado de ese comando se muestra, como se esperaba, en dos diferentes ¡líneas!
ccoutinho
para mí en Windows 7 es la mejor opción Gracias
Mohamad Ali
2
El $ es clave aquí y no lo noté a primera vista. De lo contrario, solo obtengo un \ n en el medio de mi mensaje.
ChrisBob
1
Ni siquiera tiene que usar $ '...' para toda la cadena; el uso de esta a la vuelta de la carácter de nueva línea funcionará: git commit -m "first line"$'\n'"second line". Solo tenga en cuenta que debe cerrar la cadena anterior antes de comenzar su $'string'.
PlasmaBinturong
95

Agregar saltos de línea a su confirmación de Git

Pruebe lo siguiente para crear un mensaje de confirmación de varias líneas:

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

Luego verifica lo que has hecho:

git log -1

Deberías terminar con algo como esto:

Mensaje de confirmación Git multilínea en PowerShell

La captura de pantalla es de un ejemplo que configuré usando PowerShell con Poshgit.

Jon Crowell
fuente
77
Impresionante respuesta. He buscado esto durante años y he intentado numerosas formas diferentes de formatear mis mensajes de confirmación de Git, pero esto funciona mejor. Puedo confirmar que funciona en el indicador con Git 1.8.2.1.
crmpicco
1
En Powershell puedes hacer `n para el salto de línea
Ecropolis
2
Me funcionó mucho en Git Bash para Windows .
Ulises Alves
1
Esta debe ser la respuesta elegida, ya que es el método más compatible, esto no se basa en ninguna CLI específica con ayudas visuales como algunas otras sugerencias hacen ..
1
Esta es una mejor respuesta y debe seleccionarse como la respuesta. Esto no solo va en línea como un comportamiento predeterminado, y proporciona un mensaje de confirmación mucho más limpio, sino que también es algo más flexible con múltiples -m. Además, aunque parece específico de Windows y ha atraído comentarios relacionados con Windows, también funciona bien en Linux.
0xc0de
44

Haciendo algo como

git commit -m"test\ntest"

no funciona, pero algo como

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

funciona, pero no es muy bonito. Configura un git-commitlbcomando en tu PATHque hace algo como esto:

#!/bin/bash

message=$1

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

Y úsalo así:

git commitlb "line1\nline2\nline3"

Como advertencia, tengo la sensación de que la convención general es tener una línea de resumen como la primera línea, y luego dos saltos de línea, y luego un mensaje extendido en el mensaje de confirmación, por lo que hacer algo como esto rompería esa convención. Por supuesto, podrías hacer:

git commitlb "line1\n\nline2\nline3"
Peter Farmer
fuente
8
+1 fue esa convención general la que me hizo mirar por esta ruta. Gracias
Alan Whitelaw
39

De la documentación de Git :

-m <msg>
--message = <msg>
Usa el <msg> dado como mensaje de confirmación. Si -mse dan varias opciones, sus valores se concatenan como párrafos separados.

Entonces, si está buscando agrupar varios mensajes de confirmación, esto debería hacer el trabajo:

git commit -m "commit message1" -m "commit message2"
Saravanan M
fuente
Solución agnóstica (independiente de la cáscara). Gracias por esto. Necesitamos RTFM :)
Mat M
38

Espero que esto no conduzca demasiado lejos de la pregunta publicada, sino que configure el editor predeterminado y luego use

git commit -e

Podría ser mucho más cómodo.

Tobse
fuente
2
Esta debería ser la mejor respuesta.
hxpax
55
se puede dejar fuera el -eproducto y él todavía abrir el editor
djangonaut
Esta fue la respuesta que estaba buscando.
Tinmarino
28

No hay necesidad de complicar las cosas. Después de obtener la -m "text...siguiente línea presionando Enter. Cuando Enterse presiona >aparece. Cuando haya terminado, simplemente ponga "y presione 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 ...
blongho
fuente
1
¡Esta respuesta no está recibiendo suficiente amor!
cBlaine
1
Esta es una gran respuesta, las nuevas líneas se muestran correctamente en Github. La primera línea se muestra como un encabezado.
Yogesh Umesh Vaity
18

Uso zsh en una Mac y puedo publicar mensajes de confirmación de varias líneas entre comillas dobles ("). Básicamente sigo escribiendo y presionando la tecla de retorno para nuevas líneas, pero el mensaje no se envía a Git hasta que cierre las comillas y regrese .

Abizern
fuente
77
Puedes hacer lo mismo en bash.
Peter Farmer
17

En Bash / Zsh, simplemente puede usar saltos de línea literales entre comillas:

git commit -m 'Multi-line
commit
message'

Las citas ANSI-C también funcionan en Bash / Zsh:

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

También puede indicarle a Git que use un editor de su elección para editar el mensaje de confirmación. De los documentos en git-commit :

El editor utilizado para editar el mensaje de registro de confirmación se elegirá entre la GIT_EDITORvariable de entorno, la core.editorvariable de configuración, la VISUALvariable de entorno o la EDITOR variable de entorno (en ese orden). Ver git-var para más detalles.

Eugene Yarmash
fuente
5

Personalmente, me resulta más fácil modificar los mensajes de confirmación después del hecho en vi(o lo que sea el editor de git de su elección) en lugar de hacerlo en la línea de comandos, haciendo git commit --amendinmediatamente después git commit.

anfibio
fuente
66
Puede lograr este mismo resultado sin tener que enmendar simplemente usando git commit -e.
Nathan Hinchey
44
O simplemente git commit, y abrirá un editor con una plantilla de mensaje de confirmación.
Jim Stewart
5

Si estás usando Bash, presiona C-x C-e( Ctrl+ x Ctrl+e ), y se abrirá el comando actual en su editor preferido.

Puede cambiar el editor preferido ajustando VISUALy EDITOR.

Eso es lo que tengo en mi .bashrc:

export ALTERNATE_EDITOR=''
export EDITOR='emacsclient -t'
export VISUAL='emacsclient -c'
export SUDO_EDITOR='emacsclient -t'
Aleks-Daniel Jakimenko-A.
fuente
1
Entonces, ¿por qué alguien rechazó esto? Esta es la forma más conveniente de trabajar con comandos multilínea en bash, solo tiene que configurarlo una vez. He estado usando otras sugerencias estúpidas que se muestran en otras respuestas aquí, pero una vez que aprende a editar sus comandos en su editor de texto favorito, simplemente no hay vuelta atrás.
Aleks-Daniel Jakimenko-A.
1
Esto es tan desgarrador útil que no puedo creer que haya vivido mis últimos años sin esto.
SoonDead
2

Aquí hay una lista de soluciones fallidas en Windows con shell cmd.exe estándar (para ahorrarle tiempo de prueba y error):

  • git commit -m 'Hello Enter no funciona: no pedirá una nueva línea

  • git commit -m "Hello Enter ídem

  • git commit -m "Hello^ Enter ídem

  • git commit -m 'Hello^ Enter World'parece funcionar porque pregunta "¿Más?" y permite escribir una nueva línea, pero finalmente al hacerlo git logverás que sigue siendo un mensaje de una línea ...

TL; DR: incluso si en Windows, el análisis de la línea de comandos funciona de manera diferente y ^permite la entrada de varias líneas, no ayuda aquí.

Finalmente git commit -ees probablemente la mejor opción.

Basj
fuente
Simplemente no use esa triste, triste excusa para las ofertas de "shell" de Windows.
jthill
2

Lamentablemente, git no parece permitir ningún carácter de nueva línea en su mensaje. Ya hay varias soluciones razonables arriba, pero cuando se crean scripts, son molestas. Aquí los documentos también funcionan, pero también pueden ser un poco molestos de manejar (piense en archivos yaml)

Aquí esta lo que hice:

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

Si bien esto también sigue siendo feo, permite 'one-liners' que aún pueden ser útiles. Como generalmente las cadenas son variables o se combinan con variables, los feales pueden mantenerse al mínimo.

Oliver
fuente
1

No veo a nadie mencionando que si no proporciona un mensaje , se abrirá nano para usted (al menos en Linux) donde puede escribir varias líneas ...

Solo esto necesitaba:

git commit
Rodrigo Graça
fuente