Diyelim ki bir Git deposundayım. Bir dosyayı siliyorum ve bu değişikliği işliyorum. Çalışmaya devam ediyorum ve birkaç değişiklik daha yapıyorum. Sonra, o dosyayı geri yüklemem gerektiğini fark ediyorum.
Bir dosyayı git checkout HEAD^ foo.bar
kullanarak kontrol edebileceğimi biliyorum, ancak bu dosyanın ne zaman silindiğini gerçekten bilmiyorum.
Günlüklerime manuel olarak göz atmak, belirli bir SHA için tüm projeyi kontrol etmek ve ardından bu dosyayı orijinal proje kontrolüme manuel olarak kopyalamak zorunda kalmayacağımı umuyorum.
Verilen yolu etkileyen son commit'i bulun. Dosya HEAD commit'inde olmadığından, bu commit onu silmiş olmalıdır.
git rev-list -n 1 HEAD -- <file_path>
Ardından caret (^
) sembolünü kullanarak önceki commit'teki sürümü kontrol edin:
git checkout <deleting_commit>^ -- <file_path>
Veya $file
söz konusu dosya ise tek bir komutta.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
Eğer zsh kullanıyorsanız ve EXTENDED_GLOB seçeneğini etkinleştirdiyseniz, caret sembolü çalışmayacaktır. Bunun yerine ~1
kullanabilirsiniz.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
git log --diff-filter=D --summary
kullanın;git checkout $commit~1 path/to/file.ext
kullanın.Burada $commit
1. adımda bulduğunuz commit'in değeridir, örneğin e4cf499627
Eğer deliyseniz, git-bisect
kullanın. İşte yapmanız gerekenler:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
Şimdi otomatik testi çalıştırma zamanı. Kabuk komutu '[ -e foo.bar ]'
, foo.bar
varsa 0, yoksa 1 döndürür. git-bisectin "run" komutu, testin başarısız olduğu ilk commit
i otomatik olarak bulmak için ikili aramayı kullanacaktır. Verilen aralığın (iyiden kötüye) yarısından başlar ve belirtilen testin sonucuna göre onu ikiye böler.
git bisect run '[ -e foo.bar ]'
Şimdi onu silen commit'e ulaştınız. Buradan geleceğe atlayabilir ve değişikliği geri almak için git-revert
kullanabilirsiniz,
git bisect reset
git revert <the offending commit>
ya da bir komiteye geri dönüp hasarı elle inceleyebilirsiniz:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .