Ketika saya melakukan git diff, itu menunjukkan baris yang telah ditambahkan:
+ this line is added
garis yang telah dihapus:
- this line is removed
tetapi juga menunjukkan banyak baris yang tidak dimodifikasi:
this line is not modified
this line is also not modified
Ini menghasilkan git diff yang sebenarnya terlihat seperti ini:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Bisakah saya meminta git untuk hanya menampilkan baris yang telah dimodifikasi dan mengabaikan semua kode lain yang belum dimodifikasi? Saya telah menulis metode yang akan menghapus semua baris yang tidak memiliki tanda "+" atau "-" di depannya, tetapi saya yakin pasti ada cara yang lebih sederhana untuk melakukan ini.
Di git diff saya, saya hanya tertarik melihat garis-garis yang telah dimodifikasi.
Terima kasih sebelumnya.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
untuk mengaturnya secara globalPeretasan lain (pada un * x) untuk hanya menampilkan baris yang dimulai dengan
+
dan-
:Kode di atas melakukan hal berikut:
git diff -U0
: pilih 0 baris konteks+
atau-
--- a/
atau+++ b/
Warna
Untuk menampilkan perbedaan warna, coba yang berikut ini:
^\e\[[^m]*m[-+]
mencari awal baris (^
), kemudian pelacak melarikan diri (\e
) diikuti dengan[
yang bersama-sama memulai urutan pelarian, lalu setiap karakter yang bukan "m" (angka, titik koma, atau tidak sama sekali), diikuti oleh " m "yang mengakhiri urutan pelarian.\e[0m
(reset),\e[m
(juga reset),\e[1m
(tebal),\e[31m
(merah),\e[32m
(hijau),\e[9;31m
(mogok + merah),\e[31;9m
(merah + mogok),\e[1;4;9;31m
(tebal + garis bawahi + mogok + merah). Warna default git menggunakan merah dan hijau, tetapi mereka dapat dikonfigurasi ulang.--color
sama dengan--color=always
.--- a/
atau+++ b/
untuk muncul di awal garis telah dihapus untuk mengakomodasi urutan pelarian dan ini dapat mengarah pada kasus tepi.Catatan tambahan:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, dllgrep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, tetapi saya menemukan versi grep ganda lebih mudah dimengerti.sumber
git diff
baris jenis "header" yang dimulai dengan@@
, tetapi apagit diff
baris yang dimulai dengan---
atau+++
? Saya tidak menyadarinya.+++
) atau penghapusan (---
). Saya melihatnya di sini sekarang: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
tampaknya menunjukkan "file di sebelah kiri", atau file seperti sebelumnya, dan+++ b/filename
tampaknya menunjukkan "file di sebelah kanan", atau file seperti sekarang dengan perubahan Anda. Saya sangat terbiasa menggunakangit difftool
dengan berbaur , yang menunjukkan perbandingan berdampingan yang indah, sehingga saya tidak pernah benar-benar terbiasa melihatgit diff
, jadi itu masih terlihat aneh bagi saya, dan saya tidak pernah benar-benar melihat nuansa ini sebelumnya.Menindaklanjuti komentar terbaru Chris, masalah utama dengan post-processing adalah Anda ingin tetap menggunakan jalur
-|+
tetapi Anda juga ingin menyaring yang memulai---|+++
. Jika Anda menyimpan file tambalan di repo Anda (saya lakukan, di Pydoop ), di sisi lain, Anda ingin menjaga garis yang dimulai dengan--|++
, sehingga regexp menjadi sedikit terlibat:Regexp menggunakan lookahead negatif: lihat jawaban Peter Boughton untuk pertanyaan ini untuk penjelasan terperinci.
Jika Anda sering melakukan ini, Anda mungkin ingin mengatur alias git untuk itu:
sumber
-P
atau--perl-regexp
digunakan untuk menafsirkan pola sebagai rexpression reguler Perl, tetapi tidak selalu dilaksanakan. Itu tidak bekerja untuk saya di OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsSaya pikir untuk kasus sederhana regex bisa menjadi jauh lebih pendek dan lebih mudah diingat, dengan peringatan bahwa ini tidak akan berfungsi jika Anda memiliki perubahan garis di mana garis itu sendiri dimulai dengan
+
atau-
Regex mengatakan bahwa garis harus dimulai dengan
+
atau-
, dan karakter yang mengikuti segera seharusnya bukan keduanya. Saya mendapat hasil yang sama apakah saya lolos+
atau tidak di sini, btw ...Contoh:
Katakan saya mengubah
C
keX
,E
keY
, danG
keZ
.Seperti yang saya katakan di atas, ini hanya untuk sebagian besar kasus. Jika Anda mem-pipe output itu ke file
dout
, lalu coba regex yang sama, itu tidak akan berfungsi.Bagaimanapun, harapan yang membantu dalam kasus Anda
sumber
- name: No pdb
dalam file yaml.Jawaban ini akan mempertahankan warna merah / hijau asli agar mudah dibaca. Saya memberikan beberapa variasi dalam sintaks:
Penjelasan:
git diff --color
diperlukan untuk mencegah git menonaktifkan warna ketika sedang dipipihkan.grep --color=never
untuk mencegah grep menghapus warna asli dan menyorot string yang cocok.\e[31m
) atau hijau (\e[32m
).$'...'
(ANSI-C mengutip sintaks) atau-P
(sintaks perl) adalah membiarkangrep
untuk menafsirkan\e
atau\033
sebagaiESC
karakter.sumber
$''
Bagian Anda terutama membantu saya. stackoverflow.com/a/61929887/4561887Cara menggunakan
awk
untuk menampilkan hanya garis+
dan-
, akuntansi untuk setiap warna atau format teksgit diff
mungkin menghasilkan:Tidak satu pun dari jawaban lain di sini (termasuk jawaban saya yang lain ) akan melakukan apa yang Anda inginkan 100% dengan benar. Namun, jawaban ini akan. Ini adalah 1-liner yang dapat Anda salin dan tempel ke terminal Anda. Saya baru saja membuatnya beberapa baris agar mudah dibaca - Anda dapat menyalin-menempelnya dengan cara yang sama sehingga saya mungkin membuatnya dapat dibaca! Itu bergantung pada
awk
bahasa pemrograman:Berikut fitur-fiturnya. Semua fitur ini, ketika diambil bersama-sama, menyelesaikan kekurangan dari setiap jawaban lainnya di sini:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
pengaturan Anda . Itu sebabnya regex di atas memiliki;?
dan{1,10}
di dalamnya: jika ia mendeteksi awal kode pemformatan warna atau teks, itu akan cocok dengan 10 urutan kode ANSI gabungan ini.Ini TIDAK juga termasuk baris yang dimulai dengan
@@
dan katadiff
, seperti jawaban yang diterima . Jika Anda ingin garis-garis itu (yang terus terang, saya pikir berguna :)), lakukan ini sebagai gantinya:atau
Ini menunjukkan output dengan cara yang sama persis seperti yang
git diff
akan: dalamless
pager dengan output warna opsional (-R
), dan hanya jika teksnya> 1 halaman (-F
), dan sambil mempertahankan halaman teks saat ini di layar ketika Andaq
uit (-X
) .Ini juga memiliki manfaat menjadi kuat dan mudah dikonfigurasi karena menggunakan bahasa pemrograman awk.
Jika Anda tertarik mempelajari awk , berikut ini beberapa sumber:
gawk
awk
Manual (GNU ): https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
dan komentar di dalamnya: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
, yaitugit diff
dengan nomor baris, lihat di sini: Git beda dengan nomor baris (Catatan log dengan nomor baris)Sebagai bonus, saya juga membungkus di atas untuk digunakan sebagai
git diffc
, yang berarti "git diff untuk menunjukkan HANYA 'c'hanges". Penggunaannya identik dengangit diff
; gunakangit diffc
saja! Ini mendukung opsi SEMUA. Warna AKTIF secara default. Untuk mematikannya, cukup gunakangit diffc --no-color
ataugit diffc --color=never
. Lihatman git diff
detailnya.Karena saya baru saja selesai
git diffn
(alat untuk menunjukkangit diff
dengan garis 'n'umber) tadi malam, menulisgit diffc
itu sepele. Saya pikir saya lebih baik melakukannya sekarang sementara pengetahuan masih segar di kepala saya.Pasang
git diffc
:Ikuti instruksi di akhir jawaban ini di sini , kecuali di mana pun Anda melihat
git-diffn
dalam instruksi, gunakangit-diffc
saja. Itu termasuk dalamwget
perintah juga. Mengunduh dan menginstalnyagit diffc
mudah: itu hanya beberapa perintah.sumber
Inilah cara lain yang lebih sederhana untuk menemukan hanya garis yang telah dimodifikasi, dan karenanya mulai dengan satu
+
atau-
, sambil mempertahankan keluaran warna:-U0
mengatakan untuk memasukkan 0 baris konteks di sekitar baris yang diubah - yaitu: hanya memasukkan baris yang diubah sendiri. Lihatman git diff
.-E
untuk grep memungkinkan untuk bekerja dengan ekspresi reguler diperpanjang$''
sintaks tampaknya memungkinkan ANSI mengutip, yang benar menafsirkan ESC (escape, atau 0x1b) karakter dengan benar. Lihat di sini .^
cocok dengan awal baris,\e
cocok dengan karakter Escape, yang merupakan awal dari kode warna di terminal,\[
cocok dengan karakter berikutnya dalam kode warna, yaitu[
, dan kemudian(this|that)
sintaksinya cocok dengan "ini" atau "itu" , di mana "ini" adalah32m+
, yang merupakan garis + hijau, dan31m-
merupakan garis merah.\e[32m
hijau dan\e[31m
merah.+
menunjukkan garis yang ditandai dengangit diff
ditambahkan, tentu saja, dan-
menunjukkan garis yang ditandaigit diff
sebagai dihapus.--color=never
yang diperlukan dalam 2grep
ekspresi untuk mencegah dari menyoroti pertandingan, yang dinyatakan akan mengacaukan kode warna yang datang darigit diff
sebelah kiri.+
harus diloloskan juga karena\+
karena kalau tidak, itu+
adalah ekspresi reguler khusus (regex) karakter yang menentukan satu atau lebih kejadian elemen sebelumnya . Lihat di sini: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Referensi:
Terkait:
git-filechange-search.sh
- skrip yang memungkinkan Anda untuk mencari file untuk variabel atau nama fungsi dan mencari tahu yang melakukan berisi perubahan dengan variabel atau nama fungsi tersebut. Ex. penggunaan:./git-filechange-search.sh path/to/my/file.cpp variable_name
akan menemukan semua komit dengan perubahan pada file.cpp yang berisivariable_name
di dalamnya. Ini berguna untuk melihat di mana dan kapan fitur-fitur tertentu diubah. Seolah-olah itu adalah pencarian yang dapat mengamati bagian dari file yang ditampilkan melaluigit blame
waktu ke waktu.sumber