Yalnızca belirli bir dosyada belirli bir işlemle yapılan değişiklikleri geri almak istiyorum.
Bunun için git revert komutunu kullanabilir miyim?
Bunu yapmanın başka basit bir yolu var mı?
Yalnızca belirli bir dosyada belirli bir işlemle yapılan değişiklikleri geri almak istiyorum.
Bunun için git revert komutunu kullanabilir miyim?
Bunu yapmanın başka basit bir yolu var mı?
Yanıtlar:
Bunu yapmanın en temiz yolu burada anlatılıyor
git show some_commit_sha1 -- some_file.c | git apply -R
VonC'nin yanıtına benzer ancak git show
ve kullanılıyor git apply
.
fatal: unrecognized input
-3
yama başarısız olduğunda üç yollu birleştirme için neredeyse her zaman bayrağını git uygulamasına eklemem gerekiyor, çünkü genellikle zamanında bir değişikliği biraz düzeltiyorum.
some_file.c
içerdiğinden emin olun , aksi takdirde hiçbir şeyi sessizce
Kaydetme geçmişini değiştirmenin uygun olduğunu varsayarsak, işte önceki bir kaydetmede tek bir dosyadaki değişiklikleri geri almak için bir iş akışı:
Örneğin, badfile.txt
kaydetmede 1 dosyadaki ( ) değişiklikleri geri almak istiyorsunuz aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Temel taahhütte yeniden ödeme yapın, sorun taahhüdünü değiştirin ve devam edin.
1) Etkileşimli yeniden tabanı başlatın:
git rebase -i aaa111
2) sorunu işaretleyin değiştirerek editörü düzenlemek için taahhüt pick
etmek e
(düzenlemek için):
e aaa222
pick aaa333
3) Bozuk dosyadaki değişiklikleri geri alın:
git show -- badfile.txt | git apply -R
4) Değişiklikleri ekleyin ve taahhüdü değiştirin:
git add badfile.txt
git commit --amend
5) Rebase'i tamamlayın:
git rebase --continue
edit
değişmiş olarak gösterilmediği konusunda kafam karıştı . Ama git show -- badfile.txt | git apply -R
ihtiyacım olan cevabı verdi <3
git revert
bir kaydetme içindeki tüm dosya içeriği içindir.
Tek bir dosya için komut dosyasını yazabilirsiniz :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
( Smtlaissezfaire'den git-shell-scripts yardımcı programlarından )
Not:
Mevcut değişikliğinizi henüz yapmadıysanız burada başka bir yol açıklanmaktadır .
git checkout -- filename
git checkout
bir dosya için bazı seçeneklere sahiptir, dosyayı HEAD'den değiştirerek, değişikliğinizin üzerine yazabilirsiniz.
Dropped.on.Caprica bahseder yorumlarda :
Git'e bir takma ad ekleyebilirsiniz, böylece
git revert-file <hash> <file-loc>
belirli bir dosyanın geri alınmasını sağlayabilirsiniz . Bu özü
görün .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
bu belirli dosyanın geri alınmasını sağlayabilirsiniz . Bu cevabı kaldırdım (doğru çalışması için birkaç düzenleme yapmam gerekse de). .gitconfig
Düzenlediğim betiğimin
Sadece bu --no-commit
seçeneği kullanırdım git-revert
ve sonra endeksten geri alınmasını istemediğiniz dosyaları nihayet taahhüt etmeden önce kaldırırdım. Aşağıda, en son ikinci işlemede yalnızca foo.c'ye yapılan değişikliklerin nasıl kolayca geri döndürüleceğini gösteren bir örnek verilmiştir:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
İlki git-reset
tüm dosyaları "aşamaları kaldırır", böylece daha sonra geri alınmasını istediğimiz tek dosyayı geri ekleyebiliriz. Son git-reset --hard
kalan dosyadan, saklamak istemediğimiz geri dönüşlerden kurtulur.
Çok daha basit:
git reset HEAD^ path/to/file/to/revert
sonra
git commit --amend
ve sonra
git push -f
dosya gitti ve işlem hash, mesaj vb. aynı.
git checkout -- path/to/file/to/revert
adıma ihtiyacınız var mı? Ayrıca, hash'in daha sonra aynı olduğu doğru değil, değil mi? Son cümle şu gibi bir şey olarak daha iyi olabilir: "Sonuç, son işlemin, yalnızca geri alınan dosyadaki değişiklikleri içermemesi bakımından farklılık gösteren yeni bir kayıtla değiştirilmesidir."
git reset HEAD^ path/to/file/to/revert/in/commit
Yukarıdaki komut dosyayı kesinleştirme dışında alacak, ancak içeriye yansıtacaktır git status
.
git checkout path/to/file/to/revert/in/commit
Yukarıdaki komut değişiklikleri geri alır (sonuç olarak HEAD ile aynı dosyayı alırsınız).
git commit
(Taahhüdü --amend
değiştirmek için geçin.)
git push
Bununla, önceden kaydetmede bulunan dosya kaldırılır ve geri döndürülür.
Yukarıdaki adımlar, commit yapılan şubeden takip edilmelidir.
Bu prosedürü takip edebilirsiniz:
git revert -n <*commit*>
( -n
tüm değişiklikleri geri alın, ancak bunları uygulamayın)git add <*filename*>
(geri döndürmek ve uygulamak istediğiniz dosyaların adı)git commit -m 'reverted message'
(geri almak için bir mesaj ekleyin)Bir dosyadaki değişiklikleri son kaydetmenizden sıfırlamak isterseniz, genellikle kullandığım şey budur. Bunun en basit çözüm olduğunu düşünüyorum.
Lütfen dosyanın hazırlık alanına ekleneceğini unutmayın.
git checkout <prev_commit_hash> -- <path_to_your_file>
Umarım yardımcı olur :)