Bir dosyayı Git'te rastgele bir sürüme nasıl dağıtırım?


324

Bir dosyayı, örneğin pom.xmlana daldan Git'teki keyfi eski bir sürüme nasıl dağıtabilirim?

Yanıtlar:


347

Yapabilirsin:

git diff master~20:pom.xml pom.xml

... şimdiki 20 revizyondan ilk ebeveyne kadar pom.xmlolanı karşılaştırmak için master. Sen yerini alabilir master~20nesne işlemek adına (sha1sum) ya da herhangi biriyle, tabii ki, bir revizyon belirterek diğer birçok yönden .

Bunun aslında eskisini pom.xmlçalışma ağacınızdaki sürümle karşılaştırdığına dikkat edin , taahhüt edilen sürümle değil master. Bunu istiyorsanız, bunun yerine aşağıdakileri yapabilirsiniz:

git diff master~20:pom.xml master:pom.xml

12
Bunun yalnızca dosyalar için değil, aynı zamanda (alt) dizinler için de çalıştığını unutmayın git diff <revision>:foo/ HEAD:foo/.

2
Ayrıca, bir revizyon belirleyicisi kullanıyorsanız veya git'i kullanıyorsanız, bu revizyonda mevcut olmayan dosya / dizin hakkında size bir hata vereceğini Windows'da dizinler için eğik çizgi kullanmanız gerektiğini unutmayın.
Dylan Nissley

1
@DylanNissley yoksa size hiçbir hata ve fark vermeyecektir. Ben de öyle görüyorum. Her durumda, ters eğik çizgi yerine eğik çizgi kullanma ipucu için teşekkür ederiz.
Gary

Windows dosyaları ile dizin değiştirmek ve daha sonra git diff master ~ 20: ./ pom.xml ./pom.xml
lloyd 6

Git'in bazı sürümleri <revision> & <path>
Josh arasında

140
git diff <revision> <path>

Örneğin:

git diff b0d14a4 foobar.txt

dosya geçerli dizinde değilse, sürüm 1.7.11 için çalışmaz. Örnek: 'git diff f76d078 test / Config' verim "hatası: 'test / f76d078' 'erişilemedi"
simpleuser

1
@ user1663987 sadece proje köküne bir tam yol göreli geçmektedir: git diff <revision> root/path/file.

1
Test / yapılandırma olduğunu (testinde olduğu gibi kökü bir dizindir) köküne göre. ama sonra örnek kök / yol / dosya kök DAHİL gibi görünüyor?
Temmuz

41

Tek bir dosyanın son işleme arasındaki farkı görmek istiyorsanız şunları yapabilirsiniz:

git log -p -1 filename

Bu git size dosya diff verecektir, yerel dosya karşılaştırmıyor.


2
Bu bir şey
döndürmüyor

@AndreiCristianProdan O zaman orada değişiklik yok. -1Değişiklikleri alana kadar adım adım artırabilirsiniz .
kaiser

Bu çok güzel. Yararlı olabilecek bir bash işlevi oluşturdum: gitlog () { git log -${3:-p} -${2:-1} $1; } Like: gitlog Rakefileor gitlog Rakefile 5and gitlog Rakefile 10 s. Birincisi bir farkı gösterir; ikincisi beş fark gösterir; üçüncüsü on gösterir --no-patch.
auxbuss

18

Son işlemde bir dosyada nelerin değiştiğini görmek için:

git diff HEAD~1 path/to/file.

(~ 1) sayısını, fark etmek istediğiniz n'inci komut olarak değiştirebilirsiniz.


Bu cevap gerçekten sadece belirli bir durumdur bu daha genel bir cevap , HEAD~1yerine ikame edilmektedir <revision>bu cevabı yinelenen yapar.

1
bu çalışmıyor! fatal: belirsiz argüman 'HEAD ~ 1': bilinmeyen düzeltme veya çalışma ağacında olmayan yol. Yolları revizyonlardan ayırmak için '-' kullanın
Andrei Cristian Prodan

Bu cevap benim için basit ve işlevsel.
Douglas Frari

6

Genel Sözdizimi:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

deponuzun herhangi bir yerinde "DosyaAdı.xml" adlı tüm dosyalar için.

"-" ve "**" arasındaki boşluğa dikkat edin

Sorunuzun cevabı:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

git ile her zaman olduğu gibi, bir taahhütte bulunmak için / sha1 / "HEAD ^" etiketini kullanabilirsiniz.

Ubuntu üzerinde git 1.9.1 ile test edildi.


6

HEAD'inizden hiçbiri taahhütte bulunmuyorsa , özellikle de dosya adlarınız uzunsa, bash'ın küme ayracı genişletmesi gerçekten yararlı olur: yukarıdaki örnek:

git diff master~20:pom.xml master:pom.xml

Olacaktı

git diff {master~20,master}:pom.xml

Bash ile Brace genişlemesi hakkında daha fazla bilgi .


6

Şu anki ile 5 taahhüdünü karşılaştırmak için, her ikisini de yapın master:

git diff master~5:pom.xml master:pom.xml

Ayrıca, karma karma numarasına başvurabilirsiniz, örneğin karma numarası ise x110bd64, farkı görmek için böyle bir şey yapabilirsiniz:

git diff x110bd64 pom.xml



2

Bir grafik aracı kullanarak sorun yaşıyorsanız (veya hatta tercih ediyorsanız):

gitk pom.xml

Gitk'te, istediğiniz sıraya bağlı olarak, açılır menüden herhangi bir işlemi tıklatabilir ("seçmek" için) ve diğer herhangi bir işlemi sağ tıklatabilirsiniz.



0

Örneğin, bir stash içindeki tek bir dosyaya fark etmeniz gerekiyorsa,

git diff stash@{0} -- path/to/file

-1

Belirli bir taahhüddeki diff'i arıyorsanız ve komut satırı yerine github kullanıcı arayüzünü kullanmak istiyorsanız (bunu diğer insanlara bağlamak istediğinizi varsayalım), şunları yapabilirsiniz:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Örneğin:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

İşlemin tamamındaki tüm dosyalar arasında gezinmenizi sağlayan sağ üstteki Önceki ve Sonraki bağlantılarına dikkat edin.

Bu, yalnızca herhangi bir keyfi sürüm arasında karşılaştırma yapmak için değil, yalnızca belirli bir taahhüt için çalışır.

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.