Git deposu geçmişinden tüm bir dizini nasıl geri yükleyebilirim?


91

Git depomun geçmişinden bütün bir dizini (özyinelemeli olarak) geri yüklemek istiyorum.

Sadece 1 şube (ana) var.

Hataların dahil edildiği kaydı biliyorum.

Hatalar dahil edilmeden önceki dizinin durumunu geri yüklemek için üst işlemenin sha1 karmasını kullanabilir miyim?

Bunun gibi bir şey düşündüm:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

Ama çalışmadı.


7
revizyonlar ve yollar arasına '-' eklemeyi deneyin:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós

bu yardımcı oldu. çok teşekkür ederim.
mostwanted

1
@ CarlosCampderrós Bunu gerçek bir cevap olarak yazın ve başkası cevaplamadan önce 15 puanınızı toplayın;)
ralphtheninja

@MagnusSkog Bunun işe yarayacağından emin değildim, bu yüzden sadece kontrol etmek için bir yorum yaptım. Artık işe yaradığından emin olduğuma göre, cevap olarak yazdım :)
Carlos Campderrós

2
Genel bir ipucu olarak, "işe yaramadı" pek kullanışlı değil. İdeal olarak hata çıktısıyla (çok uzunsa kesilmiş) neden işe yaramadığını bize anlatın .
me_ve

Yanıtlar:


156

revizyonlar ve yollar arasına '-' eklemeyi deneyin:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

Ve önceki işlemeden bir dizini kurtarmak istiyorsanız, kaydetme karmasını HEAD ~ 1 ile değiştirebilirsiniz, örneğin:

git checkout HEAD~1 -- path/to/the/folder/ 

aynı komut, neredeyse farklı amaç: stackoverflow.com/questions/953481/…
cregox

18
Yine de bir sorun var: OP, dizinin hala var olup olmadığını belirtmiyor. Varolan bir dizini kesinleştirme durumuna geri yüklemek için, önce dizinin içeriği silinmelidir. Diğer durumda, eski işlemede bulunmayan mevcut dosyalar kaldırılmaz.
Alberto

7
+1 @Alberto kesinlikle katılıyor. Ben yaptım rm -Rf path/to/the/foldersonra git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/o yolun tam işlemek, bundan sonra oluşturulmuş olan farklılık ve fazladan dosyalar taahhüt aynı dosyaları vardı: Sonucu -. İstediğim şey bu.
therobyouknow

2
ne gelmez --mi?
Ray Foss

2
@RayFoss, git'e aşağıdaki parametrelerin dosya olduğunu söyler (aksi takdirde bunlar bir commit hash, branch veya başka bir şeyle karıştırılabilir). Genellikle ihtiyaç duyulmaz ama onları koymaktan zarar gelmez
Carlos Campderrós

3

Bunu yapmanın iki kolay yolu vardır:

Hataları içeren kaydetme yalnızca hataları içeriyorsa git revert, etkilerini ters çevirmek için kullanın .

Değilse, kolay yol şudur:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

Eğer basitçe yaparsanız, git checkout <SHA-ID>o zaman sizi geçici olarak o kesinliğe götürür.

Her kaydetme nesnesi o andaki diskin tüm yapısını tutar, bu nedenle orada dosyalarınız varsa ve bunları kopyalamanız gerekiyorsa, bunu yapabilirsiniz. Yine de uyarı, herhangi bir dalda olmayacaksınız, bu nedenle dosyayı çalışma ağacınıza kopyalayıp teslim etmeden önce ana bilgisayara geri dönmeniz gerekecek.


"ustaya geri dön" derken ödeme ustası mı demek istiyorsun?
Pacerier
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.