git: Çekme işleminden sonra değiştirilen dosyalar ile önceki sürümler arasında nasıl fark bulunur?


117

"Git pull" komutunu çalıştırdığımda, genellikle bir dosyanın son sürümü ile yenisi arasında neyin değiştiğini bilmek isterim. Diyelim ki başka birinin belirli bir dosyaya ne işlediğini bilmek istiyorum.

Bu nasıl yapılır?

İşlem x ve commit y için bazı parametrelerle "git diff" olduğunu varsayıyorum, ancak sözdizimini alamıyorum. Ayrıca "git log" u biraz kafa karıştırıcı buluyorum ve dosyanın en son sürümünün commit kimliğini yenisine göre nereden alacağımdan emin değilim.


1
Gitk grafik aracını daha çok zevkinize göre bulabilirsiniz.
crazyscot

Yanıtlar:


158

Kaydetmeyi belirlemenin her türlü harika yolu vardır - daha fazla ayrıntı için 'nin revizyonları belirleme bölümüne man git-rev-parsebakın. Bu durumda, muhtemelen şunları istersiniz:

git diff HEAD@{1}

@{1}Böylece araç "Ben belirttiğiniz ref önceki konumu", daha önce teslim ne değerlendirir - sadece çekme önce. HEADÇalışma ağacınızda da bazı değişiklikleriniz varsa ve bunlar için farkları görmek istemiyorsanız, oraya gidebilirsiniz .

"Dosyanın en son sürümünün yürütme kimliği" ile ne istediğinizden emin değilim - "Kimlik" (SHA1 karması), çıktıdaki her girişin sağ üstündeki 40 karakterlik onaltılıktır git günlüğü. Bu, belirli bir dosya için değil, tüm commit için bir karmadır. Gerçekten daha fazlasına ihtiyacınız yok - çekme boyunca yalnızca bir dosyayı ayırmak istiyorsanız,

git diff HEAD@{1} filename

Bu genel bir şeydir - belirli bir işlemedeki bir dosyanın durumu hakkında bilgi edinmek istiyorsanız, dosyaya özgü bir kimlik / karma değil, yürütmeyi ve dosyayı belirtirsiniz.


VonC'nin bağlantılı önceki gönderisi aslında bununla aynı şeyi söylüyor, ancak açıklama biraz farklı, bu yüzden bunu şimdilik bırakacağım. (Aynı zamanda @{1}kısaltma olarak da kullanılır HEAD@{1})
Cascabel

doğru, ama açıklamayı da beğendim. +1
VonC

Bu tam olarak aradığım şeydi. Açıklama için teşekkür ederim.
lucapette

Google'da yaptığım şey için +1. Bu cevap olarak seçilip zirveye çıkarsa harika olur ... :)
longda

@longda Oylara göre sıralıyorsanız (varsayılan olduğunu düşündüğüm) zaten en üstte olmalı.
Cascabel

57

Kullanmayı seviyorum:

git diff HEAD^

Veya sadece belirli bir dosyayı ayırt etmek istiyorsam:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1: HEAD^üst işlemdir, önceki işlem değilpull
CharlesB

1
Eğer HEADbir birleştirme taahhüt olduğunu, HEAD^ilk ebeveyn Yani evet, daha önce taahhüt olabilir, taahhüt olduğunu pull. Diğer ebeveyni almak için (iki yönlü birleştirme için) kullanın HEAD^2. Ama sonra, yukarıdaki cevap ilk etapta soruyu gerçekten cevaplamıyor, bu yüzden -1 ;-)
Michael Wild

Açıklama için teşekkürler. Soruyu çok dikkatli okumadım, çünkü başka bir şey için Google'da çalışıyordum ve bu bağlantı sonuçlar sayfasında üst sıralara çıktı. Yeni bir kullanıcı olduğum ve herhangi bir karmaya sahip olmadığım için (SO'da buna böyle denirse) sesleneceğimi düşündüm. Benim hatam =)
cadizm

3
@MichaelWild soruyu soran kişinin sorduğu şey olmayabilir, ama bunu bulduğumda aradığım şey buydu. Benim için faydalı oldu. Upvoting.
John Dvorak

Bu, TortoiseGit'in "önceki sürümle Diff" in yaptığı şeydir. Ve aradığım şey buydu.
Fabien Haddadi

15

Düz git pullyaparsanız, o zaman ya 'hızlı iletilirsiniz' ya da uzak depodan bilinmeyen sayıda işlemi birleştirirsiniz. Yine de bu tek bir eylem olarak gerçekleşir, bu nedenle çekmeden hemen önce bulunduğunuz son kayıt, reflog'daki son giriş olacaktır ve olarak erişilebilir HEAD@{1}. Bu, şunları yapabileceğiniz anlamına gelir:

git diff HEAD@{1}

Bununla birlikte, eğer bu kendinizi çok şey yaparken bulduğunuz bir git fetchşeyse, el ile birleştirmeden veya üzerine yeniden eklemeden önce, sadece bir yapmayı ve getirilen şubeyi incelemeyi düşünmenizi şiddetle tavsiye ederim . Örneğin, usta iseniz ve kökeni / ustayı çekecekseniz:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

Burada git logyerine güzelce kullanımı ( git diffsözdizimi '..' git logve '...' arasında biraz tutarsız olsa bile git diff) +1 Bkz. Stackoverflow.com/questions/53569/… ve stackoverflow.com/questions / 850607 /…
VonC

Neyse ki git diff komutunda '..' sözdizimini kullanırsanız git "doğru olanı yapar".
CB Bailey
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.