A git diffveya a git log -pyaptığımda, kaynak dosya (lar) ın satır numaralarını çıktıyla birlikte nasıl alabilirim?
Aramaya çalıştım man git-diff | grep "line numbers"ve googling yapmayı denedim ama çabucak hiçbir şey alamadım.
A git diffveya a git log -pyaptığımda, kaynak dosya (lar) ın satır numaralarını çıktıyla birlikte nasıl alabilirim?
Aramaya çalıştım man git-diff | grep "line numbers"ve googling yapmayı denedim ama çabucak hiçbir şey alamadım.
Yanıtlar:
git diffŞu anda satır numaralarının yanında dikey olarak görüntülenmesi için herhangi bir seçenek bulunmamaktadır git diff.
Bu bilgi, diff'deki her değişiklik için (c) hunk başlıklarında mevcuttur, ancak sadece birleşik-diff biçiminde :
@@ -start,count +start,count @@
Dosyanın orijinal durumu ile temsil edilir -ve yeni durum ile temsil edilir +(bunlar hunk başlığındaki eklemeler ve silmeler anlamına gelmez. startDosyanın her sürümünün başlangıç satır numarasını counttemsil eder ve kaç satırın dahil edildiğini temsil eder. , başlangıç noktasından başlayarak.
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
Hunk başlık
@@ -11,7 +11,7 @@
dosyanın önceki sürümünün 11. satırda başladığını ve 7 satır içerdiğini söylüyor:
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
dosyanın bir sonraki sürümü de 11. satırda başlar ve ayrıca 7 satır içerir.
Muhtemelen söyleyebileceğiniz gibi, birleşik fark biçimi, satır numaralarını anlamayı kolaylaştırmaz (en azından bir makine değilseniz). Okuyabileceğiniz satır numaralarını gerçekten istiyorsanız, bunları sizin için gösterecek bir farklılaştırma aracı kullanmanız gerekir.
--unified=0veya -U0yine de gerçekten yararlıdır .
git diffn, git diffsatır numaralarını gösteren ve tüm kullanım ve seçeneklerle tam uyumlu olan bir drop-in değiştirme (sarmalayıcı) git diff: stackoverflow.com/questions/24455377/…
Andy Talkowski'nin kodunu genişleten iki çözüm daha.
Düz metin:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
\033[66mRenk kodlarının formatı olduğu varsayılarak renkli metin :
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
Kod ile başlayan satırları değiştirir -ve +hiç -1:-ve +1:+hiçbir şey ile başlar sırasıyla, ve çizgileri için (5,6):. Numaralar, ilgili dosyadaki satır numaralarıdır.
git diffhizalamayı dikkatlice koruduğunu fark ettim . Bu kod şu anda kafamın üzerinde, bu yüzden düzeltmek ister misiniz? Başka bir deyişle, bir satır +240:+ve sonraki satır dediğinde (241,257):, kodunun alt satırdaki kodla düzgün hizalamayı ve girintiyi korumasını sağlamak için üst satıra fazladan boşluklar eklemeniz gerekir. Belki bu baskı ile kolayca yapılabilir?
printf.
git diffn. Buraya bakın: stackoverflow.com/a/61997003/4561887 . Cevabınız için teşekkürler @PFudd. Onu inceledim ve öğrenmek için kullandım, sonra sıfırdan başladım ve yazdım git diffn. Kodunuzu okuyabilmem için biçimlendirildikten sonra (teşekkürler @EdMorton), ondan bana yardımcı olan bazı harika şeyler öğrenebildim.
İşte bunu düzeltmeye çalışan bir komut dosyası - öfkeyle test edilmedi ama iyi görünüyor. Git diff'in ürettiği kayıtlara dayanır ve satır sayılarını korumak için awk kullanır.
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
git difftoolFarkı, satır numaralarını görüntüleyecek harici bir düzenleyiciyle yapmak için kullanabilirsiniz . İşte bunu vim / vimdiff ile nasıl yapacağınız:
Vimdiff'i git'in difftool'u olarak ayarlayın:
git config --global diff.tool vimdiff
~/.vimrcVimdiff kullanırken satır numaralarını otomatik olarak gösterecek şekilde yapılandırın :
if &diff
set number
endif
Vimdiff'i satır numaraları ile kullanacak git difftool'u çalıştırın:
git difftool
Hızlı bir yol kullanmaktır git diff -U0. Bu, bağlam satırlarını 0 olarak ayarlayacak ve @@ değerlerinin gerçek değiştirilmiş satırlarla eşleşmesini sağlayacaktır. Varsayılan olarak @@ değerleri, insanlar için uygun olmayan bağlamdan önce / sonra 3 satır içerir.
Misal:
git diff # default
@@ -10,8 +10,8 @@
Bu, değiştirilen satırların satır numaralarını hesaplamak zordur çünkü 10. satır, önceki bağlamın ilk satırına atıfta bulunur. İlk değiştirilen satırın gerçek satır numarası 10 + 3 = 13'tür. Değiştirilen satırların sayısını hesaplamak için, önce ve sonra bağlamını da çıkarmanız gerekir: 8-3-3 = 2.
git diff -U0
@@ -13,2 +13,2 @@
Gördüğünüz gibi, bağlam = 0 olarak ayarlamak, @@ değerlerini insanların okumasını kolaylaştırır. Değiştirilen satırların 13. satırdan başladığını ve 2 değiştirilmiş satır olduğunu görebilirsiniz.
Bu mükemmel değildir çünkü sadece her bloğun satır numarasını gösterir. Her satırın satır numaralarını görmek istiyorsanız, harici bir düzenleyici için difftool kullanın. Bkz. Https://stackoverflow.com/a/50049752
Diftool olarak meldgit difftool ile kullanmayı seviyorum. Bakmaktan daha kolay , yan yana güzel bir gui karşılaştırması var ve her iki tarafta satır numaralarını gösteriyor.git diff
git diffnSon birkaç gündür git diffkomut satırının yerine geçecek bir yer yazdım . Bi dene. Diğer cevabımı burada görün .
24 Mayıs 2020 itibariyle, artık git diffnbu amaç için üçüncü taraf aracını (tam açıklama: yazdım) kullanabilirsiniz. Bu git diff, awkkalıp / eylem tabanlı programlama dilinde yazılmış, etrafta hafif bir paketleyicidir . İşte çalıştırmanın örnek bir çıktısı git diffn:
Şunun başındangit-diffn.sh :
AÇIKLAMA:
git-diffn.sh
git diffayrıca satır 'n' sayılarını gösteren bir drop-in yedeği! Kullanın aynen böyle git diffsize değişiklikleri anlayabilir iyi yardımına olarak bu güzel satır numaralarını göreceksiniz hariç.
sadece hafif bir awk dili tabanlı sarmalayıcı olduğundan git diff, kabul eden TÜM seçenekleri ve parametreleri git diffkabul eder. Örnekler:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
git diffözel renkler kullanıyor olsanız bile renk ayarlarınızdan herhangi biriyle çalışır
Özel farklı renkleri nasıl ayarlayacağımı ve özel renk çıktısının ekran görüntüsünü nasıl göreceğimi öğrenmek için cevabıma buradan bakın git diffn: Git diff'deki diff başlığının rengini nasıl özelleştirirsiniz?
git configÖzel git diffrenkler ve nitelikler (metin biçimlendirme) ayarlamak için yukarıdaki cevabımdan bazı örnek komutlar :
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
içinde git diffnrenk çıktı varsayılan olarak AÇIK; çıktı rengini devre dışı bırakmak istiyorsanız, --no-colorveya kullanmanız gerekir --color=never. Ayrıntılar man git diffiçin bakın. Örnekler:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk. Eğer öyleyse, deneyin bu : brew install gawk.Seçenek 1 (tavsiyem): Tüm depoyu indirin ve ardından programa bir sembolik bağlantı oluşturun, böylece git pullistediğiniz zaman depodan bir yaparak güncellemeleri kolayca alabilirsiniz .
Öncelikle, cdbunu kurmak istediğiniz yere. O zaman koş:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
Bitti! Şimdi sadece aşağıdaki son adımı gerçekleştirin!
2. Seçenek (sadece 1 dosyayı isteyenler için): Bir seferde sadece bir dosyayı indirin.
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
Bitti! Şimdi sadece aşağıdaki son adımı gerçekleştirin!
Son adım:
Şimdi terminalinizi kapatıp yeniden açın veya ile yeniden kaynak yapın . ~/.bashrc, işte bu kadar!
git diffnşimdi tam bir drop-in yerine geçecek git diff!
İşte bir demo:
git diffn:Bu dosyayı oluşturun:
hello_world.c:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Teslim et:
git add hello_world.c
git commit -m "add hello_world.c"
Buna değiştirin ve dosyayı kaydedin:
hello_world.c:
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
Şimdi çalıştırın:
git diff
git diffKarşılaştırma amaçlı ilk çıktı şu şekildedir:
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
Ve rengi göstermek için bir ekran görüntüsü. Kırmızı ile vurgulanan bölümün, silinebilecek boş beyaz boşlukları (bu durumda boşluklar) gösterdiğini unutmayın:
Şimdi işte çıktı git diffn. Tüm satır numaralarını mükemmel şekilde gösterdiğine dikkat edin!
-için hem en solunda hem de sağında bir işaret gösterir :- gözleriniz ister kolonun sağına, ister uzaklara doğru taramak ister ekranın solunda.+ hem en solunda hem de sağında bir işaret gösterir :.,.Çıktı git diffn:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
Ve rengi göstermek için bir ekran görüntüsü. İki nokta üst üste işaretlerinin, soldaki ve sağdaki çevreleyen metinle eşleşecek şekilde renkli veya stilize OLMADIĞINA dikkat edin. Bu, kasıtlı ve solda eklenen satır numaraları git diffile sağdaki orijinal çıktı arasında görsel bir ayırıcı görevi görecek şekilde tasarlanmış bir davranıştır .
Deneyebilirsin
git blame
dosyada. Dosyadaki her satır için kaydedici, commit kimliği ve satır numarasını gösterir.
git blamesadece dosyanın mevcut durumunu satır numaraları ile gösterecektir.
git blamesoruyu hiçbir şekilde yanıtlamaz; Buradaki olumlu oylar beni oldukça şaşırttı
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'