Tarihin derinliklerinde bir taahhüt mesajını değiştirmek istiyorum ve birçok yeni taahhütte bulundum.
Teslim mesajını nasıl değiştirebilirim? Mümkün mü?
Tarihin derinliklerinde bir taahhüt mesajını değiştirmek istiyorum ve birçok yeni taahhütte bulundum.
Teslim mesajını nasıl değiştirebilirim? Mümkün mü?
Yanıtlar:
Linus Torvalds'ın mesajı sorunuza cevap verebilir:
Eski tamamlama mesajlarını değiştirme / düzenleme
Kısa cevap: Yapamazsınız (itilirse).
özü (Linus, BitKeeper'ı BK olarak ifade eder):
Yan not, sadece tarihsel ilgi dışında: BK'de bunu yapabilirsiniz.
Ve eğer alışkınsanız (benim gibi) gerçekten pratikti. Andrew'dan bir yama bombası uygulardım, bir şeylerin yanlış olduğunu fark ettim ve itmeden önce onu düzenledim.
Git için de aynısını yapabilirdim. Sadece taahhüt mesajının adın bir parçası olmamasını sağlamak ve tarihin el değmemiş olduğunu garanti etmek ve "yorumları daha sonra düzelt" işlemine izin vermek yeterince kolay olurdu.
Ama etmedim.
Bunun bir kısmı tamamen "iç tutarlılık" tır. Git, SHA1 korumalı her şey ve nesne türünden bağımsız olarak tüm nesnelerin aynı şekilde işlenmesi sayesinde daha temiz bir sistemdir. Evet, dört farklı nesne türü vardır ve hepsi gerçekten farklıdır ve aynı şekilde kullanılamazlar, ancak aynı zamanda kodlamaları diskte farklı olsa bile, kavramsal olarak hepsi tam olarak çalışır aynısı.
Ancak iç tutarlılık, esnek olmamanın bir mazereti değildir ve hataları meydana geldikten sonra düzeltebilmemiz açıkça çok esnek olacaktır. Yani bu gerçekten güçlü bir argüman değil.
Gerçek yolu, mesajları güvenebileceği: Neden git çok basit olarak sona mesajı uçlarını işlemek değiştirmeye izin vermez. Daha sonra kişilerin bunları değiştirmesine izin verdiyseniz, mesajlar doğal olarak çok güvenilir değildir.
Tam olması için, olabilir gibi, ne istediğini yansıtmak için yerel taahhüt tarihi yeniden Sýkora önerdiği (bazı rebase ile ve, gasp --hard reset!)
Bununla birlikte, gözden geçirilmiş geçmişinizi tekrar yayınladığınızda (a ile git push origin +master:master
, +
"hızlı ileri alma" taahhüdü ile sonuçlanmasa bile, itme işleminin gerçekleşmesini zorunlu kılan işaret) bazı sorunlar yaşayabilirsiniz .
Bu diğer SO sorusundan alıntı:
Aslında bir kez --force ile git.git deposuna ittim ve Linus BIG TIME tarafından azarlandım. Diğer insanlar için çok fazla sorun yaratacaktır. Basit bir cevap "yapma".
Şu anda git yerine hile yapabilir.
Ayrıntılı olarak: Geçici bir çalışma dalı oluşturun
git checkout -b temp
Değiştirme taahhüdüne sıfırla
git reset --hard <sha1>
Taahhüdü doğru mesajla değiştirin
git commit --amend -m "<right message>"
Eski taahhüdü yenisiyle değiştirin
git replace <old commit sha1> <new commit sha1>
bulunduğunuz şubeye geri dönün
git checkout <branch>
geçici dalı kaldır
git branch -D temp
it
guess
yapılır.
Sen kullanabilirsiniz git rebase -i
interaktif için 'i' (aralarından kollara şube karşı).
Değiştirmek pick
istediğiniz tamamlama açıklamasının yanını değiştirin r
(veya reword
), kaydedin ve çıkın ve bunu yaptıktan sonra düzenleme yapabilirsiniz.
git push
bir kez daha ve işiniz bitti!
-p
argümanını deneyin . rebase
p
Diyelim ki böyle bir ağacınız var:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
İlk olarak, checkout
geçici bir dal:
git checkout -b temp
On temp
dalı, reset --hard
bir sen (olduğunu taahhüt örneğin mesajını değiştirmek istediğinizi işlemeye 946992
):
git reset --hard 946992
amend
Mesajı değiştirmek için kullanın :
git commit --amend -m "<new_message>"
Bundan sonra ağaç şöyle görünecek:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
Sonra, cherry-pick
bütün bu ilerisinde olduğunu taahhüt 946992
gelen master
etmek temp
ve, kullanım bunları işlemek amend
sen de onların mesajlarını değiştirmek isterseniz:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
Ağaç şimdi şöyle görünüyor:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
Şimdi geçici dalı uzaktan kumandaya zorla:
git push --force origin temp:master
Son adım, şubeyi sunucudan çekmek için şubedeki master
yerel şubeyi silin , sonra şubeye geçin ve şubeyi silin .git fetch origin
master
master
temp
Artık hem yerel hem de uzaktan kumandanız tüm mesajları güncelleyecek.
Dükkanımızda, yanlış mesajlarla taahhütlere tanınabilir olarak adlandırılan ek açıklama etiketleri ekleme ve ek açıklamayı değiştirme olarak kullanma kuralını tanıttım.
Bu, sıradan "git log" komutlarını çalıştıran kişilere yardımcı olmasa da, yorumlarda yanlış hata izleyici referanslarını düzeltmek için bir yol sağlar ve tüm oluşturma ve bırakma araçlarım kuralı anlar.
Bu açık bir şekilde genel bir cevap değildir, ancak bu kişilerin belirli topluluklar tarafından benimseyebileceği bir şey olabilir. Eminim bu daha büyük bir ölçekte kullanılıyorsa, bunun için bir çeşit porselen desteği ortaya çıkabilir, sonunda ...
(Http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 adresinden )
Nasıl değiştirilir tarihte daha derinden taahhüt eder
Git'teki tarih değişmez olduğundan, en son taahhüt (şube başkanı olmayan taahhüt) dışında herhangi bir şeyi düzeltmek, tarihin değiştirilen taahhüt ve ilerlemeden yeniden yazılmasını gerektirir.
Bunun için StGIT'i kullanabilir, gerekirse şubeyi başlatabilir, değiştirmek istediğiniz taahhüdü kaldırabilir, gerekirse pop yapabilir, bir değişiklik yapabilir ve düzeltme ekini yenileyebilirsiniz (kesinleştirme mesajını düzeltmek istiyorsanız -e seçeneği ile), ardından her şey ve stg taahhüt.
Ya da bunu yapmak için rebase kullanabilirsiniz. Yeni geçici dal oluşturun, git reset --hard'ı kullanarak değiştirmek istediğiniz komuta geri sarın, bu komutu değiştirin (geçerli başlığın üstünde olacaktır), sonra git rebase --onto kullanarak şubeyi değiştirilen tamamlamanın üstüne yeniden dayandırın.
Ya da yama yeniden sıralama, daraltma, ... gibi çeşitli değişikliklere izin veren git rebase - interactive kullanabilirsiniz.
Bunun sorunuzu cevaplaması gerektiğini düşünüyorum. Ancak, not olduğunu size varsa itilen uzak bir depo kodu ve insanlar o zaman bu onların kod geçmişleri yanı sıra yaptıklarını işin yukarı karışıklık oluyor, ondan çekti. Bu yüzden dikkatlice yapın.