Bir zamanlar projemde şimdi almak istediğim bir dosya vardı.
Sorun şu: Ne zaman sildiğime ve hangi yolda olduğuna dair hiçbir fikrim yok.
Varsa bu dosyanın taahhütlerini nasıl bulabilirim?
Bir zamanlar projemde şimdi almak istediğim bir dosya vardı.
Sorun şu: Ne zaman sildiğime ve hangi yolda olduğuna dair hiçbir fikrim yok.
Varsa bu dosyanın taahhütlerini nasıl bulabilirim?
Yanıtlar:
Kullanabileceğiniz yolu tam olarak bilmiyorsanız
git log --all --full-history -- "**/thefile.*"
Dosyanın yolunu biliyorsanız, bunu yapabilirsiniz:
git log --all --full-history -- <path-to-file>
Bu, tüm dosyalarda söz konusu dosyaya dokunan taahhütlerin bir listesini göstermelidir. Ardından, istediğiniz dosyanın sürümünü bulabilir ve ...
git show <SHA> -- <path-to-file>
Veya aşağıdakilerle çalışma kopyanıza geri yükleyin:
git checkout <SHA>^ -- <path-to-file>
Tespit edilen dosyadan önce kasayı alan düzeltme işareti sembolüne ( ^) dikkat edin, çünkü işlem sırasında dosya silinir, silinen dosyanın içeriğini almak için önceki işleme bakmamız gerekir.<SHA>
git log -- <path>, dosyanın hiç var olmadığı bir dalda olduğunuzda çıktı almayacaktır. git log --all -- <path>Diğer dallarda meydana gelen değişiklikleri kaçırmadığınızdan emin olmak için her zaman kullanmalısınız . git log -- <path>Birden fazla şubeniz varsa ve yolları ve dalları (benim gibi) unutma eğilimindeyseniz komut çok tehlikeli olabilir ve diğer geliştiricilerle çalışıyorsanız da tehlikelidir.
git checkout <SHA>^ -- <path-to-file>(^ sembolüne dikkat edin) olmalıdır, çünkü <SHA> işleminin yapıldığı anda dosya silinir, silinen dosyanın içeriğini almak için önceki işleme bakmamız gerekir
Silinen dosyaların bir listesini alın ve silinen dosyanın tam yolunu kopyalayın
git log --diff-filter=D --summary | grep delete
Bu işlemin kesin kimliğini bulmak için sonraki komutu yürütün ve kesin kimliğini kopyalayın
git log --all -- FILEPATH
Silinen dosyanın farkını göster
git show COMMIT_ID -- FILE_PATH
Unutmayın, >gibi bir dosyaya çıktı yazabilirsiniz
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }git-grep-latest some_text
linux pipes.. hoşuna gidecek .
Kabul edilen yanıt düzenlenemedi, bu yüzden buraya yanıt olarak ekledi,
dosyayı git'e geri yüklemek için aşağıdakileri kullanın (SHA'dan hemen sonra '^' işaretini not edin)
git checkout <SHA>^ -- /path/to/file
<SHA>~1alıntı işaretleri ile sarmaya gerek kalmadan aynı şekilde çalışmalıdır.
Diyelim ki adlı bir dosyayı kurtarmak istiyorsunuz MyFile, ancak yolundan (veya bunun için uzantısından) emin değilsiniz :
Prelim .: git köküne atlayarak karışıklıktan kaçının
Önemsiz bir proje, benzer veya özdeş isimlere sahip birden fazla dizine sahip olabilir.
> cd <project-root>
Tam yolu bulun
git log --diff-filter = D - özet | grep sil | grep Dosyam
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js aradığınız yol ve dosyadır.
Bu dosyayı etkileyen tüm taahhütleri belirleyin
git log --oneline --follow - full / path / to / MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Dosyayı teslim alma
İlk listelenen taahhüdü (son kronolojik olarak burada bd8374c) seçerseniz, dosya bu taahhütte silindiğinden bulunmaz.
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
Sadece önceki (bir düzeltme işareti ekleyin) taahhüdünü seçin:
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"Ve git checkout "bd8374c^" -- full/path/to/MyFile.js
@Amber doğru cevabı verdi! Sadece bir ek daha, dosyanın tam yolunu bilmiyorsanız joker karakterler kullanabilirsiniz! Bu benim için çalıştı.
git log --all -- **/thefile.*
Aşağıda, bir dev veya git kullanıcısının depo kök dizininden silinmiş bir dosya adını geçirebileceği ve geçmişi alabileceği basit bir komut vardır:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Herhangi biri, komutu geliştirebilirse, lütfen yapın.
gitkAnımsanan yarım dosyayı bulmak için geçmişe göz atabilmek için görüntüleyenlerden birini kullanmayı deneyin . ( gitk --allgerekirse tüm şubeler için kullanın )
--allseçenek hem cevabınız hem de kabul edilen cevabınız için önemlidir.
Özet:
Silinen dosyaların geçmişinde dosya tam yolunda arama yaparsınız git log --diff-filter=D --summary | grep filename
Dosyanızı silinmeden önce işlemden geri yüklersiniz
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
İşte benim çözümüm:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>