Bagaimana membuat git-diff dan git log mengabaikan file baru dan yang terhapus?

155

Terkadang ada beberapa file yang diubah bersama dengan beberapa file baru, yang dihapus dan / atau diganti nama. Ketika melakukan git diffatau git-logsaya ingin menghilangkannya, jadi saya bisa lebih baik melihat modifikasi.

Sebenarnya, mendaftarkan nama-nama file baru dan yang dihapus tanpa konten mereka adalah yang terbaik. Untuk "lama" diganti nama menjadi "baru" Saya ingin secara opsional mendapatkan perbedaan antara "lama" dan "baru".

maaartinus
sumber

Jawaban:

217

The --diff-filterpilihan bekerja dengan baik diffdan log.

Saya menggunakan --diff-filter=Mbanyak yang membatasi output diff hanya untuk modifikasi konten.

Untuk mendeteksi nama baru dan salinan dan menggunakannya dalam output diff, Anda dapat menggunakan -Mdan -Cmasing - masing, bersama dengan opsi Rdan Cuntuk --diff-filter.

CB Bailey
sumber
3
Ketika digunakan dengan git logini akan menyebabkannya mengabaikan komit yang hanya menambah dan / atau menghapus file.
qqx
7
Apakah ada cara untuk benar-benar mengecualikan hanya satu jenis data? Sesuatu seperti--diff-filter=!D
Kamil Dziedzic
24
@ Kamil Ya, ada. Kutipan dari dokumentasi:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
LambdaCruiser
62
  • Dokumen resmi:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

Pilih hanya file yang Ditambahkan (A), Disalin (C), Dihapus (D), Dimodifikasi (M), Diubah nama (R), jenisnya (yaitu file biasa, symlink, submodule, ...) diubah (T), adalah Unmerged (U), Unknown (X), atau sudah dipasangkan Broken (B). Kombinasi karakter filter apa pun (termasuk tidak ada) dapat digunakan.

Ketika * (Semua-atau-tidak ada) ditambahkan ke kombinasi, semua jalur dipilih jika ada file yang cocok dengan kriteria lain dalam perbandingan; jika tidak ada file yang cocok dengan kriteria lain, tidak ada yang dipilih.

Juga, huruf besar ini dapat diturunkan untuk dikecualikan. Misalnya --diff-filter = iklan mengecualikan jalur yang ditambahkan dan dihapus.

Contoh: hanya tampilkan yang ditambahkan, diubah, file yang dimodifikasi, tidak termasuk file yang dihapus:

git diff --diff-filter=ACM
TeeTracker
sumber
2
Catatan bagus tentang penggunaan opsi huruf kecil untuk mengecualikan jalur dan opsi huruf besar untuk menyertakan jalur.
stuyam
-3

UPDATE: The diterima Jawaban oleh Charles Bailey adalah yang benar; fungsi yang diinginkan sudah ada di git.

Saya akan meninggalkan jawaban ini di sini karena mungkin memberikan ide untuk hal-hal yang tidak dibangun menjadi git.


git diffmenampilkan file baru dan yang dihapus dengan membandingkannya /dev/null. Seharusnya tidak terlalu sulit untuk menulis sesuatu (saya akan menggunakan Perl sendiri) yang mencari /dev/nulldan menyaring baris-baris berikut hingga perbedaan berikutnya. Lalu git diff ... | the-filter.

File berganti nama adalah masalah yang berbeda; Saya belum (punya) jawaban yang bagus untuk itu.

Keith Thompson
sumber
Ini OK, tapi dengan cara ini saya kehilangan kemungkinan untuk menggunakan pager (kurang) hanya jika diperlukan, bukan?
maaartinus
@maaartinus: Saya kira begitu; Saya tidak memikirkan itu. (Secara pribadi, saya set saya git pager untuk "kucing" dan penggunaan ... | lesssecara eksplisit.) Anda mungkin melihat less's -Eatau -Fpilihan (meskipun pada sistem saya tidak membiarkan saya melihat output).
Keith Thompson
OK, tidak apa-apa, tetapi lihat jawaban yang lain.
maaartinus