git diff dosyası son değişikliğine karşı


236

Git'in şu an var olduğu ve onu değiştiren son işlemden önce var olduğu gibi belirli bir dosya arasında fark üretmesi mümkün müdür?

Yani, eğer bilersek:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

Sonra git diff 456def myfiledosyamdaki son değişikliği gösterir. Bunların ürettiği bilgi olmadan da aynısını yapmak mümkündür git log; 123abc'de neler değişti?


8
Kullanmayı tercih ediyorumgit diff HEAD^ <file_path>
asgs

4
@asgs - (- iki nedenden dolayı mu ben ne sorduğunu yapamaz HEAD^edilir 123abc, HEAD^^olup 456def; ve diğer onaylatabilirsiniz olsaydı bu dosyayı etkilemedi sonra HEAD^onlara atıfta)
Chowlett

Haklısın, "onu değiştiren son taahhüt" bölümünü
kaçırdın

Yanıtlar:


215

Bu var, ama aslında bir özelliği git log:

git log -p [--follow] [-1] <path>

Not -payrıca tek bir satır içi diff göstermek için kullanılabilir taahhüt:

git log -p -1 <commit>

Kullanılan seçenekler:

  • -p(ayrıca -uveya --patch) git-logman sayfasında deeeeeeeep gizlidir ve aslında bir görüntüleme seçeneğidir git-diff. logBununla birlikte kullanıldığında , her bir işlem için oluşturulacak düzeltme ekini ve işlem verme bilgileri gösterilir ve belirtilen değere dokunmayan işlemleri gizler<path> . (Bu davranış, --full-diffher bir taahhüdün tam farkının gösterilmesine neden olan paragrafta açıklanmıştır .)
  • -1gösterileri sadece en son değişiklik belirtilen dosyanın ( -n 1yerine kullanılabilir -1); aksi takdirde, o dosyanın sıfır olmayan tüm farkları gösterilir.
  • --follow bir yeniden adlandırma işleminden önce yapılan değişiklikleri görmek için gereklidir.

Anlayabildiğim kadarıyla git log, araya giren revizyonların sayısını saymak veya taahhüdün karmasını belirlemek için (veya benzeri) kullanmadan bir dosyada yapılan son değişiklik kümesini hemen görmenin tek yolu budur .

Eski revizyon değişikliklerini görmek için günlükte ilerlemeniz veya günlüğün başlatılacağı bir taahhüt veya etiket belirtmeniz yeterlidir. (Tabii ki, bir taahhüt veya etiket belirtmek sizi doğru taahhüt veya etiketin ne olduğunu bulma sorununa döndürür.)

Kredinin vadesi gelen kredi:

  • Bu cevaplog -p sayesinde keşfettim .
  • FranciscoPuga'ya teşekkür ederim ve bu--follow seçeneği bana seçeneği gösterdiği için .
  • Seçenek bahsettiği için ChrisBetti'ye -n 1ve varyanttan bahsettiği için atatko'ya teşekkür ederiz -1.
  • Gerçekten belgeleri okumak ve -panlamsal olarak " ne anlama geldiğini" anlamak için sweaver2112 için teşekkür ederiz .

6
Bu benim için harika bir çözümdü. Ne zaman koştum her dosya ve onun mevcut dosya ile arasındaki farkları gösterdigit log -p filename
Ian Jamieson

4
Mükemmel. Sadece son değişikliği görmek için, -n 1parametreyi eklemek kadar basittir . git log -p -n 1 filename
Chris Betti

@ChrisBetti Teşekkürler; Bunu cevabıma dahil ettim!
Kyle Strand

1
-n 1ile de -1değiştirilebilir, sonucu değiştirmez Sadece sözdizimini tercih ederim:git log -p -1 filename
atatko

1
yararlı bir seçenek vardır "--skip = [n]". git log -p -1 --skip=1 <path>İkinci taahhüdü görüntülemek için yazabilirsiniz .
Maciek Łoziński

220

Git diff kullanmanın yollarından biri:

git diff <commit> <path>

Ve son taahhüdün bir taahhüdünü ifade etmenin yaygın bir yolu, gerçek HEAD'e göreceli bir yoldur. Önceki işlemlere HEAD ^ (örneğinizde bu 123abc olacaktır) veya HEAD ^^ (örneğinizde 456def) vb.

Yani sorunuzun cevabı:

git diff HEAD^^ myfile

6
Oo elbette. Denedim HEAD^, ama elbette bu hiçbir şey üretmedi. Denemek düşünmemiştim HEAD^^.
Chowlett

17
Belki de uzun zaman önce sözdizimi daha kolay taahhüt eder:HEAD~2
ibizaman

19
HEAD^^ myfileDeğişen ikinci-son taahhüdüne atıfta bulunacak doğru değil (en azından Git 1.9.0 için) myfile; genel olarak ikinci-son taahhüdüne atıfta bulunacaktır. Taahhüt karmasını belirtmeden (bir kısmını) veya söz konusu dosyada yapılan son değişiklik ile geçerli revizyon arasındaki taahhüt sayısını saymadan "Bu dosyada yapılan son değişikliği görmek istiyorum" seçeneğini belirtmenin bir yolu var mı ?
Kyle Strand

3
Hmm, git log -poldukça yakın görünüyor .
Kyle Strand

30
aşağı oylama nedeni: soru "şu an var olan belirli bir dosya arasında ve onu değiştiren son işlemden önce var olduğu için" soruyor , ancak dosya son genel işlemde değiştirilmediyse, bu cevap çalışmaz.
Chris Betti

8

Bir grafik aracı kullanarak sorun yaşıyorsanız, bu çok iyi çalışır:

gitk <file>

gitk artık dosyanın güncellendiği tüm taahhütleri gösteriyor. Bir taahhüdü işaretlemek, listedeki bir önceki taahhüdün farkını gösterir. Bu aynı zamanda dizinler için de çalışır, ancak daha sonra seçilen kesinleştirme için farklı olan dosyayı da seçersiniz. Süper kullanışlı!


1
Ayrıca çok yararlı: git difftool HEAD^ fileveyagit difftool -d HEAD^ path
ForeverLearning
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.