git diff yeniden adlandırılmış dosya


105

Bir dosyam var a.txt.

cat a.txt
> hello

İçeriği a.txt"merhaba" dir.

Bir taahhütte bulunurum.

git add a.txt
git commit -m "first commit"

Daha sonra a.txtbir testdizine geçiyorum.

mkdir test
mv a.txt test

Sonra ikinci taahhüdümüzü yaparım.

git add -A
git commit -m "second commit"

Son olarak, a.txtbunun yerine "hoşçakal" demek için düzenleme yapıyorum .

cat a.txt
> goodbye

Son taahhüdümüzü yapıyorum.

git add a.txt
git commit -m "final commit"

Şimdi sorum şu:

a.txtSon taahhüdüm ile ilk taahhüdüm arasındaki içeriği nasıl ayırt edebilirim?

Denedim: git diff HEAD^^..HEAD -M a.txtama bu işe yaramadı. git log --follow a.txtyeniden adlandırmayı düzgün bir şekilde algılıyor, ancak için bir eşdeğer bulamıyorum git diff. Var mı


Sanırım bir 'git mv a.txt testi' yapsaydınız da aynı olurdu? IE, dosyayı bir alt dizine taşımak yerine yeniden adlandırdınız.
Maksimum Waterman

Yanıtlar:


107

Arasındaki fark ile konu HEAD^^ve HEADbir olması a.txtbir kopyası ve bir değişiklik olduğu, hiçbir yeniden adlandırma yoktur, bu yüzden sadece (fark ne olan) bu iki hareketin dikkate her iki hareketin kaydedilmesini de.

Kopyaları algılamak için şunları kullanabilirsiniz -C:

git diff -C HEAD^^ HEAD

Sonuç:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

Bu arada, farkınızı tek bir yolla sınırlandırırsanız (yaptığınız gibi git diff HEAD^^ HEAD a.txt, yeniden adları veya kopyaları asla göremezsiniz çünkü tek bir yoldan ayrı olan her şeyi hariç tuttunuz ve yeniden adlandırır veya kopyalar - tanım gereği - iki yollar.


2
Kaydetmenin birden fazla dosya değişikliği içerdiğini varsayalım. Tek bir dosyanın farkına nasıl daraltabilirim?
Ken Hirakawa

3
@KenHirakawa kullanın -- <old-path> <new-path>... cevabıma bakın.
Nolan Amy

Benim durumumda, dosyanın yeniden adlandırıldığı bir işlemin ayrıntılarını göstermek istedim, ancak bana sadece bir dosyanın silindiğini ve bir dosyanın eklendiğini gösteriyordu ... Çalıştırdım git show -C [commit]ve dosyanın yeniden adlandırılmasını tanıdı ve bana şunu gösterdi dosyalar arasında fark. Mükemmel.
Jason

83

Belirli bir dosyanın yeniden adlandırılmasında farklılık yaratmak için -M -- <old-path> <new-path>( -Caynı zamanda çalışır) kullanın .

Her iki değiştirildi Yani eğer ve son bir dosya değişti sizinle değişiklikleri görebilirsiniz işlemeye:

git diff HEAD^ HEAD -M -- a.txt test/a.txt

Bu şunları üretir:

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

( // a.txtgit'in yeniden adlandırmayı algılamasına yardımcı olmak için satırlar eklendi)


Git yeniden adlandırmayı algılamıyorsa, düşük bir benzerlik eşiği belirtebilirsiniz -M[=n], örneğin% 1:

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

Gönderen diff docs :

-M [<n>] --find-yeniden adlandır [= <n>]

Yeniden adları algıla. Eğer nbelirtilirse, bir benzerlik endeksi eşiği (dosyanın boyutuna göre ekleme / silme yani miktarı) 'dir. Örneğin, -M90%Git'in dosyanın% 90'ından fazlası değişmediyse silme / ekleme çiftini yeniden adlandırma olarak düşünmesi gerektiği anlamına gelir. Bir %işaret olmadan sayı, önünde ondalık nokta olacak şekilde kesir olarak okunmalıdır. Yani -M50.5 olur ve bu nedenle ile aynıdır -M50%. Benzer şekilde, -M05aynıdır -M5%. Algılamayı kesin yeniden adlarla sınırlamak için kullanın -M100%. Varsayılan benzerlik endeksi% 50'dir.


... Elbette, orijinal örnekte olduğu gibi değişiklik ve yeniden adlandırma ayrı işlemlerde olduğunda da işe yarar:git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Nolan Amy

1
Sadece dosyaların içeriği diff'in bir benzerlik indeksi oluşturmasına yetecek kadar yakın olduğunda. Her iki seçeneği de (-M ve -C) kullanmak, yeniden adlandırılmış ve tamamen değiştirilmiş (indent wise dahil) bir dosyada / dev / null'dan bir / dev / null'dan bir fark göstermektir, yok sayıldığında bile yakalamıyor Beyaz boşluk.
DavidG

37

Ayrıca şunları da yapabilirsiniz:

git diff rev1:file1 rev2:file2

örneğin sizin örneğiniz için

git diff HEAD^^:./a.txt HEAD:./test/a.txt

Açık olana dikkat edin ./- bu format aksi halde yolların deponun köküne göre olduğunu varsayar. (Deponun kökenindeyseniz, elbette bunu atlayabilirsiniz.)

Kullanıcı açıkça neyin karşılaştırılacağını açıkça belirttiğinden, bu yeniden adlandırma algılamasına bağlı değildir. (Bu nedenle, dosyaları git-svn ortamında farklı svn dalları arasında karşılaştırmak gibi diğer bazı durumlarda da kullanışlı olur.)


1
Oooh, bu çok güzel!
Nolan Amy

Birleştirme yoluyla getirilen ek dosya değişiklikleri ile bir yeniden adlandırma için bu benim için işe yarayan tek cevaptır. Teşekkürler!
Lane Rettig

1

Yeniden adlandırma işleminiz aşamalıysa ancak henüz tamamlanmadıysa, şunları kullanabilirsiniz:

git diff --cached -M -- file.txt renamed_file.txt
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.