วิธีการทำให้ diff ทำงานเหมือน git-diff


148

git diffผมชอบการแสดงผลการจัดรูปแบบของ สีและ+/ การ-แทนค่าของการเปลี่ยนแปลงระหว่างบรรทัดง่ายต่อการอ่านมากกว่า GNU

ฉันสามารถรันgit diffโดยใช้การ--no-indexตั้งค่าสถานะภายนอก repo คอมไพล์และทำงานได้ดี แต่ก็ดูเหมือนจะหายไป--excludeตัวเลือกสำหรับการยกเว้นแฟ้มหรือไดเรกทอรีย่อยจาก diffrecursive

มีวิธีที่ดีที่สุดของทั้งสองโลกหรือไม่? (ตัวเลือกสีและ+/ -รูปแบบของgit diffและ--excludeตัวเลือกของ GNU diff)

ฉันได้ทดลองใช้colordiffแต่ฉันยังคงชอบรูปแบบผลลัพธ์ของgit diff


1
เพื่อให้สีฟ้าเพื่อให้การเพิ่มสีเขียว, การเปลี่ยนแปลงในnewtext /etc/colordiffฉันคิดว่าคอมไพล์ใช้สีเขียว
Rudie

1
ฉันไม่เคยได้ยินธง --no-index มาก่อนจนกระทั่งตอนนี้ ฉันเพิ่งใช้มันเพื่อเปรียบเทียบผลลัพธ์จาก git show กับ diff ของสองไฟล์ - ขอบคุณสำหรับสิ่งนั้น!
AJM-Reinstate-Monica

คำตอบ:


175

ผมไม่ทราบว่าจะทำสี แต่นี้จะทำ+/-มากกว่าและ<>

diff -u file1 file2

6
เจ๋งรวมกับ colordiff ทำให้ฉันเข้าใกล้สิ่งที่ฉันต้องการ เดาว่าฉันต้องเลื่อนหน้าลงอีกในหน้าถัดไป ... ขอบคุณ!
Mzzzzzz

13
วิธีง่ายๆที่จะได้รับ colorization กับ diff -u ยังเป็นท่อออกไป tig ที่ commandline คอมไพล์ repo diff -u file1 file2 | tigผู้ชม:
ซามูเอลแลมปา

3
ติดตั้งcolordiffจากที่เก็บ apt / yum / pacman ของคุณและใช้งาน
iBug

จำเป็นต้องเปิดใช้งานแพคเกจเสริมสำหรับ Enterprise Linux (EPEL) บน Amazon Linux เพื่อติดตั้งcolordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/ …
Pat Myron

1
นอกจากนี้colordiffคุณยังสามารถได้รับสีพร้อมด้วยการกำหนดvim cdiff() { diff -u $@ | vim -R -; }
Syrtis Major

94

คุณยังสามารถใช้git diff --no-index -- A B(ผ่านmanpage )


1
+1 แต่น่าเสียดายที่วิธีนี้ใช้ไม่ได้หากไฟล์ใดไฟล์หนึ่งเป็น symlink
Emil Lundberg

2
+1 สิ่งนี้มีประโยชน์มากเพราะจะแสดงวิธีการสร้างรายงานคอมไพล์ที่ไฟล์ที่ติดตามสองไฟล์ AและBแตกต่างกันเมื่อเทียบกับไฟล์อื่น ๆแทนที่จะเป็นไฟล์ที่มีการแก้ไขซึ่งสัมพันธ์กับการแก้ไขครั้งล่าสุด
J. Katzwinkel

@EmilLundberg: เหมาะกับฉันด้วย symlinks ใน git 1.9.1 บน Linux ฉันไม่ทราบว่ารุ่นก่อนหน้านี้เสียหายหรือไม่
kkm

3
git diff --no-indexดีมาก แต่เมื่อ OP ชี้ให้เห็นมันไม่มี--excludeธงดังนั้นจึงมีประโยชน์อย่าง จำกัด
Ken Williams

25
  1. ติดตั้งcolordiff

  2. อัพเดต ~ / .colordiffrc ของคุณ (การคัดลอก / etc / colordiffrc ก่อนหากจำเป็น):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. ใช้colordiff -u file1 file2สำหรับสองไฟล์หรือcolordiff -ruN path1 path2สำหรับการเปรียบเทียบเส้นทางแบบวนซ้ำ

มันไม่เหมือนกัน แต่ใกล้กันมาก


18

นี่คือสิ่งที่ฉันแนะนำและใกล้กันมาก

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: คุณจะต้องติดตั้งสิ่งนี้
  • -R: เป็นการบอกให้ Less แสดงสีแทนรหัสดิบ

ในที่สุดฉันก็ใช้-wเพราะฉันไม่ต้องการเห็นช่องว่างที่แตกต่าง

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

แก้ไข: ตามคำแนะนำของ @Ciprian Tomoiaga ในความคิดเห็นคุณสามารถทำให้ฟังก์ชั่นนี้และใส่ไว้ใน~/.bashrcไฟล์ของคุณได้เช่นกัน

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

4
เพื่อให้มีฟังก์ชั่นทุบตีเดี่ยวสำหรับสิ่งนี้เพิ่มไปยัง. bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

GNU diffมี--colorตัวเลือกตั้งแต่รุ่น 3.4 ในปลายปี 2016 ตามคำตอบของ Unix SE สิ่งที่อยู่ข้างๆ-uควรจะเพียงพอที่จะเลียนแบบผลลัพธ์ของgit diff:

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

--colorจะต้องalwaysเมื่อใช้ในท่อautoจะปิดสีในท่อ

ฉันเพิ่งลองทำสิ่งนี้กับ Git Bash บน Windows ซึ่งless -Rจะระบายสีเฉพาะบรรทัดแรกของก้อนใหญ่ less -rแก้ไขให้ฉันในกรณีนั้น


3

โดยใช้เพียงbash, diff, tputและเราสามารถใกล้ชิดใกล้เคียงกับการส่งออกของless git diffจะมีความแตกต่างที่โดดเด่นบางอย่างเนื่องจากการสายตาสั้นของdiffโปรแกรมเมอร์

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

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
}

ฟังก์ชั่นนี้ทำงานดังต่อไปนี้:

  1. ในที่สุดdiffได้รับการเรียกใช้กับตัวเลือกการจัดรูปแบบต่างๆเพื่อระบุวิธีการเปลี่ยนแปลงภายในไฟล์ที่จะแสดง
  2. tputใช้เพื่อแทรกรหัสสี ANSI ลงในตัวเลือกการจัดรูปแบบเหล่านั้น หมายเหตุว่าเมื่อใช้ขั้วไม่ใช่ ANSI คุณอาจต้องเปลี่ยนด้วยtput setaftput setf
  3. การส่งออกของประปาเข้า diff อนุญาตให้รักษาสี ANSI ไว้ ป้องกันจากการล้างหน้าจอเมื่อออกจาก ป้องกันไม่ให้การทำงานเป็นเพจเจอร์ถ้าเอาท์พุทพอดีภายในหนึ่งหน้าจอless-R-Xless-Fless
  4. หากพารามิเตอร์แรกคือ@fullฟังก์ชั่นจะแสดงบรรทัดที่ไม่เปลี่ยนแปลงทั้งหมดนอกเหนือจากการเพิ่มและลบบรรทัด

สังเกตความแตกต่างดังต่อไปนี้ระหว่างวิธีการนี้และgit diff:

  1. git diffรายงานบริบทสามบรรทัดที่ล้อมรอบการเปลี่ยนแปลงแต่ละรายการ น่าเสียดายที่diffดูเหมือนจะบ่นและออกหากคุณต้องการระบุจำนวนบรรทัดบริบทขณะเดียวกันก็ระบุตัวเลือกการจัดรูปแบบพร้อมกัน (อย่างน้อยก็ทำใน Mac OS X Yosemite) ขอบคุณdiffโปรแกรมเมอร์ ดังนั้นคุณสามารถขอให้ไม่มีบรรทัดบริบทที่ล้อมรอบการเปลี่ยนแปลงแต่ละอย่างซึ่งเป็นพฤติกรรมเริ่มต้นหรือคุณสามารถร้องขอให้รายงานบรรทัดที่ไม่เปลี่ยนแปลงทั้งหมดภายในไฟล์ได้โดยระบุ@fullเป็นพารามิเตอร์แรก
  2. เพราะสายของบริบทที่แตกต่างจากตัวเลขบรรทัดที่รายงานโดยฟังก์ชั่นนี้จะแตกต่างจากผู้ที่รายงานโดยgit diffgit diff
  3. คุณอาจเห็นสถานะของการเปลี่ยนแปลงบรรทัดเดียวที่รายงานซึ่งเป็นพฤติกรรมที่ถูกต้อง แต่น่ารำคาญเมื่อไฟล์ที่คุณเปลี่ยนแปลงมีการแทรกบรรทัดว่างเดี่ยว ฉันคิดว่าgit diffดีกว่านี้ผ่านบริบทของมัน คุณสามารถลองใช้ตัวเลือกต่าง ๆ เพื่อdiffจัดการกับช่องว่างได้ดีขึ้นหากคุณต้องการ


2

วางไว้ในของคุณ.bashrcหรือ.zshrc:

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

ข้อกำหนด: gitและcolordiffควรติดตั้งก่อนมือ

การใช้งาน: diff file1 file2

ตัวอย่าง: สำหรับ $diff .tmux.conf .zshrc.pre-oh-my-zsh

ตัวอย่างฟังก์ชัน diff


0

ตัวเลือกอื่นคือทำจากนอกที่เก็บเพื่อให้ git รู้จักความแตกต่างระหว่างไฟล์ เช่น. ฟังก์ชั่นเปลือกบางสิ่งบางอย่างที่ชอบ:

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

0

ใช้colordiff :

การติดตั้ง:

sudo apt-get install colordiff

การใช้งาน:

colordiff -u file_one file_two

git diffให้แตกต่างเหมือนกันตรงตามที่แสดงโดย


0

หากคุณไม่มีcolordiffหรือgit diffคุณสามารถรับสีvimได้

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

หรือเพียงแค่

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

0

เนื่องจากค้างคาวมีสีสันที่ดีฉันจึงทดสอบว่าdiffมันใช้งานได้ดีและน่าประหลาดใจที่มันใช้งานได้ดีมากนอกกรอบ

$ diff file1 file2 | bat หรือ $ diff -u file1 file2 | bat

ดังนั้นฉันคิดว่าคุณสามารถทำให้ฟังก์ชั่นเช่นนี้ด้านล่างมีประสิทธิภาพมากขึ้น:

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


-2

ฉันคิดว่าการตั้งค่าคอนฟิก:

[color]
     ui = true

รวมกับ--relative=<path>ตัวเลือกคำสั่ง "diff" จะทำสิ่งที่คุณต้องการ คุณลอง ?


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