มีวิธีการเพิ่มบรรทัดแสดงคอมไพล์เปลี่ยนบรรทัดและลบบรรทัดหรือไม่?


111

"git diff --stat" และ "git log --stat" แสดงผลลัพธ์เช่น:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

แต่สิ่งที่เกิดขึ้นจริงในการกระทำนั้นคือมีการเปลี่ยนแปลง 4 บรรทัดและ 26 บรรทัดถูกลบซึ่งแตกต่างจากการเพิ่ม 4 บรรทัดและการลบ 30

มีวิธีใดบ้างในการรับเดลต้า LOCs (26 ในกรณีนี้) ฉันไม่สนใจเรื่องความแตกต่างระหว่างบรรทัดที่เพิ่มหรือลบ

คำตอบ:


129

คุณสามารถใช้ได้:

git diff --numstat

เพื่อรับข้อมูลความแตกต่างเชิงตัวเลข

การแยกการแก้ไขออกจากคู่เพิ่มและลบ--word-diffอาจช่วยได้ คุณสามารถลองสิ่งนี้:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

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


2
ขอบคุณ quornian แต่ numstat ให้ข้อมูลเดียวกันกับ stat การเพิ่มเติมและการลบ
Juan Alonso

อัปเดตคำตอบของฉันเพื่อรวมตัวอย่างการใช้--word-diff. นั่นอาจเป็นประโยชน์มากกว่า
quornian

14
ผลลัพธ์ของgit diff --numstatถูกแยกย่อยตามไฟล์ หากต้องการดูยอดรวมที่เพิ่ม / ลบสำหรับความแตกต่างคุณสามารถgit diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
ไพพ์

15
@hughes git diff --shortstatวิธีที่ง่ายของการได้รับข้อมูลที่เหมือนกันจะเป็น จากประสบการณ์ของฉันมันเทียบเท่ากับการสะสมผลลัพธ์ของgit diff --numstat.
klaus triendl

1
นอกจากนี้ FWIW เพื่อดูสถิติสำหรับการเปลี่ยนแปลงขั้นตอนเพียงเพิ่ม--cached
xlm

65
  1. หากคุณต้องการทราบบรรทัดที่เพิ่ม / เปลี่ยนแปลง / ลบโดยการกระทำที่มี id commit-idคุณสามารถใช้

    git show commit-id --stat
    

    หรือ

    git diff commit-id-before commit-id --stat
    
  2. หากคุณต้องการทราบว่าบรรทัดที่เพิ่ม / เปลี่ยนแปลง / ลบโดยการคอมมิตช่วงคุณสามารถใช้

    git diff commit-id1 commit-id2 --stat
    
  3. หากคุณต้องการทราบบรรทัดที่เพิ่ม / เปลี่ยนแปลง / ลบโดยแต่ละคอมมิตคุณสามารถใช้

    git log --stat
    

โซลูชันดังกล่าวไม่ตอบคำถาม "git --stat" จะนับบรรทัดที่แก้ไขเพียงบรรทัดเดียวเป็น "การแทรก 1 ครั้งและการลบ 1 ครั้ง" คำถามจะถามว่า "1 รายการเปลี่ยนแปลง" ได้อย่างไร
Juan Alonso

6

หากไฟล์ทั้งหมดของคุณถูกจัดเตรียมไว้สำหรับการคอมมิตคุณจะเห็นการ--numstatดำเนินการดังนี้:

git diff --numstat HEAD~

4

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

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Gitให้ลิงก์ไปยังสคริปต์ที่อนุญาตให้เรียกใช้ "diff" แบบเก่าปกติ - และจากนั้นคุณสามารถสร้างเอาต์พุต"บริบท" ที่แตกต่างได้ บริบทที่แตกต่างจะแสดงบรรทัดที่เพิ่มลบและเปลี่ยนแปลงซึ่งจะช่วยให้คุณได้รับข้อมูลที่คุณต้องการ


3

คุณสามารถใช้diffstatเพื่อแสดงจำนวนบรรทัดที่แก้ไข ตัวอย่างเช่น:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

-Cตัวเลือกสำหรับการส่งออก colourised; -mตัวเลือกสำหรับการแสดงจำนวนของสายการปรับเปลี่ยน ตัวอย่างผลลัพธ์:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

จำนวนบรรทัดที่แก้ไขเป็นค่าโดยประมาณตามที่man diffstatระบุไว้:

-m ผสานแทรก / ลบนับจากแต่ละ "กลุ่ม" ของไฟล์แพตช์เพื่อประมาณจำนวนบรรทัดที่แก้ไข

ความแตกต่างที่สำคัญอย่างหนึ่งระหว่างgit diff --statและdiffstat: diffstatไม่แสดงการย้าย / เปลี่ยนชื่อไฟล์ (เช่นapp/{a.rb => b.rb})

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