Bisakah saya membuat 'git diff' hanya nomor baris DAN mengubah nama file?


276

Pertanyaan ini membutuhkan "nomor baris", jika Anda tidak peduli dengan nomor baris dalam output, lihat pertanyaan dan jawaban ini .


Pada dasarnya, saya tidak ingin melihat konten yang diubah, hanya nama file dan nomor baris.


Saya ingin tahu, apakah nomor baris benar-benar berguna tanpa kode? Atau Anda ingin jumlah baris diubah?
Andrew Marshall

baik, tidak terlalu, tetapi saya perlu untuk menandai di mana saya telah mengubah kode saya
wei

1
Salah satu penggunaannya adalah menggabungkan informasi dengan laporan cakupan kode, untuk menilai apakah kode baru atau yang dimodifikasi dalam sebuah komit dicakup oleh pengujian
AntonyG

@AntonyG Saya menemukan pertanyaan ini ketika mencoba membangun sebuah utilitas yang melakukan hal yang persis sama (cakupan vs baris yang diubah). Apakah Anda berhasil membuat laporan? Jika demikian, apakah Anda menerbitkannya di mana saja?
Andrew Newdigate

@AndrewNewdigate itu akan menjadi alat yang keren tapi saya tidak pernah membangunnya. Saya sedang melakukan beberapa jenis pemrosesan kode cakupan hasil ketika saya menemukan pertanyaan ini, tetapi tidak dapat membenarkan waktu yang diperlukan untuk mengimplementasikan saran saya
AntonyG

Jawaban:


70

Catatan: jika Anda hanya mencari nama-nama file berubah ( tanpa yang nomor baris untuk baris yang berubah), yang mudah, klik tautan ini untuk jawaban lain di sini .


Tidak ada opsi bawaan untuk ini (dan saya juga berpikir itu tidak begitu berguna), tetapi memang demikian mungkin untuk melakukan ini di git, dengan bantuan sebuah script "diff eksternal".

Ini yang jelek; itu terserah Anda untuk memperbaiki output seperti yang Anda inginkan.

#! /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 '^[<>-]'

Untuk perincian tentang "perbedaan eksternal" lihat deskripsi GIT_EXTERNAL_DIFFdi halaman manual git (sekitar baris 700, cukup dekat sampai akhir).


1
Terima kasih. Saya sebenarnya telah menulis skrip yang sama, setelah dikonfirmasi bahwa tidak ada opsi bawaan untuk ini, :)
wei

Piping | grep -o '^[0-9]*'memberi Anda hanya angka, dengan asumsi Anda tidak peduli dengan sisi kanan.
GKFX

1
@DylanYoung ya; untuk membatasi file yang ditampilkan, tambahkan di --diff-filter=...mana ...bagian itu adalah jenis perubahan yang ingin Anda lihat: Muntuk dimodifikasi, Auntuk ditambahkan, Duntuk dihapus, dan lain-lain sesuai git diffdokumentasi.
torek

@Venties: bukan itu yang diminta OP, seperti yang saya perhatikan di bagian atas jawaban saya. Dia tidak ingin nama file saja. Dia ingin nama - nama dengan nomor baris .
torek

Cukup adil @torek :)
Sventies

833

Begitu mudah:

git diff --name-only

Majulah dan berbeda!


88
Ini mungkin jawaban yang kebanyakan orang cari ketika mereka melihat halaman ini (itu untuk saya). Namun, itu tidak menjawab pertanyaan awal, yang secara spesifik menyebutkan nomor baris.
Pieter Müller

12
Ini BUKAN jawaban yang diterima karena hanya memecahkan setengah dari masalah - Anda masih perlu menampilkan baris mana (untuk setiap file) yang diubah.
adamwong246

Itu dia! Saya mencari saklar ini dengan tepat!
Adam Arold

Mengapa tidak menggunakan "git status"? Ini juga memberi tahu Anda file yang tidak terlacak.
Naveen Paul

1
@JimmyPaul karena terkadang Anda sudah berkomitmen. Misalnya Anda perlu membuat daftar file yang diubah antara master dan cabang lanjutan Anda saat inigit diff --name-only master..HEAD
Hettomei

68

Nomor baris seperti dalam jumlah baris yang diubah atau nomor baris aktual yang mengandung perubahan? Jika Anda ingin jumlah baris yang diubah, gunakan git diff --stat. Ini memberi Anda tampilan seperti ini:

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

Tidak ada opsi untuk mendapatkan nomor baris perubahan itu sendiri.


1
Saya sedang memikirkan nomor baris yang sebenarnya. Terimakasih Meskipun.
wei

Entah bagaimana saya ragu dia menginginkan alat GUI untuk ini.
ThiefMaster

30

git diff master --compact-summary

Output adalah:

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

Inilah yang Anda butuhkan. Format yang sama seperti ketika Anda membuat komit atau menarik komit baru dari jarak jauh.

PS: Ada kabel sehingga tidak ada yang menjawab seperti ini.


1
Itu tidak ditentukan. Ini bekerja dari 2,18 yang dirilis tahun lalu.
Seitbekir Seidametov

Sempurna. Ini bekerja untuk saya dan responsnya sempurna.
Victor

15

1) Favorit saya:

git diff --name-status

Letakkan status file, misalnya:

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

2) Jika Anda ingin statistik, maka:

git diff --stat

akan menampilkan sesuatu seperti:

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

3) Akhirnya, jika Anda benar-benar hanya menginginkan nama file:

git diff --name-only

Hanya akan menunjukkan:

new_file.txt
modified_file.txt
deleted_file

4

Memperlihatkan nama file dan jumlah / jumlah baris yang berubah di setiap file antara sekarang dan komit yang ditentukan:

git diff --stat <commit-hash>

2

Saya tahu ini adalah pertanyaan lama tetapi pada Windows, ini memfilter keluaran git ke file dan mengubah nomor baris:

(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>

Untuk mengekstrak file dan baris yang diubah dari itu adalah pekerjaan yang sedikit lebih:

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

Output terbersih, yaitu hanya nama file / jalur, dilengkapi dengan

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

HTH


0

Nyala git version 2.17.1, tidak ada bendera bawaan untuk mencapai tujuan ini.

Berikut ini contoh perintah untuk memfilter nama file dan nomor baris dari diff terpadu:

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

Misalnya, perbedaan terpadu:

$ 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

Akan menghasilkan:

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

Untuk mencocokkan output dari perintah dalam hasil pencocokan grep yang umum:

$ 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]+)? ): Cocokkan nama file dari diff --cc <filename>ATAU nomor baris Cocokkan dari @@@ <from-file-range> <from-file-range> <to-file-range>ATAU Cocokkan teks yang tersisa setelah @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Hapus @@@[ ]\?dari setiap baris ke-3 untuk mendapatkan konteks 1 baris opsional sebelumnya++<<<<<<< HEAD .
  3. sed '2~3 s/$/\n1/g': Menambahkan \n1 setiap 3 baris antara baris 2 dan 3 untuk nomor kolom.
  4. sed "N;N;N;s/\n/:/g": Gabung setiap 3 baris dengan a :.

0

Saya gunakan grepsebagai solusi naif.

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

contoh keluaran:

--- 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 @@

Mungkin Anda bisa melihat keluaran berwarna. Ini membantu Anda untuk membaca output dengan mudah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.