A git diff
veya a git log -p
yaptığı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 diff
veya a git log -p
yaptığı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. start
Dosyanın her sürümünün başlangıç satır numarasını count
temsil 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=0
veya -U0
yine de gerçekten yararlıdır .
git diffn
, git diff
satı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[66m
Renk 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 diff
hizalamayı 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 difftool
Farkı, 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
~/.vimrc
Vimdiff 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 diffn
Son birkaç gündür git diff
komut 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 diffn
bu amaç için üçüncü taraf aracını (tam açıklama: yazdım) kullanabilirsiniz. Bu git diff
, awk
kalı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 diff
ayrıca satır 'n' sayılarını gösteren bir drop-in yedeği! Kullanın aynen böyle git diff
size 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 diff
kabul 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 diff
renkler 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 diffn
renk çıktı varsayılan olarak AÇIK; çıktı rengini devre dışı bırakmak istiyorsanız, --no-color
veya kullanmanız gerekir --color=never
. Ayrıntılar man git diff
iç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 pull
istediğiniz zaman depodan bir yaparak güncellemeleri kolayca alabilirsiniz .
Öncelikle, cd
bunu 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 diff
Karşı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 diff
ile 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 blame
sadece dosyanın mevcut durumunu satır numaraları ile gösterecektir.
git blame
soruyu 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]+)?(?= @@)'