Git'teki eski işlemden dosyayı geri yükle


Yanıtlar:


222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Bu HEAD'ı değiştirmeyecek, sadece yerel dosyanın üzerine yazacak path/to/file.txt

Bkz adam git-rev-ayrıştırma (ders basit bir karma (gibi orada olası revizyon özellikleri için dd9bacbgüzel yapacak))

Değişikliği taahhüt etmeyi unutmayın (bir incelemeden sonra ...)


15
Vay be, @heneryville ve sehe, aslında '7 gün önce' meta olduğunu düşündüm. ty!
AnneTheAgile

7
Bölüm 2 Belirli bir taahhüdü seçmek istediğinizde, yukarıdaki biçim çalışmaz. Bunun yerine, aşağıda gösterilen URL'leri kullanın, git checkout commitShaNumber - stackoverflow.com/questions/215718/…
16'da AnneTheAgile

2
@AnneTheAgile aslında hala aynı sözdizimi, ben sadece "karmaşık" bir örnek vermek oldu revision-specificationberi OP sordu :)
sehe

1
Taahhüdünüz kurtarmaya çalıştığınız dosyayı silmek için kullanıldıysa , taahhüdü hemen almak için shacommit~1(ex:) öğesini kullanmanız git checkout 0f4bbdcd~1 -- path/to/file.txtyeterlidir.
sdlins

90
  1. Dosyayı eski taahhüdünüzden kontrol edin git checkout [Revision_Key] -- path/to/file.
  2. Uygun şekilde ekleyin, uygulayın, itin.

3
git checkouttek dosyaları işleyebilir (sehe ile cevap bakınız), kopyalayıp yapıştırmanıza gerek yok.
Koraktor

1
Düzeltme anahtarları her zaman taahhüt için SHA1 midir?
IslandCow

1
Bunlar, ancak genellikle SHA1'in ilk 6 ila 8 karakteri, revizyonu tanımlamak için yeterlidir.
Urs Reupke

2
Hayır @IslandCow, onlar sha1 değil, aynı zamanda şube, etiket veya bir işaret taahhüt herhangi bir başka şey, mesela olabilir HEAD, ORIG_HEADya da kombine olanların herhangi ^/ ~/ @tarzı gösterimde.
Alois Mahdal

2
Dosyanın daha sonra dosyayı "eklemesi" gerektiğini belirtirsiniz. Ama bu yanlış. Dosya hazırlama alanına yerleştirilmedi. Zaten eklendi.
xApple

9

Git'e bağlı yeni bir dosyayı geri yüklemem gerekiyordu. Yani sadece tekrarlamak ve başka bir bakış açısı vermek için, bunu aşağıdaki iki adımı uygulayarak yapmanız gerekir:

  1. git log -3
    Bu, en son üç taahhüdü gösterir. Tam olarak istediğiniz sürümü daraltmak için yorumları ve yazarın adını okuyun. İstediğiniz kesinleştirme sürümü için bu uzun taahhütlü kimliği (yani b6b94f2c19c456336d60b9409fb1e373036d3d71) yazın.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java Yükleme
    kimliğini VE geri yüklemek istediğiniz dosya adını iletin . Çift kısa çizgiden önce ve sonra bir boşluk bıraktığınızdan emin olun.

Bunu yapmanın birçok yolu var. Ama bu hatırlayabildiğim kadar basit. Umarım yardımcı olur.

NOT: Proje yolunuzun / klasörünüzün içindeyseniz, ödeme komutunda tam dosya yolunu yazmak gerekli değildir.


Şu ana kadarki en iyi yorum. Kabul edilen yanıt olan yanıt, getirilmesi gereken dosyanın yukarı doğru itildiğini varsayar, ancak bu komut yalnızca yerel olarak bulunan dosyayı alır / geri yükler.
ot0

1
Sadece yerel git repo kök klasöründe denedim. Yine de dosyaya göreli yolu sağlamam gerekiyordu. Sadece - [dosyaadı] 'yı tek başına sağlamak işe yaramadı.
user2784627

@ ot0 Hayır, bunu varsaymıyor. Tam olarak aynı cevaplar.
matt

4

Tüm cevaplar belirtilir git checkout <tree-ish> -- <pathspec>. Git v2.23.0 itibarıyla , sorumlu olanın bir kısmını kabul etmesi gereken yeni bir git geri yükleme yöntemi vardır git checkout. Github blogundaki değişikliklerin önemli noktalarını görün .

Bu komutun varsayılan davranışı, sourceparametreden gelen içerikle çalışan bir ağacın durumunu geri yüklemektir (bu durumda bir sağlama karması olacaktır).

Tamamlama karma değerini varsayarsak, abcdefkomut şöyle görünecektir:

git restore --source=abcdef file_name

(varsayılan olarak) onu çalışma ağacına koyar. Değişikliği doğrudan işleme koymak için doğrudan dizine koymak istiyorsanız:

git restore --source=abcdef --worktree --staged file_name

veya kısa seçenek adlarıyla:

git restore -s=abcdef -W -S file_name
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.