Soru Git'i kullanarak belirli bir dosyayı belirli bir revizyona sıfırlayın veya geri alın.


Bir dosya grubunun bir parçası olarak birkaç kez işlenen bir dosya üzerinde bazı değişiklikler yaptım, ancak şimdi değişiklikleri önceki bir sürüme geri yüklemek / geri almak istiyorum.

Ben yaptım git log ile birlikte git diff İhtiyacım olan revizyonu bulmak için, ancak dosyayı geçmişte eski haline nasıl getireceğine dair hiçbir fikriniz yok.


3452
2017-10-18 23:34


Menşei


Geri döndükten sonra unutma --cached kontrol ederken git diff. bağlantı - Geoffrey Hale
Benimkini araştırdığımda soruyu buldum. Ama çözümü okuduktan sonra, günlüğümü kontrol ettim ve öğrendim ki, tek başına bir taahhüt olarak köklü değişiklikleri yaptım, bu yüzden gitmeyi bu işe geri döndürdüm ve her şey istediğim gibi kaldı. Çözüm değil, bazen bunu yapmak için başka bir yol. - sudo97


Cevaplar:


İstediğiniz taahhüdün karma olduğunu varsayarsak c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

git ödeme man sayfa daha fazla bilgi verir.

Önceliğe geri dönmek isterseniz c5f567, ekle ~1 (herhangi bir sayı ile çalışır):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Bir yan not olarak, bu komuttan her zaman rahatsız oldum çünkü hem sıradan şeyler (dallar arasında değişim) hem de olağandışı, yıkıcı şeyler (çalışma dizinindeki değişiklikleri iptal etmek) için kullanılır.


4672
2017-10-18 23:39



Eğer "abbcdf" 'ye bulaşırsanız ve sürümü istiyorsanız hemen önce "abbcdf", yapabilirsin git checkout "abbcdf~1" path/to/file. - shadowhand
@shadowhand: Bunu tersine çevirmenin bir yolu var mı? - aliteralmind
@aliteralmind: Hayır, ne yazık ki Git geçmişi kısayol notasyonu sadece geçmişte geriye gider. - Greg Hewgill
Şunun için bir şube adı kullanacaksanız abcde (Örneğin. develop) isteyeceksiniz git checkout develop -- file/to/restore (çift çizgi dikkat) - Ohad Schneider
@aliteralmind: Aslında, evet, bunu yapmanın bir yolu var: "git log --reverse -1 --ancestry-path yourgitrev..master" ve daha sonra git rev'i almak için uygun seçenekleri kullanın. --ancestry-path iki bitiş arasında "bir çizgi çizecektir" ve -1 size sadece bir versiyon gösterecektir ve - en yayılan ilk girdinin en eski olanı sağlayacaktır. - Chris Cogdon


Bir dosyaya yapılan değişiklikleri diff komutunu kullanarak hızlıca gözden geçirebilirsiniz:

git diff <commit hash> <filename>

Daha sonra bu işleme belirli bir dosyayı geri almak için reset komutunu kullanın:

git reset <commit hash> <filename>

Kullanmanız gerekebilir --hard yerel değişiklikleriniz varsa seçeneği.

Yol işaretlerini yönetmek için iyi bir iş akışı, zaman çizelgenizdeki noktaları temiz bir şekilde işaretlemek için etiketleri kullanmaktır. Son cümlenizi tam olarak anlayamıyorum ama isteyebileceğiniz şey bir dalı bir önceki zaman noktasından ayırmaktır. Bunu yapmak için kullanışlı ödeme komutunu kullanın:

git checkout <commit hash>
git checkout -b <new branch name>

Bu değişiklikleri birleştirmeye hazır olduğunuzda ana hattınıza karşı yeniden oluşturabilirsiniz.

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

508
2017-12-17 06:59



'git checkout <commit hash>' komutu, projemdeki eski sürümümü bana geri döndü. - vidur punj
'git reset <commit hash> <dosyaadı>' değiştirmek istediğim belirli dosyamı değiştirmedi. Dosyanın sürümünü, özellikle de tüm projeyi kontrol etmenin bir yolu var mı? - Danny
Dosyayı geri almak için git checkout <commit hash> <filename> benim için daha iyi çalıştı git reset - Motti Strom
kullanılamaz git reset tek dosyayı sıfırlamak için bir hata alacaksınız fatal: Cannot do hard reset with paths - slier
Ne kızar dedi ki: git reset --hard <commit hash> <filename>. Bu hata ile fatal: Cannot do hard reset with paths. Motti Strom ne dedi? git checkout <commit hash> <filename> - Hawkeye Parker


SHA-1 de dahil olmak üzere bir git taahhüdüne herhangi bir referansı kullanabilirsiniz. Asıl nokta, komutun şuna benzediği:

git checkout [commit-ref] -- [filename]


306
2018-04-07 21:48



Bu cevap arasındaki fark nedir? --ve kabul edilmeyen biri? - 2rs2ts
Git'te, dosya listesinden önce bir '-', sonraki tüm argümanların branş isimleri veya başka bir şey olarak değil dosya adları olarak yorumlanması gerektiğini söyler. Bazen yardımcı bir hayalperest. - foxxtrot
'-' sadece bir git sözleşmesi değil, * nix komut satırında çeşitli yerlerde bulunan bir şeydir. rm -- -f (adlı bir dosyayı kaldırın -f) kanonik örnek gibi görünüyor. Daha fazla detay burada - Hawkeye Parker
Sadece @HawkeyeParker'ın dediği şeyi ekleyin rm komut argümanlarını ayrıştırmak için getopt (3) kullanır. getopt komut argümanlarını ayrıştırma komutu. gnu.org/software/libc/manual/html_node/Getopt.html - Devy
@Honey Evet, demek istediğim, ve evet, muhtemelen hiç de yaygın değil. Bu örneği çeşitli yerlerde gördüm, belki de sadece unutulmaz kılmak için: rm -f, korkutucu / tehlikeli olduğu biliniyor. Ancak, nokta, bir dosya adı * nix kutu Bir '-' ile başlayalım ve bu, bir '-' gördüklerinde, bir komut seçeneği izlemeyi bekleyen çeşitli komut satırı tercümanlarını karıştırır. '-' ile başlayan herhangi bir dosya olabilir; ör. "-mySpecialFile". - Hawkeye Parker


git checkout -- foo

Bu sıfırlanacak foo kafaya. Ayrıca şunları da yapabilirsiniz:

git checkout HEAD^ foo

bir revizyon geri, vb için


244
2017-08-29 20:56



Sözdizimi kullanmanızı öneririm git checkout -- foo hatalardan kaçınmak için foo özel bir şey (bir dizin veya bir dosya gibi) -f). Git ile, emin değilseniz, her zaman özel dosyalar ile tüm dosyaları ve dizinleri öneki --. - Mikko Rantalainen
Mikko'nun yorumu için ek bir not: -- git komutu ve git özel değil. Komut seçeneklerinin sonuna işaret etmek için yerleşik bir bash. Başka birçok bash komutuyla da kullanabilirsiniz. - matthaeus
@matthaeus, aynı zamanda ne bash'a ne de bir kabuk özelliğine de özgü değildir. Birçok farklı komutta uygulanan ve (getopt tarafından desteklenen) bir sözleşmedir. - Greg Hewgill


Ve en çok ihtiyaç duyulan son kararlı sürümüne geri dönmek için bu daha basit komutu kullanabilirsiniz.

git checkout HEAD file/to/restore

106
2018-01-14 06:15



Bu (git checkout HEAD dosya / geri / geri yükleme) ve git reset --hard dosya / to / restore arasındaki fark nedir ??? - Motti Shneor
1) daha genel yolu hatırlamak daha kolay 2) dosya adı girmeden önce Enter tuşuna basmaya gerek yok - Roman Susi


Şimdi aynı sorunu yaşadım ve buldum bu cevap Anlaması en kolay (commit-ref geri dönmek istediğiniz günlüğündeki değişimin SHA değeridir):

git checkout [commit-ref] [filename]

Bu eski sürümü çalışma dizininize koyacaktır ve eğer isterseniz, bunu yapabilirsiniz.


100
2018-05-27 17:52





Kaç işlem yapmanın gerektiğini bilmeniz gerekiyorsa, şunları kullanabilirsiniz:

git checkout master~5 image.png

Bu, üzerinde olduğunuzu varsayar master şube ve istediğiniz sürüm 5 geri çekiliyor.


85
2018-04-07 14:03