Katakanlah saya mendapatkan tambalan yang dibuat dengan git format-patch
. File tersebut pada dasarnya adalah sebuah diff terpadu dengan beberapa metadata. Jika saya membuka file di Vim, saya dapat melihat baris mana yang telah dimodifikasi, tetapi saya tidak dapat melihat karakter mana pada baris yang diubah berbeda. Adakah yang tahu cara (di Vim, atau beberapa perangkat lunak gratis lain yang berjalan di Ubuntu) untuk memvisualisasikan perbedaan per karakter?
Contoh counter dimana perbedaan per karakter divisualisasikan adalah saat mengeksekusi vimdiff a b
.
perbarui Jum 12 Nov 22:36:23 UTC 2010
diffpatch berguna untuk skenario saat Anda bekerja dengan satu file.
perbarui Kam 16 Jun 17:56:10 UTC 2016
Lihat diff-highlight di git 2.9 . Skrip ini melakukan persis apa yang awalnya saya cari.
git diff --color-words
sangat berguna untuk melihat kata-kata apa yang berubah dalam baris, daripada keluaran diff terpadu yang biasa. Ini berbasis kata daripada berbasis karakter, jadi jika tidak ada banyak spasi dalam konten yang Anda bedakan maka hasilnya mungkin kurang rapi. (Diedit: Ups, saya melihat bahwa saya salah paham tentang apa yang Anda minta - namun mungkin komentar ini akan berguna bagi seseorang.)Jawaban:
Mengingat referensi Anda ke Vim dalam pertanyaan tersebut, saya tidak yakin apakah ini jawaban yang Anda inginkan :) tetapi Emacs dapat melakukan ini. Buka file yang berisi diff, pastikan bahwa Anda berada di
diff-mode
(jika file bernamafoo.diff
ataufoo.patch
ini terjadi secara otomatis, jika tidak ketik M-xdiff-mode
RET), pergi ke sebongkah Anda tertarik dan tekan C-c C-buntukrefine-hunk
. Atau menelusuri file satu per satu dengan M-n; yang akan melakukan pemurnian secara otomatis.sumber
git log master.. -p | emacs -
M-!
untuk menjalankan perintah dan menangkap keluaran dalam buffer.Dalam git, Anda dapat menggabungkan tanpa melakukan. Gabungkan tambalan Anda terlebih dahulu, lalu lakukan:
Perhatikan titik setelah tanda sama dengan.
sumber
git diff --color-words=.
.git diff --color-words=.
dangit diff --color-words .
bekerja secara berbeda. Lebih baikgit diff --color-words .
.git diff --color-words .
ini benar-benar sama dengangit diff --color-words -- .
! Yaitu,.
diartikan sebagai jalan. Anda dapat memverifikasi denganmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Berikut adalah beberapa versi dengan keluaran yang lebih tidak berisik daripada
git diff --word-diff-regex=<re>
dan yang memerlukan lebih sedikit pengetikan daripada, tetapi setara dengangit diff --color-words --word-diff-regex=<re>
,.Sederhana (menyoroti perubahan ruang):
Sederhana (menyoroti perubahan karakter individu; tidak menyoroti perubahan spasi):
Lebih kompleks (menyoroti perubahan ruang):
Secara umum:
dimana
<re>
regexp mendefinisikan "kata-kata" untuk tujuan mengidentifikasi perubahan.Ini tidak terlalu berisik karena mereka mewarnai "kata-kata" yang diubah, sedangkan menggunakan
--word-diff-regex=<re>
"kata-kata" yang cocok untuk mengelilingi dengan-/+
penanda berwarna .sumber
--color-words
, tanpa=.
bagian.git diff --color-words='\w'
akan bekerja lebih baik dengan diakritik (git v1.7.10.4)--word-diff=plain
juga memiliki[-
dan-]
mengelilingi penghapusan dan{+
dan+}
mengelilingi tambahan. Namun, seperti yang diperingatkan oleh manual, kejadian sebenarnya dari pembatas ini dalam sumber tidak luput dengan cara apa punRegex di atas ( dari Thomas Rast ) melakukan pekerjaan yang layak untuk memisahkan fragmen diff pada tingkat tanda baca / karakter (meski tidak seribut
--word-diff-regex=.
).Saya memposting tangkapan layar dari output yang dihasilkan di sini .
Memperbarui:
Artikel ini memiliki beberapa saran bagus. Secara khusus,
contrib/
pohon repo git memilikidiff-highlight
skrip perl yang menampilkan sorotan halus.Mulai cepat menggunakannya:
sumber
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
ke awal nilai di sana. kalau tidak saya mendapat kesalahan. Juga, saya hanya menggunakan--color-words
saya mendapatkan perilaku yang sama persis dengan menggunakan regexp itu.foo.bar
untukfoo.qux
Anda akan melihat perbedaannya.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Ini sepertinya menunjukkan bahwa Homebrew's git menginstal seluruh kontribusinya/usr/local/share/git-core/contrib/
. Jadi akhirnya, yang berikut berhasil untuk sayagit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Jika Anda tidak menentang penginstalan NodeJS, ada paket bernama "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), yang sangat mudah dipasang dan berfungsi dengan sempurna:
Sunting: Baru tahu itu sebenarnya pembungkus untuk diff-highlight resmi ... Setidaknya lebih mudah untuk menginstal perlophobes seperti saya dan halaman GitHub didokumentasikan dengan baik :)
sumber
Saya tidak mengetahui alat perbedaan per karakter, tetapi ada alat perbedaan per kata: wdiff.
lihat contoh 4 Alat Perbedaan File Teratas di UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
sumber
wdiff old_file new_file | cdiff
*vimdiff
, lalu di dalam vim:windo wincmd K
untuk beralih ke tata letak jendela vertikal (satu di bawah yang lain) dari sisi ke sisi yang satu. Tata letak itu jauh lebih baik untuk file dengan garis panjang.wdiff2
,mdiff
, dan alat online Google .Setelah sedikit riset, saya melihat pertanyaan ini muncul dua kali baru-baru ini di milis utama Vim. The NrrwRgn Plugin disebutkan kedua kali (membuat dua daerah sempit dan diff mereka). Menggunakan NrrwRgn seperti yang dijelaskan oleh Christian Brabandt terasa lebih seperti solusi daripada solusi, tapi mungkin itu cukup bagus.
Saya mencoba NrrwRgn dan itu, bersama dengan: diffthis, memang berguna untuk menggambarkan perbedaan per karakter dalam bagian dari satu file. Tapi butuh banyak penekanan tombol. Vimscript saya cukup berkarat, tetapi kemungkinan besar dapat ditulis. Mungkin NrrwRgn dapat ditingkatkan untuk menyediakan fungsionalitas yang diinginkan.
Pikiran?
sumber