Kısa süre önce bu konuyla ilgili blog yazdım :
Bu özellik dalını nasıl güncel tutabiliriz? En yeni yukarı akış taahhütlerini birleştirmek kolaydır, ancak yukarı akışa itildiğinde takdir edilmeyeceği için bir birleştirme taahhüdü oluşturmaktan kaçınmak istersiniz: daha sonra yukarı akış değişikliklerini etkili bir şekilde yeniden taahhüt edersiniz ve bu yukarı akış taahhütleri yeni bir karma elde eder ( yeni bir ebeveyn aldıkça). Bu özellikle önemlidir, çünkü bu güncellemeleri kişisel GitHub özellik şubenize aktardığınızda (çekme isteğini gönderdikten sonra bunu yapsanız bile) birleştirilmiş işlemlerin GitHub çekme isteğinize yansıtılacağı için bu özellikle önemlidir.
Bu yüzden birleştirmek yerine yeniden taban yapmamız gerekiyor:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
Git için hem rebase seçeneği hem de rebase komutu, ağacınızı temiz tutar ve birleştirme işlemlerinden kaçınmanızı sağlar. Ancak bunların, yeniden onaylanan (ilk çekme isteğinizi gönderdiğiniz) ilk taahhütleriniz olduğunu ve artık uzaktaki github repo şubenizde bulunan orijinal hashlerden farklı olan yeni bir commit hashine sahip olduğunu unutmayın. .
Şimdi, bu güncellemeleri kişisel GitHub özellik dalınıza göndermek, burada başarısız olacaktır, çünkü her iki dal da farklıdır: yerel dal ağacı ve uzak dal ağacı, bu farklı kaydetme karmaları nedeniyle "uyumsuzdur". Git size önce önce git pull --rebase, sonra tekrar itmenizi söyleyecek , ancak geçmişiniz yeniden yazıldığı için bu basit bir ileri sarma hareketi olmayacak. Bunu yapma!
Buradaki sorun, ilk değiştirdiğiniz taahhütleri orijinal haliyle yeniden almanız ve bunlar yerel şubenizin üstüne birleştirilecek olmasıdır. Senkronize olmama durumu nedeniyle, bu çekme temiz bir şekilde uygulanmaz. İşlemlerinizin iki kez göründüğü kırık bir geçmişe sahip olacaksınız. Tüm bunları GitHub özellik dalınıza ittiğinizde, bu değişiklikler orijinal çekme isteğine yansıyacak ve bu çok çirkinleşecektir.
AFAIK, aslında buna tamamen temiz bir çözüm yok. Bulduğum en iyi çözüm, yerel şubenizi GitHub şubenize zorlamaktır (aslında hızlı ileri olmayan bir güncellemeyi zorlamak):
Git-push (1) uyarınca:
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
O yüzden çekmeyin, sadece şu şekilde itmeye zorlayın:
git push svg +user-non-unique
veya:
git push svg user-non-unique --force
Bu aslında uzaktaki şubenizin üzerine yerel şubenizdeki her şeyi yazacaktır. Uzak akışta bulunan (ve başarısızlığa neden olan) kayıtlar orada kalacak, ancak eninde sonunda git-gc (1) tarafından silinecek olan, sarkan kayıtlar olacaktır. Önemli değil.
Dediğim gibi, bu AFAICS en temiz çözüm. Bunun dezavantajı, PR'nizin daha sonraki bir tarihe sahip olan ve PR yorum geçmişinde senkronize olmayan görünebilecek olan en yeni işlemlerle güncellenecek olmasıdır. Büyük bir sorun değil, ama kafa karıştırıcı olabilir.