Birleşik bir diff dosyasında karakter başına farklılıkları nasıl görselleştirebilirim?


122

İle oluşturulmuş bir yama aldığımı varsayalım git format-patch. Dosya temelde bazı meta verilerle birleşik bir farktır. Dosyayı Vim'de açarsam, hangi satırların değiştirildiğini görebilirim, ancak hangilerinin değiştirilen satırlardaki karakterlerin farklı . Karakter başına farklılıkları görselleştirmenin bir yolunu (Vim'de veya Ubuntu üzerinde çalışan başka bir özgür yazılımda) bilen var mı?

Karakter başına farkın görselleştirildiği bir sayaç örneği, yürütülürken vimdiff a b .

güncelleme Cum Kasım 12 22:36:23 UTC 2010

diffpatch, tek bir dosyayla çalıştığınız senaryo için yararlıdır .

güncelleme Prş Haz 16 17:56:10 UTC 2016

Check out Git 2.9 diff-vurgulama . Bu senaryo tam olarak benim aradığım şeyi yapıyor .


Bu, superuser.com'da daha iyi olabilir
Daenyth

13
Belki. SSS'de "programcılar tarafından yaygın olarak kullanılan yazılım araçları" ile ilgili soruların yer aldığı yer olduğundan stackoverflow.com'u seçtim
Adam Monsen

7
Bunun sorunuzu doğrudan yanıtladığından emin değilim, ancak git diff --color-wordsnormal birleşik diff çıktısı yerine yalnızca satırlar içinde hangi kelimelerin değiştiğini görmek için çok kullanışlıdır. Yine de karakter tabanlı olmaktan ziyade kelime tabanlıdır, bu nedenle farklılaştığınız içerikte fazla boşluk yoksa çıktı daha az düzgün olabilir. (Düzenlendi: Oops, ne istediğinizi yanlış anladığımı görüyorum - yine de bu yorum birisi için yararlı olabilir.)
Mark Longair

Yanıtlar:


13

Soruda Vim'e referanslarınız göz önüne alındığında, istediğiniz cevabın bu olup olmadığından emin değilim :) ama Emacs bunu yapabilir. Diff içeren dosyayı açın emin olduğumuza yapmak diff-mode(dosyanızın adı foo.diffveya foo.patchaksi takdirde yazın bu otomatik olarak gerçekleşir M-x diff-mode RET, sen ilgilenen ve isabet iri parça gidin) C-c C-biçin refine-hunk. Veya dosya üzerinde her seferinde bir parça ile adım atın M-n; bu, arıtma işlemini otomatik olarak yapacak.


1
Benim için çalışıyor! Heh, Vim'i 10 yıldır kullandım ama yeni emac'ler kurdum. :)
Adam Monsen

Ancak emacs stdin'den okumayı desteklemiyor, örneğin yapamıyorumgit log master.. -p | emacs -
Hi-Angel

1
@ Hi-Angel Emacs'i açabilir ve M-!komutu çalıştırıp çıktıyı bir arabellekte yakalamak için yazabilirsiniz .
legoscia

172

Git'te taahhütte bulunmadan birleştirebilirsiniz. Önce yamanızı birleştirin, ardından şunları yapın:

git diff --word-diff-regex=.

Eşittir işaretinden sonraki noktaya dikkat edin.


139
Daha iyi: git diff --color-words=..
ntc2

4
@ ntc2 Yorumunuzu bir cevap yapmalısınız.
Tyler Collier

1
Oy verenler lütfen unutmayın, benim orijinal kullanım durumumda yalnızca bir yama dosyanız olduğunu , git deposu olmadığını ve hatta temel / değiştirilmiş sürümleri olduğunu varsayar . Bu yüzden @ legoscia'nın cevabını kabul ettim ... tam olarak ne talep edildiğini açıklıyor.
Adam Monsen

2
@ ntc2 git diff --color-words=.ve git diff --color-words .farklı çalışır. Daha iyi git diff --color-words ..
abhisekp

2
@abhisekp: resim için teşekkürler. Sanırım anladım: git diff --color-words .gerçekten aynı git diff --color-words -- .! Yani, .bir yol olarak yorumlanır. İle doğrulayabilirsiniz mkdir 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 -- ..
ntc2

145

İşte daha az gürültülü çıkışa sahip olan git diff --word-diff-regex=<re>ve daha az yazma gerektiren ancak eşdeğer olan bazı sürümler git diff --color-words --word-diff-regex=<re>.

Basit (vurgu alanı değişir):

git diff --color-words

Basit (tek tek karakter değişikliklerini vurgular; boşluk değişikliklerini vurgulamaz):

git diff --color-words=.

Daha karmaşık (vurgulanan alan değişir mi):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

Genel olarak:

git diff --color-words=<re>

<re>değişiklikleri tanımlamak amacıyla "kelimeleri" tanımlayan bir normal ifade nerede bulunur .

Bunlar, değiştirilen "kelimeleri" renklendirdiklerinden daha az gürültülüdür, ancak yalnızca --word-diff-regex=<re>eşleşen "kelimeleri" renkli -/+işaretçilerle çevrelemektedir .


9
Ben kendim gibi --color-words, =.parçası olmadan .
Tyler Collier

1
git diff --color-words='\w'diacritics (git v1.7.10.4) ile daha iyi sonuç verir
nr

1
Daha karmaşık sürümünüz harika çalışıyor. Ben, ekteki --word-diff=plainilave olması [-ve -]çevre silme ve {+ve +}çevre eklenen. Manuel uyarır gibi olsa da, kaynakta bu sınırlayıcı fiili oluşumları vardır değil herhangi bir şekilde kaçan
Tobias Kienzler

2
Maalesef örneğin girinti değişiklikleri vurgulamak için görünmüyor Sizin daha karmaşık versiyonu, ben açtım soru bu konuda
Tobias Kienzler

Bu cevap harika! Ancak bu değişikliklerin arka planını yeşil / kırmızı olarak değiştirmenin bir yolu var mı?
WoLfPwNeR

45
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

Yukarıdaki normal ifade ( Thomas Rast'tan ), noktalama / karakter düzeyinde (kadar gürültülü olmasa da --word-diff-regex=.) diff parçalarını ayırmak için iyi bir iş çıkarır .

Elde edilen çıktının bir ekran görüntüsünü burada yayınladım .


Güncelleme:

Bu makalenin bazı harika önerileri var. Spesifik olarak, contrib/git repo'sunun ağacında diff-highlightince taneli vurgular gösteren bir perl betiği vardır.

Kullanmak için hızlı başlangıç:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R

5
Bunu kısaltabilirsiniz--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Düzenlendi

'oradaki değerin başlangıcına eklemek zorunda kaldım . aksi halde bir hata aldım. Ayrıca, ben basitçe --color-wordskullanarak o regexp ile aynı davranışı elde ediyorum.
gcb

3
@gcb Metin içeriği önemlidir. Değişiklikleriniz boşlukla ayrılmışsa, hiçbir fark yoktur. Eğer böyle bir şey değiştirmek Ama eğer değiştirirseniz foo.bariçin foo.quxfarkı göreceksiniz.
Justin M.Keyes

5
Daha basit: git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'.
ntc2

1
Git'i Homebrew ile kurmuştum ve o betiğe zaten sahiptim /usr/local/share/git-core/contrib/diff-highlight/diff-highlight. Bu , Homebrew'in git'in tüm katkıyı yüklediğini gösteriyor gibi görünüyor /usr/local/share/git-core/contrib/. Sonunda, aşağıdakiler benim için çalıştıgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Ashutosh Jindal

6

NodeJS'yi kurmaya karşı hiçbir şeyiniz yoksa, "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ) adında , kurulumu çok kolay ve mükemmel çalışan bir paket var :

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

Düzenleme: Bunun aslında resmi diff-vurgulama için bir paketleyici olduğunu öğrendim ... En azından benim gibi perlofoblar için kurulumu daha kolay ve GitHub sayfası güzelce belgelenmiştir :)


2

Karakter başına fark aracının farkında değilim, ancak bir sözcük başına fark aracı var: wdiff.

örneklere bakın UNIX / Linux'ta İlk 4 Dosya Farkı Aracı - Diff, Colordiff, Wdiff, Vimdiff .


wdiff ilginç, teşekkürler! Orijinal sorumu açıklığa kavuşturmak için, birleşik fark biçiminde olan tek bir dosya için gelişmiş sözdizimi vurgulaması sağlayan bir şey arıyorum.
Adam Monsen

Biraz konu dışı (kelime kelime farklar hakkında, önceden var olan bir fark çıktısını geliştirmemekle ilgili), ancak aşağıdaki kombinasyonları kelimesi kelimesine görselleştirmeler için en iyi buldum: * wdiff old_file new_file | cdiff * vimdiff , ardından :windo wincmd Kdikey pencere düzenine geçmek için vim içinde (biri diğerinin altında) yan yana. Bu düzen, uzun satırlara sahip dosyalar için çok daha iyidir.
Aleksander Adamowski

2
: BTW, bazı diğer araçlar kontrol değer, bağlantılı makalede belirtilmeyen wdiff2, mdiffve Google'ın çevrimiçi araç .
Aleksander Adamowski

1

Küçük bir araştırmadan sonra, bu sorunun son zamanlarda ana Vim posta listesinde iki kez gündeme geldiğini fark ettim. NrrwRgn eklenti sözü edilen her iki kez (iki dar bölge yapmak ve onları diff). Christian Brabandt tarafından açıklandığı gibi NrrwRgn kullanmak, bir çözümden çok geçici bir çözüm gibi hissediyor, ama belki de bu yeterince iyi.

NrrwRgn'yi denedim ve birlikte: diffthis, tek bir dosyanın parçaları içindeki karakter başına farklılıkları göstermek için gerçekten yararlıydı. Ancak birçok tuş vuruşu aldı. Vimscript'im oldukça paslı, ancak muhtemelen senaryolu olabilir. Belki NrrwRgn, istenen işlevselliği sağlamak için geliştirilebilir.

Düşünceler?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.