เพิ่มตัวแบ่งบรรทัดไปที่ 'git commit -m' จากบรรทัดคำสั่ง


746

ฉันใช้ Git จากบรรทัดคำสั่งและกำลังพยายามเพิ่มตัวแบ่งบรรทัดในข้อความยืนยัน (ใช้git commit -m "") โดยไม่ต้องเข้าไปในกลุ่ม

เป็นไปได้ไหม


6
นี่คือลิงค์ที่สรุปอนุสัญญาข้อความที่ดี - github.com/erlang/otp/wiki/Writing-good-commit-messagesถ้ามันช่วยคน
WeirdElfB0y

5
สิ่งที่ต้องการจะช่วยให้คุณหลีกเลี่ยงGIT_EDITOR="emacs" git commit -m 'paragraph1' -m 'paragraph2' -e vim
jotik

คำตอบ:


693

แน่นอนว่ามันทำอย่างไรขึ้นอยู่กับเปลือกของคุณ ใน Bash คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวรอบข้อความและปล่อยให้เครื่องหมายคำพูดเปิดไว้ซึ่งจะทำให้ Bash พรอมต์สำหรับบรรทัดอื่นจนกว่าคุณจะปิดคำพูด แบบนี้:

git commit -m 'Message

goes
here'

หรือคุณสามารถใช้ "เอกสารที่นี่" (หรือที่เรียกว่า heredoc):

git commit -F- <<EOF
Message

goes
here
EOF

53
@Peter Farmer คำตอบในภายหลังกล่าวว่า Git เห็นได้ชัดว่าการประชุมแบบ: 1 บรรทัดสำหรับการสรุปแบ่งสองบรรทัดแล้วข้อความรายละเอียด
Nick Spacek

4
นอกจากนี้โปรดดูด้านล่างโพสต์โดย @esse ผลตอบแทนการขนส่งที่เรียบง่ายไม่หลอกลวง
Hakan Ensari

6
@MohamadAli บน Windows แยกวิเคราะห์ commandline ทำงานแตกต่างกัน
Simon Richter

2
@KelvinShadewing ใช่ แต่ด้วยความแตกต่างที่กฎการแทนที่เชลล์ใช้กับข้อความดังนั้นคุณต้องหลีกเลี่ยงสัญญาณดอลลาร์และตัวละครอื่น ๆ ในทางกลับกันจะช่วยให้คุณใช้ตัวแปร
Simon Richter

2
@Nikhil หลาย ๆ โปรแกรมสนับสนุนขีดกลางเดียวเป็นชื่อไฟล์หมายถึง stdin หรือ stdout กับเอกสารที่นี่ที่gitคำสั่งสามารถอ่านข้อความจาก stdin และ-Fตัวเลือกที่ช่วยให้ชื่อไฟล์เพื่ออ่านข้อความจาก
Simon Richter

514

หากคุณต้องการพูดบรรทัดแรกและบรรทัดเนื้อหาคุณสามารถใช้:

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

โปรดทราบว่าสิ่งนี้สร้างย่อหน้าแยกกัน - ไม่ใช่บรรทัด ดังนั้นจะมีบรรทัดว่างระหว่างแต่ละสอง-mบรรทัดเช่น:

My head line

My content line.

80
สิ่งนี้มีประโยชน์ในการทำงานกับ Windows โดยที่เทคนิคการอ้างถึงที่อื่นไม่ทำงาน แยกกัน-mสำหรับแต่ละบรรทัด ดี!
ddotsenko

8
ข้อความที่สร้างโดยใช้วิธีนี้แสดงอย่างถูกต้องใน GitHub, GitHub สำหรับ Windows และ TortoiseGit
Richard

11
@ddotsenko นี้เป็นผลประโยชน์ของการทำงานบน Linux / Mac ที่เรามีเปลือกที่ดี =)
Ciro Santilli冠状病毒审查六四事件法轮功

7
จากman git commit: -m <msg>, --message = <msg> ใช้ <msg> ที่ให้ไว้เป็นข้อความคอมมิท หากมีการกำหนดตัวเลือกหลายเมตรค่าของพวกเขาจะถูกตัดแบ่งเป็นย่อหน้าแยกกัน
Amedee Van Gasse

55
โปรดทราบว่าสิ่งนี้สร้างย่อหน้าแยกกัน- ไม่ใช่บรรทัด ดังนั้นจะมีบรรทัดว่างระหว่างแต่ละสอง-mบรรทัด
Ohad Schneider

398

การใช้ Git จากบรรทัดคำสั่งด้วย Bash คุณสามารถทำสิ่งต่อไปนี้:

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

เพียงพิมพ์และกดEnterเมื่อคุณต้องการขึ้นบรรทัดใหม่สัญลักษณ์ ">" หมายความว่าคุณได้กดEnterแล้วและมีบรรทัดใหม่ คำตอบอื่น ๆ ก็ใช้ได้เช่นกัน


6
คำตอบของ Abizern ทำให้ฉันเข้าใจว่าทำไมงานนี้ - เชลล์ Bash ตีความ <kbd> ป้อน </kbd> กดปุ่มเป็นบรรทัดใหม่จนกระทั่งอักขระเครื่องหมายคำพูดสองตัวแรกคือ 'ปิด' (พร้อมด้วยอักขระเครื่องหมายคำพูดคู่ถัดไป)
Kenny Evitt

1
ฉันต้องยอมรับว่านี่เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นง่ายขึ้นและใช้งานได้จริงซึ่งเป็นคำตอบที่ยอมรับได้ มันใช้งานได้ดีสำหรับฉันโดยใช้ Git 1.8.2.1 +1 จากฉัน
crmpicco

นี่ไม่ใช่ฟังก์ชันพิเศษของปุ่มEnterแต่เกี่ยวข้องกับคำพูด ไม่ว่าคุณจะใช้เครื่องหมายคำพูดคู่หรือคำพูดเดียวไม่สำคัญยกเว้นการขยายตัวของตัวแปรและการหลีกเลี่ยงอักขระพิเศษ - นั่นเป็นเหตุผลที่ฉันเลือกคำพูดเดียวในคำตอบของฉัน
Simon Richter

2
อย่าใช้สิ่งนี้ใน zsh! เทอร์มินัลจะปิดลงและคุณสูญเสียสิ่งที่คุณพิมพ์
laike9m

3
ทำงานใน Gitbash สำหรับ Windows
Omar Tariq

111

คุณควรจะสามารถใช้

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

จากคู่มือ Bash :

คำของฟอร์ม ' string ' ได้รับการปฏิบัติเป็นพิเศษ คำนี้ขยายออกเป็น สตริงด้วยอักขระเครื่องหมายทับขวาทับกลับแทนที่ตามที่ระบุโดยมาตรฐาน ANSI C

ซึ่งรวมถึงการสนับสนุนการขึ้นบรรทัดใหม่ตามที่แสดงด้านบนรวมทั้งรหัส hex และ Unicode และอื่น ๆ ไปที่ส่วนที่เชื่อมโยงเพื่อดูรายการของอักขระเครื่องหมายแบคสแลช


@rsy: คุณใช้ Bash เวอร์ชันใดอยู่ สิ่งที่คุณเห็นเมื่อคุณทำecho $'one\ntwo'?
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
rsy $ bash - รุ่น GNU bash, รุ่น 3.2.53 (1) - ปล่อย (x86_64-apple-darwin13) ลิขสิทธิ์ (C) 2007 มูลนิธิซอฟต์แวร์เสรี 2007, Inc. ผลลัพธ์ของคำสั่งนั้นเป็นไปตามที่คาดไว้ เส้น!
ccoutinho

สำหรับฉันบน windows 7 เป็นตัวเลือกที่ดีที่สุดขอบคุณ
Mohamad Ali

2
$ เป็นกุญแจสำคัญที่นี่และฉันไม่ได้สังเกตมันในตอนแรก มิฉะนั้นฉันจะได้รับ \ n ตรงกลางข้อความของฉัน
ChrisBob

1
คุณไม่จำเป็นต้องใช้ $ '... ' สำหรับสตริงทั้งหมด; ใช้นี้เพียงรอบอักขระ newline git commit -m "first line"$'\n'"second line"จะทำงาน: $'string'ทราบเพียงคุณจำเป็นต้องปิดสตริงก่อนหน้านี้ก่อนที่จะเริ่มของคุณ
PlasmaBinturong

95

การเพิ่มตัวแบ่งบรรทัดใน 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

คุณควรท้ายด้วยสิ่งนี้:

ข้อความคอมมิท Git หลายบรรทัดใน PowerShell

ภาพหน้าจอมาจากตัวอย่างที่ฉันตั้งค่าโดยใช้ PowerShell กับ Poshgit


7
คำตอบที่ยอดเยี่ยม ฉันได้ลองดูสิ่งนี้มานานแล้วและลองวิธีการจัดรูปแบบข้อความคอมมิท Git ที่หลากหลาย แต่วิธีนี้ดีที่สุด ฉันสามารถยืนยันได้ว่าทำงานได้ทันทีที่มี Git 1.8.2.1
crmpicco

1
ใน PowerShell คุณสามารถทำได้ `n สำหรับการขึ้นบรรทัดใหม่
Ecropolis

2
มันทำงานได้อย่างมากสำหรับผมในGit Bash สำหรับ Windows
Ulysses Alves

1
นี่ควรเป็นคำตอบที่เลือกเนื่องจากเป็นวิธีที่เข้ากันได้มากที่สุดโดยไม่ต้องพึ่งพาการแจ้งเตือน CLI ที่เฉพาะเจาะจงเหมือนคำแนะนำอื่น ๆ ..

1
นี่เป็นคำตอบที่ดีกว่าและควรเลือกเป็นคำตอบ ไม่เพียงแค่นี้เป็นไปตามพฤติกรรมเริ่มต้นและให้สารทำความสะอาดมากขึ้น แต่ยังมีความยืดหยุ่นมากขึ้นด้วยหลาย -m นอกจากนี้แม้ว่าจะดูเฉพาะหน้าต่างและดึงดูดความคิดเห็นที่เกี่ยวข้องกับ windows แต่ก็ใช้งานได้ดีใน Linux
0xc0de

44

ทำสิ่งที่ชอบ

git commit -m"test\ntest"

ใช้งานไม่ได้ แต่สิ่งที่ชอบ

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

ใช้งานได้ แต่มันก็ไม่ได้สวยมาก คุณตั้งค่าgit-commitlbคำสั่งในสิ่งที่คุณPATHทำสิ่งนี้:

#!/bin/bash

message=$1

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

และใช้มันเช่นนี้

git commitlb "line1\nline2\nline3"

คำเตือนฉันมีความรู้สึกว่าการประชุมทั่วไปคือการมีบรรทัดสรุปเป็นบรรทัดแรกแล้วแบ่งสองบรรทัดแล้วข้อความขยายในข้อความการกระทำดังนั้นการทำสิ่งนี้จะทำลายการประชุมนั้น แน่นอนคุณสามารถทำได้:

git commitlb "line1\n\nline2\nline3"

8
+1 นั่นคือการประชุมทั่วไปที่ทำให้ฉันมองเส้นทางนี้ ขอบคุณ
Alan Whitelaw

39

จากเอกสาร Git :

-m <msg>
--message = <msg>
ใช้ <msg> ที่กำหนดเป็นข้อความการส่ง หาก-mมีการกำหนดหลายตัวเลือกค่าเหล่านั้นจะถูกต่อกันเป็นย่อหน้าแยกกัน

ดังนั้นหากคุณกำลังมองหาการรวมกลุ่มหลายข้อความที่ยอมรับได้สิ่งนี้ควรทำงาน:

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

วิธีแก้ปัญหาแบบไม่เชื่อเรื่องพระเจ้า (เชลล์อิสระ) ขอบคุณสำหรับสิ่งนี้. เราจำเป็นต้อง RTFM :)
Mat M

38

ฉันหวังว่านี่จะไม่นำไปไกลจากคำถามที่โพสต์ แต่ตั้งค่าตัวแก้ไขเริ่มต้นแล้วใช้

git commit -e

อาจจะสะดวกสบายมากขึ้น


2
อันนี้น่าจะเป็น anwser ที่ดีที่สุด
hxpax

5
คุณสามารถออกไป-eและมันจะยังคงเปิดตัวแก้ไข
djangonaut

อันนี้เป็นคำตอบที่ฉันต้องการ
Tinmarino

28

ไม่จำเป็นต้องมีอะไรซับซ้อน หลังจากที่บรรทัดถัดไปเป็นอากาศโดยการกด-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 ...

1
คำตอบนี้ไม่ได้รับความรักเพียงพอ!
cBlaine

1
นี่เป็นคำตอบที่ยอดเยี่ยมบรรทัดใหม่จะแสดงอย่างถูกต้องบน Github บรรทัดแรกแสดงเป็นหัวเรื่อง
Yogesh Umesh Vaity

18

ฉันใช้ zsh บน Mac และฉันสามารถโพสต์ข้อความส่งหลายบรรทัดภายในเครื่องหมายคำพูดคู่ (") ได้โดยทั่วไปฉันพิมพ์และกดส่งกลับสำหรับบรรทัดใหม่ แต่ข้อความไม่ได้ถูกส่งไปยัง Git จนกว่าฉันจะปิดคำพูดและกลับ .


7
คุณสามารถทำเช่นเดียวกันในทุบตี
Peter Farmer

17

ใน Bash / Zsh คุณสามารถใช้ตัวแบ่งบรรทัดตามตัวอักษรในเครื่องหมายคำพูด:

git commit -m 'Multi-line
commit
message'

การอ้างอิง ANSI-Cยังทำงานใน Bash / Zsh ด้วย:

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

นอกจากนี้คุณยังสามารถสั่งให้ Git ใช้เครื่องมือแก้ไขที่คุณเลือกเพื่อแก้ไขข้อความยืนยัน จากเอกสารที่ใช้คอมไพล์ :

ตัวแก้ไขที่ใช้เพื่อแก้ไขข้อความบันทึกการกระทำจะถูกเลือกจาก GIT_EDITORตัวแปรสภาพแวดล้อมตัวแปรการcore.editorกำหนดค่าตัวแปรVISUALสภาพแวดล้อมหรือEDITOR ตัวแปรสภาพแวดล้อม (ตามลำดับ) ดูgit-varสำหรับรายละเอียด


5

ส่วนตัวผมพบว่ามันง่ายที่สุดในการปรับเปลี่ยนการกระทำข้อความหลังจากที่ความจริงในvi(หรือสิ่งที่แก้ไขคอมไพล์ที่คุณเลือกเป็น) มากกว่าในบรรทัดคำสั่งโดยการทำทันทีหลังจากgit commit --amendgit commit


6
git commit -eคุณสามารถบรรลุผลเดียวกันนี้ได้โดยไม่ต้องแก้ไขโดยเพียงแค่ใช้
Nathan Hinchey

4
หรือเพียงแค่git commitและมันจะเปิดตัวแก้ไขด้วยแม่แบบข้อความกระทำ
จิมสจ๊วต

5

หากคุณใช้ Bash ให้กดC-x C-e( Ctrl+ x Ctrl+e ) แล้วคำสั่งนั้นจะเปิดคำสั่งปัจจุบันในเครื่องมือแก้ไขที่คุณต้องการ

คุณสามารถเปลี่ยนแก้ไขที่แนะนำโดยการปรับเปลี่ยนและVISUALEDITOR

นั่นคือสิ่งที่ฉันมีใน.bashrc:

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

1
เหตุใดบางคนจึงลงคะแนนสิ่งนี้ นี่เป็นวิธีที่สะดวกที่สุดในการทำงานกับคำสั่งหลายบรรทัดใน bash คุณเพียงแค่ต้องกำหนดค่าทันที ฉันใช้คำแนะนำโง่อื่น ๆ ที่แสดงในคำตอบอื่น ๆ ที่นี่ แต่เมื่อคุณเรียนรู้ที่จะแก้ไขคำสั่งของคุณในโปรแกรมแก้ไขข้อความที่คุณโปรดปรานไม่มีทางย้อนกลับ
Aleks-Daniel Jakimenko-A

1
สิ่งนี้มีประโยชน์อย่างมากที่ฉันไม่อยากจะเชื่อเลยว่าฉันมีชีวิตอยู่ในช่วงหลายปีที่ผ่านมาโดยปราศจากสิ่งนี้
เร็ว ๆ นี้อ่าน

2

นี่คือรายการวิธีแก้ปัญหาที่ล้มเหลวใน Windows พร้อมเชลล์ cmd.exe มาตรฐาน (เพื่อช่วยคุณประหยัดเวลาในการทดลองและข้อผิดพลาด!):

  • git commit -m 'Hello Enter ไม่ทำงาน: มันจะไม่ขอขึ้นบรรทัดใหม่

  • git commit -m "Hello Enter idem

  • git commit -m "Hello^ Enter idem

  • git commit -m 'Hello^ Enter World'ดูเหมือนว่าจะทำงานเพราะถามว่า"เพิ่มเติมหรือไม่"และอนุญาตให้เขียนบรรทัดใหม่ แต่ในที่สุดเมื่อทำgit logคุณจะเห็นว่ามันยังคงเป็นข้อความบรรทัดเดียว ...

TL; DR: แม้ว่าใน Windows การแยกวิเคราะห์บรรทัดคำสั่งจะใช้ได้ผล แตกต่างกันและ^อนุญาตให้ป้อนหลายก็ไม่ได้ช่วยอะไร

ในที่สุดgit commit -eอาจเป็นตัวเลือกที่ดีที่สุด


อย่าใช้ข้อแก้ตัวที่น่าเศร้าและน่าเศร้าสำหรับข้อเสนอ windows "shell"
jthill

2

น่าเศร้าที่คอมไพล์ดูเหมือนจะไม่อนุญาตให้มีอักขระขึ้นบรรทัดใหม่ในข้อความ มีวิธีแก้ปัญหาที่สมเหตุสมผลอยู่ด้านบน แต่เมื่อเขียนสคริปต์สิ่งเหล่านี้น่ารำคาญ ที่นี่เอกสารยังใช้งานได้ แต่อาจเป็นเรื่องที่น่ารำคาญนิดหน่อยที่จะจัดการ

นี่คือสิ่งที่ฉันทำ:

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

แม้ว่าสิ่งนี้จะยังคงน่าเกลียด แต่ก็อนุญาตให้ 'หนึ่ง liners' ซึ่งอาจมีประโยชน์ยัง โดยปกติสตริงจะเป็นตัวแปรหรือรวมกับตัวแปรค่าความอัปลักษณ์อาจถูกเก็บไว้ให้น้อยที่สุด


1

ฉันไม่เห็นใครพูดถึงว่าถ้าคุณไม่ได้ให้ข้อความมันจะเปิดนาโนให้คุณ (อย่างน้อยใน Linux) ที่คุณสามารถเขียนหลายบรรทัด ...

จำเป็นเท่านั้น:

git commit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.