Làm thế nào để có được diff làm việc như git-diff?


147

Tôi thích định dạng đầu ra của git diff. Màu sắc và biểu diễn +/ -thay đổi giữa các dòng dễ đọc hơn GNU diff.

Tôi có thể chạy git diffbằng --no-indexcờ bên ngoài một repo git và nó hoạt động tốt. Tuy nhiên, dường như thiếu --excludetùy chọn để loại trừ các tệp hoặc thư mục con khỏi đệ quy diff.

Có cách nào để có được điều tốt nhất của cả hai thế giới không? (tùy chọn màu và +/ -định dạng git diff--excludetùy chọn của GNU diff).

Tôi đã thử nghiệm colordiff, nhưng tôi vẫn thích định dạng đầu ra củagit diff


1
Để làm cho màu xanh cho bổ sung màu xanh lá cây, thay đổi newtexttrong /etc/colordiff. Tôi nghĩ git sử dụng màu xanh lá cây?
Rudie

1
Tôi chưa bao giờ nghe nói về cờ --no-index cho đến bây giờ. Tôi vừa mới sử dụng nó để so sánh đầu ra từ git show với diff của hai tệp - cảm ơn vì điều đó!
AJM-Rebstate-Monica

Câu trả lời:


175

Tôi không biết làm thế nào để làm màu nhưng điều này sẽ làm +/-hơn là <>.

diff -u file1 file2

6
Thật tuyệt, điều này kết hợp với colordiff giúp tôi đủ gần với những gì tôi muốn. Đoán tôi cần phải cuộn xuống trang người đàn ông lần sau ... Cảm ơn!
Mzzzzzz

13
Một cách đơn giản để có được màu sắc với diff -u, cũng là chuyển đầu ra sang tig, trình xem git repo dòng lệnh : diff -u file1 file2 | tig.
Samuel Lampa

3
Cài đặt colordifftừ kho apt / yum / pacman của bạn và sử dụng nó.
iBug

Cần thiết để kích hoạt Gói bổ sung cho Enterprise Linux (EPEL) trên Amazon Linux để cài đặt colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/,
Pat Myron

1
Bên cạnh đó colordiff, bạn cũng có thể có được màu sắc bằng vimcách xác định cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

Bạn cũng có thể sử dụng git diff --no-index -- A B(thông qua manpage ).


1
+1, nhưng thật đáng buồn, điều này không hoạt động nếu một trong các tệp là một liên kết tượng trưng.
Emil Lundberg

2
+1 Điều này rất hữu ích vì nó chỉ ra cách tạo báo cáo git trong đó hai tệp được theo dõi ABkhác nhau so với nhau thay vì nơi mỗi tệp đã được sửa đổi so với sửa đổi tương ứng trước đó.
J. Katzwinkel

@EmilLundberg: hoạt động với tôi với các liên kết tượng trưng trong git 1.9.1 trên Linux. Tôi không biết liệu các phiên bản trước đó có bị hỏng hay không.
kkm

3
git diff --no-indexlà tuyệt vời, nhưng như OP đã chỉ ra, nó thiếu --excludecờ, vì vậy nó thường rất hữu ích.
Ken Williams

25
  1. Cài đặt colordiff .

  2. Cập nhật ~ / .colordiffrc của bạn (sao chép / etc / colordiffrc trước, nếu cần):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Sử dụng colordiff -u file1 file2cho hai tệp hoặc colordiff -ruN path1 path2để so sánh đệ quy đường dẫn.

Nó không giống hệt nhau, nhưng nó rất gần.


18

Đây là những gì tôi đề nghị và nó khá gần

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Bạn sẽ phải cài đặt cái này
    • brew install colordiff trên máy Mac của tôi.
    • port install colordiff trên một số máy Mac.
    • sudo apt-get install colordiff trên Debian hoặc Ubuntu
    • Đối với các nền tảng khác, tải xuống nguồn từ trang chính hoặc GitHub và làm theo hướng dẫn cài đặt
  • -R: điều này cho Ít thấy hiển thị màu thay vì mã thô.

Cuối cùng tôi đã sử dụng -wvì tôi không muốn thấy khác biệt khoảng trắng.

diff -w -u FILE1 FILE2 | colordiff | less -R

Chỉnh sửa: Theo đề xuất của @Ciprian Tomoiaga trong bình luận, bạn có thể biến chức năng này thành chức năng và đặt nó vào ~/.bashrctệp của mình .

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Để có một hàm bash duy nhất cho điều này, hãy thêm vào .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

GNU diffcó một --colortùy chọn kể từ phiên bản 3.4 vào cuối năm 2016 theo câu trả lời này trên Unix SE. Điều đó cùng với -uđó là đủ để bắt chước đầu ra của git diff:

diff -u --color=always file1 file2 | less -r

--colorphải được alwayssử dụng trong đường ống, autosẽ tắt màu trong đường ống.

Tôi chỉ thử điều này với Git Bash trên Windows, nơi less -Rsẽ chỉ tô màu dòng đầu tiên của một con hunk. less -rsửa nó cho tôi trong trường hợp đó


3

Chỉ sử dụng bash, diff, tput, và less, chúng ta có thể xấp xỉ chặt chẽ đầu ra của git diff. Tuy nhiên, sẽ có một số khác biệt đáng chú ý do sự thiển cận của các difflập trình viên.

Đặt định nghĩa hàm Bash sau trong một số tệp được lấy tự động bởi tài khoản người dùng của bạn và bạn sẽ có thể truy cập hàm từ dòng lệnh:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Chức năng này hoạt động như sau:

  1. Cuối cùng, diffđược gọi với các tùy chọn định dạng khác nhau để chỉ định cách thay đổi trong các tệp sẽ được hiển thị.
  2. tputđược sử dụng để chèn mã màu ANSI vào các tùy chọn định dạng đó. Lưu ý rằng khi sử dụng các thiết bị đầu cuối không phải ANSI, bạn có thể phải thay thế tput setafbằng tput setf.
  3. Đầu ra của diffđược dẫn vào less. -Rcho phép màu ANSI được bảo tồn. -Xngăn không cho lessxóa màn hình khi thoát. -Fngăn không cho lesshoạt động như một máy nhắn tin nếu đầu ra vừa với một màn hình.
  4. Nếu tham số đầu tiên là @full, hàm sẽ hiển thị tất cả các dòng không thay đổi ngoài các dòng được thêm và xóa.

Lưu ý những khác biệt sau đây giữa phương pháp này và git diff:

  1. git diffbáo cáo ba dòng bối cảnh xung quanh mỗi thay đổi. Thật không may, diffdường như phàn nàn và thoát nếu bạn muốn chỉ định số lượng dòng ngữ cảnh đồng thời chỉ định đồng thời các tùy chọn định dạng. (Ít nhất là trong Mac OS X Yosemite). Cảm ơn các difflập trình viên. Do đó, bạn có thể yêu cầu không có dòng ngữ cảnh nào xung quanh mỗi thay đổi, đó là hành vi mặc định hoặc bạn có thể yêu cầu tất cả các dòng không thay đổi trong tệp cũng được báo cáo, bằng cách chỉ định @fulllàm tham số đầu tiên.
  2. Bởi vì các dòng của bối cảnh khác với git diff, số dòng được báo cáo bởi chức năng này cũng sẽ khác với các dòng được báo cáo bởi git diff.
  3. Bạn có thể thấy sự hiện diện của các thay đổi một dòng được báo cáo, đó là hành vi chính xác, nhưng gây khó chịu khi tệp thay đổi của bạn chứa chèn các dòng trống đơn. Tôi nghĩ rằng git diffgiao dịch với điều này tốt hơn, thông qua các dòng bối cảnh của nó. Bạn có thể thử chuyển các tùy chọn khác nhau để diffxử lý tốt hơn khoảng trắng, nếu bạn thích.


2

Đặt cái này trong .bashrchoặc của bạn .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

Yêu cầu: gitcolordiffnên được cài đặt trước.

sử dụng : diff file1 file2

ví dụ: với $diff .tmux.conf .zshrc.pre-oh-my-zsh

ví dụ chức năng khác


0

Tùy chọn khác là thực hiện nó từ bên ngoài kho lưu trữ để git biết khác biệt giữa các tệp. ví dụ. một hàm shell giống như:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Sử dụng colordiff :

Cài đặt:

sudo apt-get install colordiff

Sử dụng:

colordiff -u file_one file_two

Cung cấp chính xác sự khác biệt như được hiển thị bởi git diff.


0

Nếu bạn không có colordiffhoặc git diff, bạn có thể lấy màu bằng cách vim.

cdiff() { diff -u $@ | vim -R -; }

hoặc đơn giản

cdiff() { diff -u $@ | view -; }

0

dơi có màu sắc đẹp, tôi đã kiểm tra xem nó có hoạt động tốt diffkhông và thật ngạc nhiên là nó hoạt động rất tốt.

$ diff file1 file2 | bat hoặc là $ diff -u file1 file2 | bat

Vì vậy, tôi cho rằng bạn có thể thực hiện một chức năng như thế này dưới đây để hiệu quả hơn:

function bdiff () { diff -u $@ | bat;}


-2

Tôi nghĩ cài đặt cấu hình:

[color]
     ui = true

kết hợp với --relative=<path>tùy chọn của lệnh "diff" sẽ làm những gì bạn muốn. Bạn đã thử chưa ?


3
Điều này là cho các khác biệt trong git. Anh ấy đã yêu cầu các difftùy chọn chương trình
tr33hous
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.