Kullanmayı taahhüt eden commit
ve sonra geri döndürülen bir değişiklik göz önüne alındığında , revert
bu geri dönüşü geri almanın en iyi yolu nedir?
İdeal olarak, bu, tarihi yeniden yazmamak için yeni bir taahhütle yapılmalıdır.
Kullanmayı taahhüt eden commit
ve sonra geri döndürülen bir değişiklik göz önüne alındığında , revert
bu geri dönüşü geri almanın en iyi yolu nedir?
İdeal olarak, bu, tarihi yeniden yazmamak için yeni bir taahhütle yapılmalıdır.
Yanıtlar:
Bu değişikliği henüz yapmadıysanız, git reset --hard HEAD^
Aksi takdirde, geri döndürmenin mükemmel bir şekilde yapılması iyi olur.
Başka bir yol git checkout HEAD^^ -- .
ve sonra git add -A && git commit
.
git cherry-pick
ya da alternatif git revert
olarak bir geri dönüşü geri almanın en basit yolu olduğu görülmektedir.
Otherwise, reverting the revert is perfectly fine.
ve sonra ne git checkout HEAD^^ -- .
yaptığını açıklamanın yararlı olacağını düşünüyorum .
git add -A
... her dosyayı sürüm kontrolüne eklemek istemiyorsanız, büyük olasılıkla istediğiniz şey değildir.
git cherry-pick <original commit sha>
Esas taahhüdün bir kopyasını oluşturur, esasen taahhüdü yeniden uygular
Geri dönüşü geri almak aynı şeyi daha karışık bir mesajla yapar:
git revert <commit sha of the revert>
Bu yollardan her ikisi de git push
tarihin üzerine yazmadan size izin verecektir , çünkü geri döndükten sonra yeni bir taahhüt yaratır.
Taahhüt sha yazarken, genellikle yalnızca ilk 5 veya 6 karaktere ihtiyacınız vardır:
git cherry-pick 6bfabc
Bir geri dönüş taahhüdü git'deki diğer tüm taahhütler gibidir. Anlamı, şu şekilde geri alabilirsiniz:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
Bu sadece değişiklikler itildikten sonra ve özellikle hedef şubeye zorlanamadığınızda mantıklıdır (bu, ana dalınız için iyi bir fikirdir ). Değişiklik aktarılmadıysa, sadece kiraz toplama yapın, geri alın veya diğer gönderilere göre geri alma taahhüdünü kaldırın.
Ekibimizde, esas olarak geçmişi temiz tutmak için ana dalda taahhüt edilen Revert taahhütlerine geri dönme kuralımız var , böylece hangi taahhüdün neyi geri döndürdüğünü görebilirsiniz:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
Bu şekilde, tarihi izleyebilir ve tüm hikayeyi anlayabilirsiniz ve miras bilgisi olmayanlar bile kendileri için çalışabilirler. Eğer varsa, Oysa kiraz almak veya Rebase şeyler, bu değerli bilgileri kaybolur (eğer yorumunda dahil sürece).
Açıkçası, bir taahhüt birden fazla kez geri döndürülür ve geri döndürülürse, bu oldukça dağınık hale gelir.
Geri döndürmek hile yapacak
Örneğin,
Eğer abcdef
senin işlemek ve ghijkl
size kesinleştirme döndürüldü olduğunda aklınıza işlemek abcdef
, sonra çalıştırın:
git revert ghijkl
Bu geri döner
Benim için aptalca görünüyor. Ama aynı durumdaydım ve geri çevrilmiş taahhütlere geri döndüm. Numara geri dönüşleri yaptım, bu yüzden her 'geri dönüş taahhüdü' için geri dönüş yapmak zorunda kaldım.
Şimdi benim tarihim biraz garip görünüyor.
Bir evcil hayvan projesi bu yüzden sorun yok. Ancak gerçek hayat projesi için, geri döndürülmeden önce geri alınan tüm kodları tek bir taahhütte ve daha makul bir yorumda geri yüklemeden önce son işleme gitmeyi tercih ederim.
Şöyle yaptım:
Şube my_branchname
geri döndürülen bir birleştirmeye dahil edildiyse . Ve geri dönmek istedim my_branchname
:
Önce bir do git checkout -b my_new_branchname
dan my_branchname
.
Sonra ilk taahhütten hemen önce taahhüdün taahhüt karmasını bir git reset --soft $COMMIT_HASH
yer yapıyorum (bkz. )
Sonra yeni bir taahhütte bulunuyorum
Sonra yeni şubeyi itiyorum
Sonra yeni şube için bir talepte bulundum.$COMMIT_HASH
my_branchname
git log
git commit -m "Add back reverted changes"
git push origin new_branchname
"Geri döndürme" fikrinden hoşlanmıyorsanız (özellikle bu, birçok işlem için geçmiş bilgilerinin kaybedilmesi anlamına gelirse), her zaman "Hatalı birleştirmeyi geri alma" hakkındaki git belgelerine gidebilirsiniz .
Aşağıdaki başlangıç durumu göz önüne alındığında
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W, M birleşimine ilk dönüşünüzdür; D ve E, başlangıçta kırık özellik dalınıza / taahhüdünüze yönelik düzeltmelerdir)
Artık A'dan E'ye kadar olan komisyonları tekrar oynayabilirsiniz, böylece hiçbiri geri döndürülen birleştirmeye "ait değildir":
$ git checkout E
$ git rebase --no-ff P
Şubenizin yeni kopyası artık master
tekrar birleştirilebilir :
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
Bir taahhüdün ardından geri döndürülen ve gönderilmeyen değişikliklerin geri alınması için:
git reset HEAD@{1}
Tüm işaretlenmemiş silmeleri kurtarmak için:
git ls-files -d | xargs git checkout --