Làm thế nào tôi nên sử dụng git diff cho các dòng dài?


235

Tôi đang chạy git-diff trên một tệp, nhưng thay đổi nằm ở cuối dòng dài.

Nếu tôi sử dụng các phím con trỏ để di chuyển sang phải, nó sẽ mất mã hóa màu và điều tệ hơn là các dòng không xếp hàng khiến cho việc theo dõi sự thay đổi trở nên khó khăn hơn.

Có cách nào để ngăn chặn vấn đề đó hay chỉ đơn giản là làm cho các đường bao bọc thay thế?

Tôi đang chạy Git 1.5.5 qua mingw32.


6
Bạn có thể muốn thử 'git diff --color-words', nó không giải quyết được vấn đề cuộn, nhưng thay đổi từ được bao quanh bởi ngữ cảnh trên một dòng!
kevinf

7
Sử dụng "gấp" có vẻ hoạt động khá tốt:git diff --color-words | fold
Amy

@Amy Tôi đã thử sử dụng foldnhưng nó loại bỏ màu sắc. Vì bạn chỉ định --color-wordstôi giả sử bạn quản lý để chuyển màu tới fold. Làm sao?
Nero gris

Câu trả lời:


120

Màn hình hiển thị đầu ra của git diff được xử lý bởi bất kỳ máy nhắn tin nào bạn đang sử dụng.

Thông thường, trong Linux, less sẽ được sử dụng.

Bạn có thể yêu cầu git sử dụng một máy nhắn tin khác bằng cách đặt GIT_PAGERbiến môi trường. Nếu bạn không bận tâm về phân trang (ví dụ: thiết bị đầu cuối của bạn cho phép bạn cuộn lại), bạn có thể thử cài đặt rõ ràng thành GIT_PAGERtrống để dừng nó bằng cách sử dụng máy nhắn tin. Trong Linux:

$ GIT_PAGER='' git diff

Không có máy nhắn tin, các dòng sẽ bọc.

Nếu thiết bị đầu cuối của bạn không hỗ trợ đầu ra màu, bạn cũng có thể tắt điều này bằng cách sử dụng --no-colorđối số hoặc đặt một mục trong phần màu của tệp cấu hình git của bạn.

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

1
Tôi có thể xác nhận rằng việc đặt GIT_PAGER thành trống sẽ khiến các dòng bị ngắt. Nó cũng chèn các ký hiệu làm cho nó hơi khó đọc, nhưng nếu cần tôi có thể tìm một máy nhắn tin khác, vì vậy vẫn là một câu trả lời hợp lệ. :) Cảm ơn.
Peter Boughton

1
Những biểu tượng nào nó thêm mà làm cho nó khó đọc? Tôi có thể chỉnh sửa câu trả lời của mình để giải quyết vấn đề đó.
SpoonMeiser

Chủ yếu là "<- [m" cho mỗi dòng mới (trong đó <- là một ký tự mũi tên), nhưng cũng có các điểm đánh dấu trong đó (tôi nghĩ) mỗi màu sẽ bắt đầu, như "<- [1m" và "<- [32m".
Peter Boughton

1
Đối số --no-color có giúp ích gì không? Tôi không chắc chắn về các nhân vật dòng mới.
SpoonMeiser

Vâng, cảm ơn, điều đó ngăn tất cả các nội dung không mong muốn xuất hiện, vì vậy những nội dung mới phải có liên quan đến màu sắc.
Peter Boughton

229

Hoặc nếu bạn sử dụng ít hơn như máy nhắn tin mặc định, chỉ cần gõ -Strong khi xem gói khác nhau để có thể hiển thị ít hơn.


60
mẹo liên quan, sử dụng --word-diffđể xem phần tô sáng được mã hóa bằng màu của các từ đã thay đổi
Josh Diehl

5
chỉ là một lưu ý cho điều này vì tôi thấy một số người gặp vấn đề với nó, -S khác với -s (đảm bảo bạn đang nhấn shift + s)
longda

2
@JoshDiehl: Tôi hy vọng bạn không phiền ... Tôi nghĩ --word-diffphần này xứng đáng có câu trả lời của riêng mình về vấn đề này, vì nó gây ấn tượng với tôi khi giúp giải quyết vấn đề tiềm ẩn: tìm ra điều gì đã thay đổi trên một hàng dài. Vì vậy, tôi đã làm cho nó một: stackoverflow.com/a/19253759/313756
bắt đầu

1
Lưu ý: điều này dường như không hoạt động trên OS X (mavericks).
DilithiumMatrix

@zhermes Nó hoạt động với tôi trong Mavericks, với ít hơn 418. Hãy chắc chắn rằng bạn đang gõ -Sbằng chữ S viết hoa chứ không phải -s. Ít hiển thị thông báo đường gấp nếp gấp (nhấn RETURN) ở phía dưới sau khi tôi nhập -S, sau đó nhấn Return cho phép gói.
Rory O'Kane

115

Bạn cũng có thể sử dụng git configđể thiết lập máy nhắn tin để bọc.

$ git config core.pager 'less -r' 

Đặt cài đặt máy nhắn tin cho dự án hiện tại.

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

Đặt máy nhắn tin trên toàn cầu cho tất cả các dự án


3
với msysgit (1.8.1.msysgit.1) nó hoạt động với tôi bằng cách sử dụng dấu ngoặc kép -git config --global core.pager "less -r"
kerim

Điều này đã giúp tôi gói vĩnh viễn với git diff trên OS X. cảm ơn!
Thomson Comer

Nó hoạt động, nhưng tôi không hiểu tại sao. Ai đó có thể giải thích? man less, -rkhông nói gì về việc gói.
Ciro Santilli 郝海东 冠状 病 事件

@ThomsonComer '-r' liên quan đến việc hiển thị các ký tự điều khiển trong OS X ... Làm thế nào để bạn làm việc này?
DilithiumMatrix

Tôi không thể nhớ chắc chắn bây giờ. Nhưng không tìm thấy một số liên kết để giải thích nó hơn: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...
Shoan

49

Với sự tín nhiệm đầy đủ cho Josh Diehl trong một bình luận cho câu trả lời này , tuy nhiên tôi cảm thấy như đây phải là một câu trả lời cho chính nó, vì vậy hãy thêm nó:

Một cách để đối phó với việc nhìn thấy sự khác biệt trong các dòng dài là sử dụng một từ định hướng từ. Điều này có thể được thực hiện với:

git diff --word-diff

Trong trường hợp này, bạn sẽ nhận được một đầu ra khác biệt đáng kể, điều đó cho bạn thấy cụ thể những gì đã thay đổi trong một dòng.

Ví dụ, thay vì nhận được một cái gì đó như thế này:

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

Bạn có thể nhận được một cái gì đó như thế này:

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

Hoặc, với màu sắc, thay vì này:

kết quả của chỉ <code> git diff </ code>

Bạn có thể nhận được điều này:

kết quả của <code> git diff --word-diff </ code>

Bây giờ, nếu bạn đang so sánh một dòng thực sự dài, bạn vẫn có thể gặp vấn đề với tình huống máy nhắn tin mà bạn mô tả ban đầu và đã được giải quyết, rõ ràng là thỏa mãn, trong các câu trả lời khác. Hy vọng rằng điều này cung cấp cho bạn một công cụ mới, tuy nhiên, để dễ dàng xác định những gì trên dòng đã thay đổi.


6
Có một vài tùy chọn cho --word-diff: color, plain, và porcelain. Ngoài ra, người ta có thể thay đổi regex cho ranh giới từ với --word-diff-regex. Mặc định có vẻ là \S+. ( v2.1.1 )
Michael - Clay Shirky ở đâu

3
--color-wordscó vẻ là tốc ký --word-diff=color, thật tuyệt khi bạn chỉ xem khác biệt, không chia sẻ nó.
CivilFan 4/12/2015

Ah, điều này thật thú vị và có khả năng rất hữu ích. Cám ơn vì đã chia sẻ!
Darragh

1
Tôi thích --word-diff=porcelaintốt hơn --word-diffporcelainsẽ sắp xếp các thay đổi trên các dòng riêng biệt, trong khi --word-diffđặt các thay đổi nội tuyến. Các dòng riêng biệt cho phép bạn nhìn thấy sự khác biệt dễ dàng hơn khi sự khác biệt là tinh tế.
wvducky

1
Thay đổi cuộc sống cho các tập tin LaTeX!
6005

30

Để sử dụng ít hơn như máy nhắn tin và thực hiện ngắt dòng vĩnh viễn, bạn chỉ cần bật tùy chọn đường dài gấp:

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

Bằng cách này, bạn không phải gõ nó trong khi sử dụng ít hơn.

Chúc mừng


Làm việc cho tôi trên OS X 10.9.5. Cảm ơn!
Jay Taylor

Tương tự, nếu bạn muốn gói DISABLE khi đọc Git diffs, cài đặt tương tự:git config --global core.pager 'less -S
Topher Hunt

19

Chỉ cần googled lên cái này. GIT_PAGER='less -r'làm việc cho tôi


9
Thậm chí tốt hơn (đối với tôi): less -R(Trên thực tế, tôi sử dụng less -eiFRSX, giải quyết các vấn đề về màu sắc và đường bao quanh.)
cdunn2001

2
less -R giống như -r, nhưng chỉ các chuỗi thoát "màu" ANSI được xuất ra ở dạng "thô". Không giống như -r, giao diện màn hình được duy trì chính xác trong hầu hết các trường hợp. (người đàn ông ít hơn)
richk

19

Mac OSX: Không có câu trả lời nào khác ngoại trừ ai đó '' -S 'trong khi ít hoạt động hơn đối với tôi. Phải mất những điều sau đây để thực hiện từ-quấn liên tục:

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

Điều này cũng làm việc cho tôi, nhưng tôi không hiểu tại sao. Là gì -+$LESSthông số làm gì? Trừ khi git định nghĩa nó, biến môi trường LESS của tôi thậm chí không được đặt.
jakar

3
@jakar: vậy thì không làm gì cả. Trong một số môi trường, $LESSđược đặt thành một số giá trị (ví dụ: a .loginhoặc a .profilehoặc một cái gì đó), và tôi nghĩ rằng, chỉ cần thêm các giá trị mặc định, và sau đó thêm -FRXvào trên các giá trị đó.
ness101

Điều này không làm việc cho tôi trên OS X Mavericks, $LESSkhông xác định.
DilithiumMatrix

naught101 là chính xác rằng + - $ LESS chỉ đơn giản bao gồm mọi cài đặt nằm trong .login hoặc .profile (nếu có). Nó hoạt động tốt trên Mavericks đối với tôi, nhưng bạn có thể bỏ qua nó, nếu nó gây ra vấn đề.
John Lemberger



5

Khi bạn đang sử dụng "git diff" và nó hiển thị một vài trang (bạn thấy ":" ở cuối trang) trong trường hợp này, bạn có thể nhập "-S" và nhấn enter. (S nên viết hoa). nó sẽ chuyển các hàng dài.


cách này dễ hơn là phải làm rối với bất kỳ cài đặt nào
chharvey

4

Không ai chỉ ra điều này cho đến bây giờ. Nó khá đơn giản để nhớ và không cần cấu hình thêm trong cấu hình git

git diff --color | less -R

Cho đến nay, đơn giản nhất trong tất cả các câu trả lời trong trang này. Môi trường của tôi - Oracle Linux 7.6. git diff --color | less -FRcho những thay đổi nhỏ khi không cần cuộn
Rakesh N

3

Bạn có thể chỉ cần chuyển đầu ra của git diff sang nhiều hơn:

git diff | more

3

Không phải là một giải pháp hoàn hảo, nhưng gitkvừa git-guicó thể hiển thị thông tin này, vừa có thanh cuộn.


1

liệt kê cấu hình hiện tại / mặc định:

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

sau đó cập nhật và bỏ qua -S như:

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

-S: Làm cho các dòng dài hơn chiều rộng màn hình bị cắt thay vì gấp lại.


-1

Khi gặp khó khăn, tôi thường dùng đến DiffMerge. Công cụ tìm khác biệt tuyệt vời có làm nổi bật khác biệt trong dòng. Ngoài ra, trong các phiên bản mới nhất, họ đã thêm một chế độ để có chế độ nằm ngang.

Tôi đã không thể cấu hình git để sử dụng nó, mặc dù. Vì vậy, tôi phải tìm kiếm trước để có được cả hai phiên bản của tập tin.

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.