github: Mevcut çekme isteğine kaydetme ekleme


89

Fork & Edit this file butonunu kullanarak github üzerindeki rails repo için bir pull isteği açtım .

Şimdi, PR'm hakkında geri bildirim aldıktan sonra, biraz daha kayıt eklemek istedim. işte bunu yaparak bitirdiğim şey

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

Bu iyi çalıştı ancak oldukça karmaşık bir iş akışı gibi görünüyor. Belki burada yanlış bir şeyim var?

sorum şu: Bunu doğru şekilde mi yapıyorum? değilse, bunu yapmanın doğru yolu nedir?


4
Buraya gelenler bunun senaryolarına daha iyi uyduğunu görebilir: stackoverflow.com/questions/9790448/…
AaronLS

4
Ayrıca sorunun / cevabın bu sürümünü daha net buldum: stackoverflow.com/questions/7947322/…
Ben Wheeler

Yanıtlar:


64

GitHub'ın araçlarını kullandığınız ve yalnızca bir dosyayı değiştirdiğiniz için, GitHub'daki dosyaya da göz atabilir , "ağaç:" açılır listesinin ( patch-3sizin durumunuzda) altında sol üst köşeden uygun dalı seçebilir ve şimdi "Düzenle bu dosya". Şimdi değişiklikleriniz bu şubeye uygulanacak ve çekme isteğinizde görünecek


Dal korunuyorsa bunun işe yaramayacağını unutmayın , düzenleme düğmesi gri olur
Louis Maddox

10

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.


5

masterBelirli bir abc1234revizyon yerine bağlı olan yeni bir çekme isteği de oluşturabilirsiniz .

Bu şekilde, deponuza yapılan herhangi bir yeni commit / push, çekme isteğine eklenecektir.


3

Evet, gerekenden çok daha fazlasını yapıyorsun. Sadece ek bir taahhütte bulunun ve onu zorlayın. Tarayıcınızda github'u yenilediğinizde orijinal işlemenin yanı sıra daha sonra yeni aktarılan işlemi göreceksiniz.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

Bu emin, en kolay ve en düz yol neden onun değil üst cevap
Banjo Obayomi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.