ฉันจะใช้คอมไพล์ git ต่างกันได้อย่างไร?


235

ฉันใช้git-diffบนไฟล์ แต่การเปลี่ยนแปลงอยู่ที่ท้ายบรรทัดยาว

ถ้าฉันใช้ปุ่มลูกศรเพื่อเลื่อนไปทางขวามันจะเสียรหัสสีและยิ่งเส้นไม่เรียงกันยิ่งทำให้ยากต่อการติดตามการเปลี่ยนแปลง

มีวิธีการป้องกันปัญหานั้นหรือเพียงแค่ทำให้เส้นตัดแทน?

ฉันใช้ Git 1.5.5 ผ่าน mingw32


6
คุณอาจต้องการลอง 'git diff --color-words' มันไม่สามารถแก้ปัญหาการเลื่อนได้ แต่การเปลี่ยนแปลงคำถูกล้อมรอบด้วยบริบทในบรรทัดเดียว!
kevinf

7
การใช้คำว่า "fold" นั้นใช้งานได้ดี:git diff --color-words | fold
Amy

@ ฉันได้ลองใช้แล้วfoldแต่มันก็เอาสีออกไป เนื่องจากคุณระบุผมถือว่าคุณมีการจัดการที่จะผ่านสีให้--color-words foldอย่างไร?
Nero Gris

คำตอบ:


120

การแสดงผลของเอาท์พุทของgit diffถูกจัดการโดยเพจเจอร์ที่คุณกำลังใช้

โดยทั่วไปlessจะใช้ภายใต้ Linux

คุณสามารถบอกคอมไพล์ให้ใช้เพจเจอร์อื่นโดยการตั้งค่าGIT_PAGERตัวแปรสภาพแวดล้อม หากคุณไม่สนใจเกี่ยวกับการเพจ (ตัวอย่างเช่นเทอร์มินัลของคุณอนุญาตให้คุณเลื่อนกลับไป) คุณอาจลองตั้งค่าGIT_PAGERว่างให้ชัดเจนเพื่อหยุดมันโดยใช้เพจเจอร์ ภายใต้ Linux:

$ GIT_PAGER='' git diff

โดยไม่มีเพจเจอร์บรรทัดจะตัด

หากเทอร์มินัลของคุณไม่รองรับเอาต์พุตสีคุณสามารถปิดการทำงานนี้โดยใช้--no-colorอาร์กิวเมนต์หรือวางรายการในส่วนสีของไฟล์ git config ของคุณ

$ GIT_PAGER='' git diff --no-color

1
ฉันสามารถยืนยันได้ว่าการตั้งค่า GIT_PAGER เป็นช่องว่างจะทำให้บรรทัดถูกตัด นอกจากนี้ยังแทรกสัญลักษณ์ที่ทำให้อ่านลำบากเล็กน้อย แต่ถ้าจำเป็นฉันสามารถหาเพจเจอร์อื่นได้ดังนั้นยังคงเป็นคำตอบที่ถูกต้อง :) ขอบคุณ
Peter Boughton

1
มีสัญลักษณ์อะไรเพิ่มเติมที่ทำให้อ่านยาก ฉันอาจสามารถแก้ไขคำตอบเพื่อแก้ไขปัญหานี้ได้เช่นกัน
SpoonMeiser

ส่วนใหญ่ "<- [m" สำหรับแต่ละบรรทัดใหม่ (โดยที่ <- เป็นอักขระลูกศรเดียว) แต่ยังเป็นตัวทำเครื่องหมายที่ (ฉันคิดว่า) แต่ละสีจะเริ่มขึ้นเช่น "<- [1m" และ "<- [32m"
Peter Boughton

1
อาร์กิวเมนต์ - ไม่มีสีช่วยอะไรบ้างหรือไม่? ฉันไม่แน่ใจเกี่ยวกับอักขระขึ้นบรรทัดใหม่
SpoonMeiser

ใช่ขอบคุณที่ป้องกันไม่ให้เนื้อหาที่ไม่ต้องการปรากฏทั้งหมดดังนั้นสิ่งที่ขึ้นบรรทัดใหม่จะต้องเกี่ยวข้องกับสีด้วย
Peter Boughton

229

หรือถ้าคุณใช้น้อยกว่าเป็นเพจเจอร์เริ่มต้นเพียงพิมพ์-Sในขณะที่ดู diff เพื่อเปิดใช้งานการตัดอีกครั้ง


60
เคล็ดลับที่เกี่ยวข้องใช้--word-diffเพื่อดูไฮไลต์รหัสสีของคำที่เปลี่ยนแปลง
Josh Diehl

5
เพียงแค่ทราบสำหรับเรื่องนี้ตั้งแต่ฉันเห็นบางคนกำลังมีปัญหากับมัน - จะแตกต่างจาก -s (ตรวจสอบให้แน่ใจว่าคุณกำลังกดปุ่ม Shift + s)
longda

2
@JoshDiehl: ฉันหวังว่าคุณจะไม่รังเกียจ ... ฉันคิดว่า--word-diffส่วนที่ควรจะมีคำตอบของตัวเองในขณะที่มันทำให้ฉันเป็นจำนวนมากเพื่อช่วยแก้ปัญหาพื้นฐาน: การหาสิ่งที่เปลี่ยนแปลงในบรรทัดยาว ดังนั้นฉันได้ทำมันเป็นหนึ่ง: stackoverflow.com/a/19253759/313756
lindes

1
หมายเหตุ: นี่ดูเหมือนจะไม่ทำงานบน OS X (mavericks)
DilithiumMatrix

@zhermes การทำงานสำหรับฉันใน Mavericks มีน้อย 418 ให้แน่ใจว่าคุณพิมพ์-Sด้วยทุน S -sไม่ แสดงข้อความน้อยลง“ พับเส้นยาว (กด RETURN)” ที่ด้านล่างหลังจากฉันพิมพ์-Sแล้วกดย้อนกลับเปิดใช้งานการตัดคำ
Rory O'Kane

115

คุณยังสามารถใช้git configในการตั้งค่าวิทยุติดตามตัวเพื่อห่อ

$ git config core.pager 'less -r' 

ตั้งค่าการตั้งค่าเพจเจอร์สำหรับโครงการปัจจุบัน

$ git config --global core.pager 'less -r' 

ชุดเพจเจอร์ทั่วโลกสำหรับทุกโครงการ


3
ด้วย msysgit (1.8.1.msysgit.1) มันใช้งานได้สำหรับฉันโดยใช้เครื่องหมายคำพูดคู่ -git config --global core.pager "less -r"
kerim

นี่ทำให้ฉันห่ออย่างถาวรด้วย git diff บน OS X ขอบคุณ!
Thomson Comer

มันใช้งานได้ แต่ฉันไม่เข้าใจว่าทำไม มีคนอธิบายได้ไหม man less, -rอะไรเกี่ยวกับการตัดกล่าวว่า
Ciro Santilli 郝海东冠状病六四事件法轮功

@ThomsonComer '-r' เกี่ยวข้องกับการแสดงตัวควบคุมใน OS X ... คุณทำงานนี้ได้อย่างไร
DilithiumMatrix

ฉันจำไม่ได้ในตอนนี้ แต่ก็พบว่าการเชื่อมโยงบางอย่างที่อธิบายเพิ่มเติม: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...
Shoan

49

ด้วยเครดิตเต็มรูปแบบต่อJosh Diehlในความคิดเห็นต่อคำตอบนี้ฉันยังรู้สึกเช่นนี้ควรเป็นคำตอบของตัวเองดังนั้นเพิ่ม:

วิธีหนึ่งในการจัดการกับการเห็นความแตกต่างในสายยาวคือการใช้ diff-oriented diff สามารถทำได้ด้วย:

git diff --word-diff

ในกรณีนี้คุณจะได้รับผลต่างที่แตกต่างกันซึ่งจะแสดงสิ่งที่เปลี่ยนแปลงภายในบรรทัดโดยเฉพาะ

ตัวอย่างเช่นแทนที่จะได้รับสิ่งนี้:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

คุณอาจได้รับสิ่งนี้:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

หรือใช้ colorization แทนสิ่งนี้:

ผลลัพธ์ของ <code> git diff </code>

คุณอาจได้รับสิ่งนี้:

ผลลัพธ์ของ <code> git diff --word-diff </code>

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


6
มีตัวเลือกคู่สำหรับ--word-diff: color, และplain porcelainนอกจากนี้หนึ่งสามารถเปลี่ยน regex --word-diff-regexสำหรับขอบเขตของคำด้วย \S+เริ่มต้นที่ดูเหมือนจะเป็น ( v2.1.1 )
Michael - Where's Clay Shirky

3
--color-wordsดูเหมือนว่าจะจดชวเลข--word-diff=colorซึ่งเป็นสิ่งที่ดีเมื่อคุณเพิ่งดู diff ไม่แชร์
CivFan

นี่น่าสนใจและมีประโยชน์มาก ขอบคุณสำหรับการแบ่งปัน!
Darragh Enright

1
ฉันชอบ--word-diff=porcelainดีกว่า--word-diffเพราะporcelainจะจัดเรียงการเปลี่ยนแปลงในบรรทัดแยกขณะที่--word-diffทำให้การเปลี่ยนแปลงแบบอินไลน์ เส้นแยกช่วยให้คุณเห็นความแตกต่างได้ง่ายขึ้นเมื่อความแตกต่างนั้นบอบบาง
wisbucky

1
ชีวิตที่เปลี่ยนไปสำหรับไฟล์ LaTeX!
6005

30

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

git config --global core.pager 'less -+S'

วิธีนี้คุณไม่ต้องพิมพ์ขณะใช้งานน้อยลง

ไชโย


ทำงานกับฉันใน OS X 10.9.5 ขอบคุณ!
Jay Taylor

ในทำนองเดียวกันถ้าคุณต้องการปิดการตัดบรรทัดเมื่ออ่าน Git ต่างการตั้งค่าก็คล้ายกัน:git config --global core.pager 'less -S
Topher Hunt

19

เพิ่ง googled ขึ้นอันนี้ GIT_PAGER='less -r'ทำงานได้สำหรับฉัน


9
ดียิ่งขึ้น (สำหรับฉัน): less -R(อันที่จริงแล้วฉันใช้less -eiFRSXซึ่งแก้ปัญหาสีและลายเส้นด้วย)
cdunn2001

2
น้อยกว่า -R เป็นเหมือน -r แต่ลำดับ escape ของ ANSI "color" เท่านั้นที่จะถูกส่งออกในรูปแบบ "raw" ต่างจาก -r ลักษณะที่ปรากฏของหน้าจอจะถูกรักษาอย่างถูกต้องในกรณีส่วนใหญ่ (ผู้ชายน้อยลง)
richk

19

Mac OSX: ไม่มีคำตอบอื่นใดนอกจาก '-S' ของ 45 ในขณะที่ทำงานน้อยลงสำหรับฉัน ต้องใช้สิ่งต่อไปนี้เพื่อทำให้การตัดคำถาวร:

git config --global core.pager 'less -+$LESS -FRX'

มันก็ใช้ได้กับฉันเหมือนกัน แต่ฉันก็ไม่เข้าใจว่าทำไม สิ่งที่เป็น-+$LESSพารามิเตอร์ทำ? หากไม่มีการคอมไพล์กำหนดไว้ตัวแปรสภาพแวดล้อม LESS ของฉันยังไม่ถูกตั้งค่า
jakar

3
@ jakar: แล้วมันไม่ทำอะไรเลย ในบางสภาพแวดล้อม$LESSถูกตั้งค่าเป็นบางค่า (เช่นโดย a .loginหรือ a .profileหรือบางอย่าง) และตัวเลือกนั้นฉันคิดว่าแค่เพิ่มค่าเริ่มต้นแล้วเพิ่ม-FRXที่ด้านบนของสิ่งเหล่านั้น
naught101

สิ่งนี้ไม่ได้ผลสำหรับฉันใน OS X Mavericks $LESSไม่ได้ถูกกำหนดไว้
DilithiumMatrix

naught101 นั้นถูกต้องที่ + - $ LESS เพียงแค่รวมการตั้งค่าใด ๆ ที่อยู่ใน .login หรือ. profile (ถ้ามี) มันใช้งานได้ดีกับ Mavericks สำหรับฉัน แต่คุณสามารถละเว้นได้ถ้ามันทำให้เกิดปัญหา
John Lemberger

11

ตั้งแต่ Git 1.5.3 (ก.ย. 2550 )

--no-pagerตัวเลือกที่ได้รับการบริการ

git --no-pager diff

ฉันจะป้องกันไม่ให้คอมไพล์แตกต่างจากการใช้เพจเจอร์ได้อย่างไร?

ตัวอย่าง

เริ่มต้นด้วย v2.1, wrap เป็นค่าเริ่มต้น

บันทึกประจำรุ่น Git v2.1


1
ลิงก์บันทึกย่อประจำรุ่นได้ช่วยฉันด้วย แค่อยากรู้ว่าเกิดอะไรขึ้น (wr) ใน (g) ในคอมไพล์> 2 ^^
func0der

5

แปดปีต่อมาฉันพบคำตอบที่เหนือกว่าจาก/superuser/777617/line-wrapping-less-in-os-x-specifically-for-use-with-gith-diff :

git config core.pager `fold -w 80 | less`

ตอนนี้คุณแปะคอมไพล์ git ต่าง ๆ ผ่าน fold ก่อนแล้วถึงน้อยลง: ถูกห่อและมีความสูงของหน้าน้อยถูกต้องแล้วให้เน้นไวยากรณ์ต่อไป


5

เมื่อคุณใช้ "git diff" และมันแสดงหลายหน้า (คุณเห็น ":" ที่ท้ายหน้า) ในกรณีนี้คุณสามารถพิมพ์ "-S" และกด enter (S ควรเป็นตัวพิมพ์ใหญ่) มันจะสลับพับเส้นยาว


นี่เป็นวิธีที่ง่ายกว่าไม่ต้องยุ่งกับการตั้งค่าใด ๆ
chharvey

4

ไม่มีใครชี้เรื่องนี้จนถึงตอนนี้ มันค่อนข้างง่ายต่อการจดจำและไม่จำเป็นต้องทำการตั้งค่าเพิ่มเติมในการกำหนดค่า git

git diff --color | less -R

คำตอบที่ง่ายที่สุดในหน้านี้ สภาพแวดล้อมของฉัน - Oracle Linux 7.6 git diff --color | less -FRสำหรับการเปลี่ยนแปลงเล็กน้อยเมื่อไม่จำเป็นต้องเลื่อน
Rakesh N


3

ไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่gitkและgit-guiทั้งสองสามารถแสดงข้อมูลนี้และมีแถบเลื่อน


1

รายการการกำหนดค่าปัจจุบัน / เริ่มต้น:

  $ git config --global core.pager  
    less -FXRS -x2

จากนั้นอัปเดตและเลิกใช้ -S เช่น:

  $ git config --global core.pager 'less -FXR -x2'

- S: ทำให้เส้นยาวเกินความกว้างหน้าจอที่จะสับมากกว่าที่จะพับ


-1

เมื่อมีปัญหาฉันมักจะหันไปหา DiffMerge เครื่องมือ diff ที่ยอดเยี่ยมที่มีการเน้น diff ในบรรทัด นอกจากนี้ในเวอร์ชันล่าสุดพวกเขาเพิ่มโหมดเพื่อให้มีโหมดแนวนอน

ฉันไม่สามารถกำหนดค่า git ให้ใช้งานได้ ดังนั้นฉันต้องโคลนรอบ ๆ เพื่อให้ได้ทั้งสองเวอร์ชันของไฟล์ก่อน

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