Silinmiş bir Dosyayı Git'te Görüntüleme


105

Git ile bir dosyayı sildim ve ardından taahhüt ettim, bu nedenle dosya artık çalışma kopyamda değil. O dosyanın içeriğine bakmak ama aslında onu geri yüklemek istemiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


145
git show HEAD^:path/to/file

Açık bir kesinleştirme tanımlayıcısı kullanabilir veya HEAD~ndaha eski sürümleri görmek için ya da siz onu sildikten sonra birden fazla kaydetme olmuşsa kullanabilirsiniz.


6
Bunun path/to/fileprojenin üst kısmından tam yol olduğuna dikkat edin (deponun üst dizini).
Jakub Narębski

1
Elimde fatal: Invalid object name 'HEAD^'.(sadece "İlk taahhüdümün" olduğunu belirtmek zorundayım)
vladkras

1
Silme aşamalıysa ancak tamamlanmadıysa, HEAD ^ yerine HEAD kullanın (HEAD'de var olduğundan). Örneğin, dosyaya ihtiyacım olduğunu düşündüm, bu yüzden ekledim ve çalışmamı kaydetmeyi taahhüt ettim, sonra farklı bir çözüm bulduğumda sildim. Tekrar kaydetmeden önce orijinal dosyayı görmek için git show HEAD: yol / dosya
Tony Wickham

1
Ayrıca, bunun yalnızca dosya en son işlemde silinmişse işe yarayacağını belirtmekte fayda var. Dosya birkaç işlem önce silinmişse, diğer cevaplardan birini kullanmanız gerekir.
jayhendren

50

Bu, bir süre önce sildiğiniz bir dosyaysa ve bir revizyon aramak istemiyorsanız , şunu kullanabilirsiniz (dosya foobu örnekte adlandırılmıştır ; tam yolu kullanabilirsiniz):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

rev-listHer şeyden revizyonlar için çağırma görünüyor fooama sadece listelerinden biri. rev-listTers kronolojik sıradaki listelerden bu yana , listelediği şey, değişen son revizyondur foo, bu da silinen kayıt olacaktır foo. (Bu, git'in silinmiş bir dosyanın değiştirilmesine ve yine de silinmesine izin vermediği varsayımına dayanır .) Artık orada olmadığı için olduğu gibirev-list dönen düzeltmeyi kullanamazsınız . Dosyanın son revizyon dolayısıyla içeren kendinden öncekini biri için sormak zorunda in .foo^git show


2
Son foo'yu ./foo olarak değiştirmeniz gerekebilir. Ve bash kullanmayanlar için, "git rev-list --max-count = 1 --all - foo" ile kimliği alın ve sonra "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" kimliğiyle (524 .. id)
Dror

1
Güzel cevap. ^ Yerine ~ kullanmak zorunda kaldım. Emin değilim neden. Ve insanların bunu açıkça anlaması için, buradaki 'foo' git kökünden tam bir yol olmalı.
pedorro

**/fooYolu bilmiyorsanız yazabilirsiniz (bu, rev-list komutu için çalışacak, ancak show komutu için çalışmayacaktır. Ancak rev-list komutundaki commit ile yolu bulabilirsiniz).
Nickolai

10

Tam yolu hatırlamayabileceğiniz için, sha1'i git log'dan alabilir ve ardından basitçe yayınlayabilirsiniz.

 git cat-file -p <sha1>

5
Samuel Slund adına : Yukarıda kullanılacak sha1 toplamını bulmanın bir yolu şudur: git whatchanged --no-abbrevgit (veya svn) günlüğüne benzer bir çıktı verir.
artless noise
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.