ฉันสามารถสร้าง 'git diff' เฉพาะหมายเลขบรรทัดและเปลี่ยนชื่อไฟล์ได้หรือไม่


276

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


โดยพื้นฐานแล้วฉันไม่ต้องการเห็นเนื้อหาที่มีการเปลี่ยนแปลงเพียงแค่ชื่อไฟล์และหมายเลขบรรทัด


ฉันอยากรู้ว่าหมายเลขบรรทัดมีประโยชน์จริงๆหรือไม่หากไม่มีรหัส? หรือคุณต้องการเปลี่ยนจำนวนบรรทัด?
Andrew Marshall

ดีไม่ได้โดยเฉพาะ แต่ฉันต้องการมันเพื่อบุ๊คมาร์คที่ฉันมีการเปลี่ยนแปลงรหัสของฉัน
wei

1
การใช้งานอย่างหนึ่งของสิ่งนี้คือการรวมข้อมูลกับรายงานความครอบคลุมของรหัสเพื่อประเมินว่ารหัสใหม่หรือที่แก้ไขในการคอมมิชชันนั้นครอบคลุมโดยการทดสอบหรือไม่
AntonyG

@AntonyG ฉันพบคำถามนี้ในขณะที่พยายามสร้างโปรแกรมอรรถประโยชน์ที่ทำสิ่งเดียวกัน (ครอบคลุมกับสายที่เปลี่ยนแปลง) คุณจัดการสร้างรายงานหรือไม่ ถ้าใช่คุณเผยแพร่ที่ใดก็ได้หรือไม่
Andrew Newdigate

@AndrewNewdigate มันจะเป็นเครื่องมือที่ยอดเยี่ยม แต่ฉันไม่เคยสร้างมันขึ้นมา ฉันกำลังดำเนินการประมวลผลผลลัพธ์การครอบคลุมโค้ดประเภทอื่นเมื่อฉันเจอคำถามนี้ แต่ไม่สามารถปรับเวลาที่ต้องใช้ในการดำเนินการตามคำแนะนำของฉันได้
AntonyG

คำตอบ:


70

หมายเหตุ: หากคุณได้เพียงแค่มองหาชื่อของไฟล์ที่มีการเปลี่ยนแปลง ( โดยไม่ต้องหมายเลขบรรทัดสำหรับสายที่มีการเปลี่ยนแปลง) ที่ง่ายต่อคลิกที่ลิงค์นี้เพื่อคำตอบที่นี่อีก


ไม่มีตัวเลือกในตัวสำหรับสิ่งนี้ (และฉันไม่คิดว่ามันมีประโยชน์อย่างใดอย่างหนึ่ง) แต่ก็เป็นไปได้ที่จะทำสิ่งนี้ในคอมไพล์ด้วยความช่วยเหลือของสคริปต์ "external diff"

นี่คือสิ่งที่ค่อนข้างเส็งเคร็ง; มันจะขึ้นอยู่กับคุณในการแก้ไขเอาต์พุตในแบบที่คุณต้องการ

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

สำหรับรายละเอียดเกี่ยวกับ "ความแตกต่างภายนอก" โปรดดูคำอธิบายGIT_EXTERNAL_DIFFในหน้าคู่มือ git (ประมาณบรรทัดที่ 700 ซึ่งอยู่ใกล้กับจุดสิ้นสุด)


1
ขอบคุณ จริง ๆ แล้วฉันได้เขียนสคริปต์ที่คล้ายกันหลังจากได้รับการยืนยันว่าไม่มีตัวเลือกในตัวสำหรับสิ่งนี้ :)
wei

การวางท่อเพื่อ| grep -o '^[0-9]*'ให้คุณได้ตัวเลขเพียงอย่างเดียวสมมติว่าคุณไม่สนใจทางด้านขวา
GKFX

1
@DylanYoung ใช่; เพื่อ จำกัด ไฟล์ที่แสดงเพิ่ม--diff-filter=...ที่...ส่วนหนึ่งเป็นชนิดของการเปลี่ยนแปลงที่คุณต้องการที่จะเห็น: Mสำหรับการแก้ไขAสำหรับเพิ่มDสำหรับลบและอื่น ๆ ตามgit diffเอกสาร
torek

@Sventies: นั่นไม่ใช่สิ่งที่ OP ร้องขอเพราะฉันสังเกตที่ด้านบนสุดของคำตอบของฉัน เขาไม่ต้องการชื่อไฟล์เพียงอย่างเดียว เขาต้องการชื่อกับหมายเลขบรรทัด
torek

ยุติธรรมเพียงพอ @torek :)
Sventies

832

ง่ายมาก:

git diff --name-only

ออกไปและแตกต่าง!


88
นี่เป็นไปได้ที่คำตอบที่คนส่วนใหญ่มองหาเมื่อพวกเขาดูหน้านี้ (สำหรับฉัน) อย่างไรก็ตามจะไม่ตอบคำถามเดิมซึ่งกล่าวถึงหมายเลขบรรทัดโดยเฉพาะ
Pieter Müller

12
นี่ไม่ควรเป็นคำตอบที่ยอมรับได้เพราะมันแก้ได้เพียงครึ่งเดียวของปัญหา แต่คุณก็ยังต้องเอาท์พุทว่าบรรทัดใด (สำหรับแต่ละไฟล์) ที่มีการเปลี่ยนแปลง
adamwong246

แค่นั้นแหละ! ฉันกำลังมองหาสวิตช์นี้อย่างแน่นอน!
Adam Arold

ทำไมไม่ใช้ "สถานะคอมไพล์"? นอกจากนี้ยังบอกไฟล์ที่ไม่ได้ติดตาม
Naveen Paul

1
@JimmyPaul เพราะบางครั้งคุณได้ยอมรับแล้ว ตัวอย่างเช่นคุณต้องการแสดงรายการไฟล์ที่เปลี่ยนแปลงระหว่างต้นแบบและสาขาขั้นสูงปัจจุบันของคุณgit diff --name-only master..HEAD
Hettomei

68

หมายเลขบรรทัดในจำนวนบรรทัดที่เปลี่ยนแปลงหรือหมายเลขบรรทัดจริงที่มีการเปลี่ยนแปลงหรือไม่ git diff --statหากคุณต้องการจำนวนของสายการเปลี่ยนแปลงการใช้ สิ่งนี้จะแสดงผลดังนี้:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

ไม่มีตัวเลือกในการรับหมายเลขบรรทัดของการเปลี่ยนแปลงด้วยตนเอง


1
ฉันกำลังคิดหมายเลขบรรทัดจริง ขอบคุณ
wei

ฉันสงสัยว่าเขาต้องการเครื่องมือ GUI สำหรับสิ่งนี้
ThiefMaster

30

git diff master --compact-summary

ผลลัพธ์คือ:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

นี่คือสิ่งที่คุณต้องการ รูปแบบเดียวกับเมื่อคุณทำการคอมมิทหรือดึงคอมมิทใหม่จากรีโมต

PS: มันมีสายที่ไม่มีใครตอบแบบนี้


1
ไม่ได้ระบุไว้ ใช้งานได้ตั้งแต่ 2.18 ปีที่แล้ว
Seitbekir Seidametov

สมบูรณ์ สิ่งนี้ได้ผลสำหรับฉันและการตอบสนองนั้นสมบูรณ์แบบ
Victor

15

1)ฉันชอบ:

git diff --name-status

ผนวกสถานะไฟล์เช่น:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2)ถ้าคุณต้องการสถิติจากนั้น:

git diff --stat

จะแสดงสิ่งที่ชอบ:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3)สุดท้ายถ้าคุณต้องการชื่อไฟล์เท่านั้น:

git diff --name-only

จะแสดงเพียง:

new_file.txt
modified_file.txt
deleted_file

4

แสดงชื่อไฟล์และจำนวน / จำนวนของบรรทัดที่เปลี่ยนแปลงในแต่ละไฟล์ระหว่างตอนนี้และการคอมมิทที่ระบุ:

git diff --stat <commit-hash>

2

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ใน Windows นี้กรองผลลัพธ์ git ไปยังไฟล์และหมายเลขบรรทัดที่เปลี่ยนแปลง:

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

หากต้องการแตกไฟล์และบรรทัดที่เปลี่ยนแปลงจากนั้นจะทำงานได้อีกเล็กน้อย:

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

ผลลัพธ์ที่สะอาดที่สุดคือชื่อไฟล์ / เส้นทางเท่านั้นที่มาพร้อมกับ

git diff-tree --no-commit-id --name-only -r

HTH


0

เมื่อวันที่git version 2.17.1, มีไม่ได้ในตัวธงเพื่อให้บรรลุวัตถุประสงค์นี้

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

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

ตัวอย่างเช่น diff แบบรวม:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

จะส่งผลให้:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

ในการจับคู่เอาต์พุตของคำสั่งในผลลัพธ์การจับคู่ grep ทั่วไป:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): ตรงกับชื่อไฟล์จากdiff --cc <filename>หมายเลขบรรทัดหรือการแข่งขันจากหรือการแข่งขันที่เหลืออยู่หลังจากข้อความ@@@ <from-file-range> <from-file-range> <to-file-range>@@@
  2. sed -e '0~3{s/ @@@[ ]\?//}': เอาออก@@@[ ]\?จากบรรทัดที่ 3 ทุกคนที่จะได้รับบริบทสาย 1 ++<<<<<<< HEADตัวเลือกก่อน
  3. sed '2~3 s/$/\n1/g': เพิ่ม\n1ทุก 3 บรรทัดระหว่างบรรทัดที่ 2 และ 3 สำหรับหมายเลขคอลัมน์
  4. sed "N;N;N;s/\n/:/g": เข้าร่วมทุก 3 :สายด้วย

0

ฉันใช้grepเป็นโซลูชั่นไร้เดียงสา

$ git diff | grep -A2 -- '---'

ตัวอย่างผลลัพธ์:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

บางทีคุณอาจเห็นผลสี ช่วยให้คุณอ่านเอาต์พุตได้อย่างง่ายดาย

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