Thêm ngắt dòng vào 'git commit -m' từ dòng lệnh


746

Tôi đang sử dụng Git từ dòng lệnh và đang cố gắng thêm ngắt dòng vào thông điệp cam kết (sử dụng git commit -m "") mà không đi vào Vim.

Điều này có thể không?


6
Lưu ý, đây là một liên kết tóm tắt các quy ước thông điệp cam kết tốt - github.com/erlang/otp/wiki/Writing-good-commit-messages nếu nó giúp được ai đó.
WeirdElfB0y

5
Một cái gì đó như GIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -esẽ giúp bạn tránh vim.
jotik

Câu trả lời:


694

Chắc chắn, làm thế nào nó được thực hiện phụ thuộc vào vỏ của bạn. Trong Bash, bạn có thể sử dụng các trích dẫn đơn xung quanh thông điệp và chỉ có thể để mở trích dẫn, điều này sẽ khiến Bash nhắc nhở cho một dòng khác, cho đến khi bạn đóng trích dẫn. Như thế này:

git commit -m 'Message

goes
here'

Ngoài ra, bạn có thể sử dụng "tài liệu ở đây" (còn được gọi là heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

53
@Peter Farmer trả lời sau về đề cập rằng quy ước Git rõ ràng là một cái gì đó như: 1 dòng tóm tắt, hai dòng ngắt, sau đó là một thông báo chi tiết.
Nick Spacek

4
Ngoài ra, xem bài viết dưới đây bởi @esse. Một trở về vận chuyển đơn giản làm các mẹo.
Hakan Oblari

6
@MohamadAli, trên Windows, phân tích cú pháp dòng lệnh hoạt động khác nhau
Simon Richter

2
@KelvinShadewing, vâng, nhưng với sự khác biệt mà quy tắc thay thế vỏ áp dụng cho thông điệp, vì vậy bạn cần phải thoát các ký hiệu đô la và các ký tự đại diện khác. Mặt khác, nó cho phép bạn sử dụng các biến.
Simon Richter

2
@Nikhil, nhiều chương trình hỗ trợ một dấu gạch ngang dưới dạng tên tệp có nghĩa là stdin hoặc stdout. Với tài liệu ở đây , gitlệnh có thể đọc văn bản tin nhắn từ stdin và -Ftùy chọn cung cấp tên tệp để đọc tin nhắn từ đó.
Simon Richter

514

Nếu bạn chỉ muốn, giả sử, một dòng tiêu đề và một dòng nội dung, bạn có thể sử dụng:

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

Lưu ý rằng điều này tạo ra các đoạn riêng biệt - không phải dòng. Vì vậy, sẽ có một dòng trống giữa mỗi hai -mdòng, ví dụ:

My head line

My content line.

80
Điều này có lợi ích khi làm việc trên Windows khi trích dẫn các thủ thuật được đề cập ở nơi khác không hoạt động. Riêng -mcho từng dòng. Đẹp!
ddotsenko

8
Các thông báo được tạo bằng phương pháp này hiển thị chính xác trên GitHub, GitHub cho Windows và TortoiseGit.
Richard

12
@ddotsenko đây là lợi ích của việc làm việc trên Linux / Mac, nơi chúng tôi có vỏ tốt =)
Ciro Santilli 病毒 审查 事件

7
Từ man git commit: -m <dir>, --message = <dir> Sử dụng <dir> đã cho làm thông điệp cam kết. Nếu nhiều tùy chọn được đưa ra, các giá trị của chúng được nối thành các đoạn riêng biệt.
Amedee Van Gasse

55
Lưu ý rằng điều này tạo ra các đoạn riêng biệt - không phải dòng. Vì vậy, sẽ có một dòng trống giữa mỗi hai -mdòng.
Ohad Schneider

398

Sử dụng Git từ dòng lệnh với Bash, bạn có thể làm như sau:

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

Chỉ cần gõ và nhấn Enterkhi bạn muốn một dòng mới, biểu tượng ">" có nghĩa là bạn đã nhấn Entervà có một dòng mới. Các câu trả lời khác cũng hoạt động.


6
Câu trả lời của Abizern đã làm rõ cho tôi lý do tại sao điều này hoạt động - shell Bash diễn giải phím <kbd> Enter </ kbd> dưới dạng một dòng mới cho đến khi ký tự trích dẫn kép đầu tiên được 'đóng' (với ký tự trích dẫn kép tiếp theo).
Kenny Evitt

1
Tôi phải đồng ý rằng đây là một giải pháp hiệu quả, dễ dàng và thiết thực hơn nhiều mà câu trả lời được chấp nhận. Nó hoạt động tốt với tôi bằng Git 1.8.2.1. +1 từ tôi.
crmpicco

Đây không phải là một chức năng đặc biệt của phím Enter , mà liên quan đến dấu ngoặc kép. Cho dù bạn sử dụng dấu ngoặc kép hay dấu ngoặc đơn không thực sự quan trọng, ngoại trừ việc mở rộng biến và thoát các ký tự đặc biệt - đó là lý do tại sao tôi chọn dấu ngoặc đơn trong câu trả lời của mình.
Simon Richter

2
Đừng sử dụng cái này trong zsh! Terminal sẽ đóng và bạn mất những gì bạn đã gõ.
laike9m

3
Hoạt động trong Gitbash cho Windows.
Omar Tariq

111

Bạn sẽ có thể sử dụng

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

Từ hướng dẫn Bash :

Các từ có dạng $ ' chuỗi ' được xử lý đặc biệt. Từ này mở rộng thành chuỗi , với các ký tự thoát dấu gạch chéo ngược được thay thế theo quy định của tiêu chuẩn ANSI C.

Điều này bao gồm hỗ trợ cho các dòng mới như được hiển thị ở trên, cộng với mã hex và Unicode và các mã khác. Đi đến phần được liên kết để xem danh sách các ký tự thoát dấu gạch chéo ngược.


@rsy: Bạn đang sử dụng phiên bản Bash nào? Bạn thấy gì khi bạn làm gì echo $'one\ntwo'?
Tạm dừng cho đến khi có thông báo mới.

1
rsy $ bash --version GNU bash, phiên bản 3.2.53 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Đầu ra của lệnh đó, như mong đợi, được hiển thị theo hai cách khác nhau dòng!
ccoutinho

Đối với tôi trên windows 7, đó là lựa chọn tốt nhất Cảm ơn bạn
Mohamad Ali

2
$ Là chìa khóa ở đây và tôi đã không nhận thấy nó ngay từ cái nhìn đầu tiên. Nếu không, tôi chỉ nhận được một \ n ở giữa tin nhắn của mình.
ChrisBob

1
Bạn thậm chí không phải sử dụng $ '...' cho toàn bộ chuỗi; sử dụng điều này chỉ xung quanh ký tự dòng mới sẽ hoạt động : git commit -m "first line"$'\n'"second line". Chỉ cần lưu ý bạn phải đóng chuỗi trước đó trước khi bắt đầu $'string'.
PlasmaBinturong

95

Thêm ngắt dòng vào cam kết Git của bạn

Hãy thử các cách sau để tạo thông báo cam kết nhiều dòng:

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

Sau đó xác minh những gì bạn đã làm:

git log -1

Bạn nên kết thúc với một cái gì đó như thế này:

Thông báo cam kết Git nhiều dòng trong PowerShell

Ảnh chụp màn hình là từ một ví dụ tôi thiết lập bằng PowerShell với Poshgit.


7
Câu trả lời tuyệt vời. Tôi đã tìm kiếm điều này từ lâu và đã thử rất nhiều cách khác nhau để định dạng tin nhắn cam kết Git của mình, nhưng cách này hiệu quả nhất. Tôi có thể xác nhận nó hoạt động tại dấu nhắc với Git 1.8.2.1.
crmpicco

1
Trong Powershell, bạn có thể thực hiện `n để ngắt dòng
Khu đô thị

2
Nó hoạt động rất tốt đối với tôi trong Git Bash cho Windows .
Ulysses Alves

1
Đây phải là câu trả lời được chọn vì đây là phương pháp tương thích nhất, điều này không dựa vào bất kỳ lời nhắc CLI cụ thể nào như một số đề xuất khác làm ..

1
Đây là một câu trả lời tốt hơn và nên được chọn là câu trả lời. Điều này không chỉ phù hợp như một hành vi mặc định và cung cấp một thông điệp cam kết sạch hơn nhiều mà còn linh hoạt hơn với nhiều -m. Ngoài ra, mặc dù có vẻ như các cửa sổ cụ thể và đã thu hút các bình luận liên quan đến windows, nhưng nó cũng hoạt động tốt trong Linux.
0xc0de

44

Làm một cái gì đó như

git commit -m"test\ntest"

không hoạt động, nhưng một cái gì đó như

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

hoạt động, nhưng nó không đẹp lắm. Bạn thiết lập một git-commitlblệnh trong PATHđó thực hiện một cái gì đó như thế này:

#!/bin/bash

message=$1

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

Và sử dụng nó như thế này:

git commitlb "line1\nline2\nline3"

Lời cảnh báo, tôi có cảm giác rằng quy ước chung là có một dòng tóm tắt là dòng đầu tiên, sau đó hai dòng ngắt, và sau đó là một thông điệp mở rộng trong thông điệp cam kết, vì vậy làm một cái gì đó như thế này sẽ phá vỡ quy ước đó. Tất nhiên bạn có thể làm:

git commitlb "line1\n\nline2\nline3"

8
+1 đó là quy ước chung khiến tôi nhìn xuống tuyến đường này. Cảm ơn
Alan Whitelaw

39

Từ tài liệu Git :

-m <
dir > --message = <dir>
Sử dụng <dir> đã cho làm thông điệp cam kết. Nếu nhiều -mtùy chọn được đưa ra, các giá trị của chúng được nối thành các đoạn riêng biệt.

Vì vậy, nếu bạn đang tìm cách nhóm nhiều thông điệp cam kết thì điều này sẽ thực hiện công việc:

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

Giải pháp bất khả tri (độc lập với vỏ). Cám ơn vì cái này. Chúng ta cần RTFM :)
Mat M

38

Tôi hy vọng điều này không dẫn quá xa câu hỏi được đăng, nhưng đặt trình chỉnh sửa mặc định và sau đó sử dụng

git commit -e

có thể thoải mái hơn nhiều


2
Điều này nên là anwser tốt nhất.
hxpax

5
bạn có thể bỏ đi -evà nó vẫn sẽ mở trình soạn thảo
djangonaut

Đây là câu trả lời tôi đang tìm kiếm.
Tinmarino

28

Không có nhu cầu phức tạp các công cụ. Sau khi -m "text...dòng tiếp theo được nhận bằng cách nhấn Enter. Khi Enterđược nhấn >xuất hiện. Khi bạn đã hoàn tất, chỉ cần đặt "và nhấn 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 ...

1
Câu trả lời này không đủ yêu!
cBlaine

1
Đây là một câu trả lời tuyệt vời, các dòng mới được hiển thị chính xác trên Github. Dòng đầu tiên hiển thị như một tiêu đề.
Yogesh Umesh Vaity

18

Tôi sử dụng zsh trên máy Mac và tôi có thể đăng thông báo cam kết nhiều dòng trong dấu ngoặc kép ("). Về cơ bản tôi tiếp tục gõ và nhấn return cho các dòng mới, nhưng tin nhắn không được gửi đến Git cho đến khi tôi đóng dấu ngoặc kép và trả lại .


7
Bạn có thể làm tương tự trong bash.
Nông dân Peter

17

Trong Bash / Zsh, bạn có thể chỉ cần sử dụng ngắt dòng theo nghĩa đen bên trong dấu ngoặc kép:

git commit -m 'Multi-line
commit
message'

Trích dẫn ANSI-C cũng hoạt động trong Bash / Zsh:

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

Bạn cũng có thể hướng dẫn Git sử dụng trình chỉnh sửa bạn chọn để chỉnh sửa thông điệp cam kết. Từ các tài liệu trên git-commit :

Trình chỉnh sửa được sử dụng để chỉnh sửa thông điệp nhật ký cam kết sẽ được chọn từ GIT_EDITORbiến môi trường, core.editorbiến cấu hình, VISUALbiến môi trường hoặc EDITOR biến môi trường (theo thứ tự đó). Xem git-var để biết chi tiết.


5

Cá nhân, tôi thấy dễ dàng nhất để sửa đổi các thông báo cam kết sau khi thực tế vi(hoặc bất cứ điều gì mà trình soạn thảo git của bạn chọn) thay vì trên dòng lệnh, bằng cách thực hiện git commit --amendngay sau đó git commit.


6
Bạn có thể đạt được kết quả tương tự mà không cần phải sửa đổi bằng cách chỉ sử dụng git commit -e.
Nathan Hinchey

4
Hoặc đơn giản git commit, và nó sẽ mở một trình soạn thảo với một mẫu thông báo cam kết.
Jim Stewart

5

Nếu bạn đang sử dụng Bash, hãy nhấn C-x C-e( Ctrl+ x Ctrl+e ) và nó sẽ mở lệnh hiện tại trong trình chỉnh sửa ưa thích của bạn.

Bạn có thể thay đổi trình chỉnh sửa ưa thích bằng cách điều chỉnh VISUALEDITOR.

Đó là những gì tôi có trong .bashrc:

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

1
Vậy tại sao ai đó lại đánh giá thấp điều này? Đây là cách thuận tiện nhất để làm việc với các lệnh multiline trong bash, bạn chỉ cần cấu hình nó đúng một lần. Tôi đã sử dụng các đề xuất ngu ngốc khác được hiển thị trong các câu trả lời khác ở đây, nhưng một khi bạn học cách chỉnh sửa các lệnh của mình trong trình soạn thảo văn bản yêu thích thì không còn cách nào khác.
Aleks-Daniel Jakimenko-A.

1
Điều này rất hữu ích, tôi không thể tin rằng tôi đã sống những năm qua mà không có điều này.
Sớm

2

Dưới đây là danh sách các giải pháp thất bại trên Windows với trình bao cmd.exe tiêu chuẩn (để giúp bạn tiết kiệm thời gian dùng thử và lỗi!):

  • git commit -m 'Hello Enter không hoạt động: nó sẽ không yêu cầu một dòng mới

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'Trông giống như làm việc vì nó hỏi "Nhiều hơn?" và cho phép viết một dòng mới, nhưng cuối cùng khi thực hiện git logbạn sẽ thấy đó vẫn là một tin nhắn một dòng ...

TL; DR: Ngay cả khi trên Windows, phân tích cú pháp dòng lệnh hoạt động khác nhau^ cho phép nhập nhiều dòng, nó không giúp ích gì ở đây.

Cuối cùng git commit -ecó lẽ là lựa chọn tốt nhất.


Chỉ cần không sử dụng cái cớ buồn, buồn đó cho các ưu đãi cửa sổ "vỏ".
jthill

2

Đáng buồn thay, git dường như không cho phép bất kỳ nhân vật dòng mới nào trong tin nhắn của nó. Có nhiều giải pháp hợp lý khác nhau đã được nêu ở trên, nhưng khi viết kịch bản, chúng gây khó chịu. Ở đây các tài liệu cũng hoạt động, nhưng cũng có thể hơi khó chịu khi xử lý (nghĩ các tệp yaml)

Đây là những gì tôi đã làm:

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

Mặc dù điều này vẫn còn xấu xí, nhưng nó cho phép 'một lớp' có thể vẫn hữu ích. Vì thông thường các chuỗi là các biến hoặc kết hợp với các biến, uglynes có thể được giữ ở mức tối thiểu.


1

Tôi không thấy ai đề cập đến điều đó nếu bạn không cung cấp một tin nhắn thì nó sẽ mở nano cho bạn (ít nhất là trong Linux) nơi bạn có thể viết nhiều dòng ...

Chỉ cần điều này:

git commit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.