Git fark sadece değiştirilmiş satırları gösterir


128

Git diff yaptığımda, eklenen satırları gösteriyor:

+ this line is added

kaldırılan satırlar:

- this line is removed

ancak değiştirilmemiş birçok satırı da gösterir:

this line is not modified
this line is also not modified

Bu, gerçek git farkının şöyle görünmesine neden olur:

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified

Git'ten sadece değiştirilmiş satırları göstermesini ve değiştirilmemiş diğer tüm kodları görmezden gelmesini isteyebilir miyim? Önlerinde "+" veya "-" işareti olmayan tüm satırları kaldıracak bir yöntem yazdım, ancak eminim bunu yapmanın daha basit bir yolu olmalı.

Git farkımda, sadece değiştirilmiş satırları görmekle ilgileniyorum.

Şimdiden teşekkürler.

Yanıtlar:


182

İstediğiniz, 0 satır bağlam içeren bir farktır. Bunu şununla üretebilirsiniz:

git diff --unified=0

veya

git diff -U0

Ayrıca bunu o arşiv için bir yapılandırma seçeneği olarak da ayarlayabilirsiniz:

git config diff.context 0

Herhangi bir havuz için global olarak ayarlanmasını sağlamak için:

 git config --global diff.context 0

4
Hızlı cevap için teşekkürler. Bu, sorunumun yarısını çözüyor, ancak farkımda "@@ -1 +1 @@" gibi bazı satırlar alıyorum ve git farkımın üstünde "diff --git a / db / xxxxxxx b / db / xxxx indeksi var xxxxx..aaaaaaa bbbbbbbb
r3b00t

3
Git'in bu satırların çıktısını almaktan kaçınmak için herhangi bir yol sağladığını sanmıyorum, çünkü fark onlar olmadan anlamlı olmaz (hangi dosyaya baktığınızı veya dosyanın neresinde olduğunuzu bilemezsiniz).
Chris Hayes

8
@Rakesh: Genişletmek için git-diff, aslında kaynak dosyalara yama olarak kullanılabilen farklar yaratmaya çalışır, bu bilgi olmadan imkansızdır. Bunu kaldırmanın tek yolu, örneğin aracılığıyla, kendiniz sonradan işlemek olacaktır git diff | egrep "^(\+|-) ".
Chris Hayes

1
git config --global diff.context 0 küresel olarak ayarlanması
Andrzej Rehmann

Belirli bir dizinde görmek istiyorsanız git diff -U0 <dir>
Eswar Yaganti

41

(Un * x üzerine) Bir diğer hack ile başlayan sadece çizgiler göstermek +ve -:

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'

Yukarıdaki kod şunları yapar:

  • git diff -U0: 0 bağlam satırı seçin
  • İlk grep yalnızca +veya ile başlayan tüm satırları içerir-
  • İkinci grep, --- a/veya ile başlayan satırları hariç tutar+++ b/

Renk

Renkli farkı göstermek için aşağıdakileri deneyin:

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • İfade, ^\e\[[^m]*m[-+]satırın başlangıcını ( ^), ardından kaçış karakterini ( \e) arar ve ardından [birlikte kaçış dizisini başlatır, ardından "m" olmayan herhangi bir karakter (sayılar, noktalı virgül veya hiçbir şey), ardından bir " kaçış dizisini bitiren m ".
  • Aşağıdakilerin hepsinin geçerli kaçış dizileri olduğuna dikkat edin: \e[0m(sıfırla), \e[m(sıfırla), \e[1m(kalın açık), \e[31m(kırmızı), \e[32m(yeşil ), (üstü çizili + \e[9;31mkırmızı), \e[31;9m(kırmızı + üstü \e[1;4;9;31mçizili ), (kalın + altı çizili + üstü çizili + kırmızı). Varsayılan git renkleri kırmızı ve yeşil kullanır, ancak yeniden yapılandırılabilirler.
  • --colorile aynıdır --color=always.
  • Hattın başlangıcında görünme --- a/veya +++ b/kaçış dizilerine uyum sağlamak için kısıtlama kaldırıldı ve bu bir uç duruma yol açabilir.

Ek Notlar:

  • Gibi ek diff seçeneklerini kullanmak durumunda yukarıdaki çözüm değiştirilmesi gereken -R, --src-prefix, --dst-prefix, --no-prefix, vb
  • İki grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'grep tek bir grupta birleştirilebilir , ancak çift grep versiyonunun anlaşılmasını daha kolay buluyorum.

2
Güzel bir. Her filtrenin net açıklaması için oy verin.
henrebotha

git diffİle başlayan birçok "başlık" türü satır görüyorum @@, ancak veya git diffile başlayan satırlar nelerdir? Bunların farkında değildim. ---+++
Gabriel Staples

Ah boşver. Bunlar, eklemeler ( +++) veya silmeler ( ---) içeren dosyalar için dosya adlarını belirtir . Bunu şimdi burada görüyorum: git-scm.com/docs/git-diff#_combined_diff_format .
Gabriel Staples

Yine düzeltme: --- a/filename"soldaki dosyayı" veya dosyayı daha önce olduğu +++ b/filenamegibi gösteriyor gibi görünüyor ve "sağdaki dosyayı" veya değişikliklerinizle birlikte şu an olduğu gibi dosyayı gösteriyor gibi görünüyor. Yan yana güzel karşılaştırmalar gösteren git difftoolmeld ile kullanmaya o kadar alıştım ki , bakmaya hiç alışamadım git diff, bu yüzden bana hala garip geliyor ve bu nüanslara daha önce hiç bakmadım.
Gabriel Staples

1
@GabrielStaples, renk desteği eklendi. Teşekkürler.
user650654

6

Chris'in son yorumunu takiben, işlem sonrası ana sorun, satırların başlamasını sağlamak istemenizdir, -|+ancak aynı zamanda başlayanları da filtrelemek istemenizdir ---|+++. Eğer deponuzda yama dosyaları depoluyorsanız ( Pydoop'ta yaparım ), öte yandan, satırları --|++onunla başlayan tutmak istersiniz , böylece regexp biraz dahil olur:

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'

Normal ifade olumsuz bir ilerleme kullanır: ayrıntılı bir açıklama için Peter Boughton'un bu soruya verdiği cevaba bakın .

Bunu sık sık yaparsanız, bunun için bir git takma adı ayarlamak isteyebilirsiniz:

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'

1
bu benim için Windows git bash üzerinde çalışmadı. Nedenini bilmiyorum (grep geçersiz P seçeneğini söyledi), şu anda ona bakacak küstahlığa sahip değilsiniz.
Dennis

1
-Pveya --perl-regexpkalıbı Perl düzenli ifade olarak yorumlamak için kullanılır, ancak her zaman uygulanmaz. OSX'te benim için işe yaramadı. gnu.org/software/grep/manual/grep.html#grep-Programs
Willington Vega

5

Basit durumlarda normal ifadenin çok daha kısa ve hatırlanması daha kolay olabileceğini düşünüyorum; satırın kendisinin +veya-

$ git diff | grep '^[+|-][^+|-]'

Normal ifade, satırın +veya ile başlaması gerektiğini -ve hemen ardından gelen karakterin bunlardan hiçbiri olmaması gerektiğini söyler . +Buradan kaçsam da kaçmasam da aynı sonuçları aldım , btw ...


Misal:

$ cat testfile
A
B
C
D
E
F
G

Say I değişim Ciçin X, Eiçin Y, ve Giçin Z.

$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z

Yukarıda söylediğim gibi, yine de, bu sadece çoğu durumda. Bu çıktıyı bir dosyaya aktarırsanız dout, aynı normal ifadeyi deneyin, işe yaramaz.

$ git diff dout | grep '^[+|-][^+|-]'
$

Her neyse, umarım bu senin durumunda yardımcı olur


Satırın "-" ile başladığı durumlarda işe yaramaz. Örnek: - name: No pdbbir yaml dosyasında.
anapaulagomes

3

Bu cevap, okunabilirlik için orijinal kırmızı / yeşil renkleri koruyacaktır. Söz diziminde birkaç değişiklik sağladım:

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'

Açıklama:

  • git diff --colorO çikacak kadar renk devre dışı bırakmasını budala önlemek için gereklidir.
  • Bunun grep --color=neveramacı, grep'in orijinal rengi kaldırmasını ve eşleşen dizeyi vurgulamasını önlemektir.
  • Kırmızı ( \e[31m) veya yeşil ( \e[32m) kaçış kodlarıyla başlayan satırları eşleştiriyoruz .
  • $'...'(ANSI-C Bash'de) ya da -P(Perl sözdizimi) sağlamaktır grepyorumlamak \eveya \033bir şekilde ESCkarakteri.

Bunun için teşekkürler. İşte yeni bulduğum alternatif bir form. Senin $''rolün özellikle bana yardımcı oldu. stackoverflow.com/a/61929887/4561887
Gabriel Staples

1

awkYalnızca +ve -çizgilerini göstermek için nasıl kullanılır , herhangi bir renk veya metin biçimlendirmesinin git diffhesaba katılması çıktı olabilir:

Buradaki diğer cevaplardan hiçbiri ( diğer cevabım dahil ) tam olarak istediğiniz şeyi% 100 doğru şekilde yapmayacaktır. Ancak bu cevap olacaktır. İşte kopyalayıp terminalinize yapıştırabileceğiniz 1 astar. Okunabilirlik için birkaç satır yaptım - her iki şekilde de kopyalayıp yapıştırabilirsiniz, böylece okunabilir hale getirebilirim! awkProgramlama diline dayanır :

git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
    next 
} 
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with 
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
    print $0 
}
' | less -RFX

İşte özellikleri. Tüm bu özellikler, birlikte ele alındığında, burada diğer her yanıtın eksikliklerini çözer:

  1. Renkli VE renksiz çıktıları işler. Bu normal ifadenin yaptığı şey budur:^(\033\[(([0-9]{1,2};?){1,10})m)?
  2. Ayarlarınızda belirleyebileceğinizgit config kalın, italik, üstü çizili vb. Dahil olmak üzere TÜM RENKLERİ ve TÜM METİN BİÇİMLENDİRME SEÇENEKLERİNİ işler . Bu yüzden yukarıdaki regex'in içinde ;?ve {1,10}içinde: bir renk veya metin biçimlendirme kodunun başlangıcını algılarsa, bu birleştirilmiş ANSI kodlarının en fazla 10 dizisiyle eşleşir.
  3. Kabul edilen yanıtın yaptığı gibi, ile başlayan satırları @@ve kelimeyi de İÇERMEZ . Bu satırları istiyorsanız (ki açıkçası, yararlı olduğunu düşünüyorum :)), bunun yerine şunu yapın:diff

    git diff --unified=0
    

    veya

    git diff -U0
    
  4. Çıktıyı olduğu gibi tam olarak aynı şekilde gösterir git diff: lessisteğe bağlı renkli çıktıya sahip çağrı cihazında ( -R) ve yalnızca metin> 1 sayfa ( -F) ise ve quit ( -X) yaptığınızda ekrandaki metnin geçerli sayfasını korurken .

Ayrıca awk programlama dilini kullandığından güçlü ve kolay yapılandırılabilir olma avantajına da sahiptir .

Awk öğrenmekle ilgileniyorsanız , işte bazı kaynaklar:

  1. gawk(GNU awk) kılavuzu: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  2. Çalışma git diffnve oradaki yorumlar: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
    1. Satır numaraları ile git diffnde istiyorsanız , git diffburaya bakın: Satır numaraları ile Git fark (Satır numaraları ile Git günlüğü)
  3. Bazı awk "merhaba dünya" ve sözdizimi testi örnekleri: https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

Bir bonus olarak, yukarıdakileri git diffc"YALNIZCA 'değişimleri göstermek için git diff" anlamına gelen şekilde kullanmak üzere tamamladım . Kullanım olan özdeş için git diff; sadece git diffcbunun yerine kullanın! TÜM seçenekleri destekler. Renk varsayılan olarak AÇIK'tır. Kapatmak için git diffc --no-colorveya kullanın git diffc --color=never. Ayrıntılar man git diffiçin bakın.

Dün gece (satır sayıları ile git diffngösterilen bir araç) bitirdiğimden beri git diffyazmak git diffcönemsizdi. Bilgi kafamda tazeyken şimdi yapsam iyi olur diye düşündüm.

Kurulum git diffc:

Takip buradaki cevabın sonunda talimatları Gördüğünüz her yerde hariç, git-diffntalimatlar kullanmak git-diffcyerine. Buna wgetkomuta da dahildir. İndirmek ve kurmak git diffckolaydır: sadece birkaç komuttur.


0

Burada, yalnızca değiştirilmiş satırları bulmanın ve dolayısıyla tek bir satırla +veya -renk çıktısını korurken başlamanın daha basit bir yolu :

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. -U0Az önce değişti hatları kendileri şunlardır: yani - değiştirilen hatların etrafında bağlamın 0 hatları dahil etmek söylüyor. Bakın man git diff.
  2. -EGrep uzatıldı düzenli ifadeler ile çalışmak için izin veriyorsa
  3. $''Sözdizimi görünüşte ANSI düzgün düzgün ESC (kaçış veya 0x1B'dir) karakteri yorumladığı, alıntı sağlar. Buraya bakın .
  4. Ve işte https : //www.regex101.com'daki normal ifade açıklaması :görüntü açıklamasını buraya girin
  5. Temel olarak, ^satırın başıyla \eeşleşir, terminaldeki bir renk kodunun başlangıcı olan Escape karakteri ile eşleşir, renk kodundaki \[sonraki karakterle eşleşir [ve ardından (this|that)sözdizimi "this" veya "that" ile eşleşir , burada "bu", 32m+yeşil + çizgidir ve 31m-kırmızı çizgidir.
  6. Renkler şu şekildedir: \e[32myeşil ve \e[31mkırmızıdır.
  7. +ile işaretlenmiş Şekil hatları git diff, ilave ve tabii ki olarak -gösterir çizgiler ile işaretlenmiş git diffsilinmiş olarak.
  8. Not --color=neveredilir gerekli 2 de grepaksi gelen renk kodlarını berbat olur onun maçları, vurgulama önlemek amacıyla ifade git diffsola.
  9. +Olarak çok kaçan gereken \+çünkü aksi takdirde +belirten bir özel normal ifade (normal ifade) karakteridir önceki elemanın bir veya daha fazla örneği . Buraya bakın: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .

Referanslar:

  1. https://git-scm.com/docs/git-diff#_combined_diff_format
  2. @ User650654 tarafından verilen cevap: Git diff, yalnızca değiştirilmiş satırları gösterir
  3. @Wisbucky tarafından yanıt: Git diff, yalnızca değiştirilmiş satırları gösterir

İlişkili:

  1. [kendi cevabım] Satır numaralarıyla Git farkı (Satır numaraları ile Git günlüğü)
  2. [başkasının cevabı] Satır numaralarıyla Git farkı (Satır numaraları ile Git günlüğü)
  3. satır numaraları ve uygun kod hizalaması / girintisi ile git diff
  4. git-filechange-search.sh- Eğer hangi bir değişken veya işlev adı ve resim dosyası arama yapmanızı sağlayan bir komut dosyası kaydedilmesini o değişken veya fonksiyon adıyla değişiklikleri içerir. Ör. kullanım: ./git-filechange-search.sh path/to/my/file.cpp variable_nameTüm bulacaksınız kaydedilmesini ihtiva file.cpp değişikliklerle birlikte variable_nameonlarda. Bu, belirli özelliklerin nerede ve ne zaman değiştirildiğini görmek için kullanışlıdır. Sanki git blamezaman içinde görüntülenen bir dosyanın bölümlerini gözlemleyebilen bir arama gibiydi .
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.