GitHub'a yalnızca en son taahhüt için bir çekme isteği gönderin


280

Github üzerine bir proje çatalladım ve yerel ustamda başarılı bir şekilde değişiklikler yapıyorum ve github'dan çıkmaya çalışıyorum. Bir çekme isteği göndermek istiyorum, ancak yalnızca son taahhüdü eklemek istiyorum. Github.com'daki çekme isteği kullanıcı arabirimi son 9 taahhüdü gösterir ve bunu nasıl filtreleyeceğimi bilmiyorum.

Ben yeni bir yerel şube oluşturmak, kontrol ve bir şekilde sıfırlama veya yukarı akış için rebase anlamaya çalışıyordu? Sonra son taahhüdümü kimliğimden yeni yerel şubeye uygula ve çekme isteği için mi kullanıyorsun?

Kavramları doğru yapmaya ve ihtiyacım olanı yapmak için doğru komut satırlarını bulmaya çalışıyorum.


Ve diğer tüm taahhütlerle bir çekme talebi yaparsanız ne olur? Git'in zaten çektiği taahhütleri görmezden gelmeye (ya da geçmeye) yetecek kadar zeki olduğunu düşündüm.
38'de jayarjo

3
Muhtemelen, yukarı akış henüz müdahale eden taahhütleri kabul etmemiştir veya istememektedir.
Michael Scott Cuthbert

@jayarjo Örneğin, yukarı akış göndermek istemediğim diğer değişiklikleri yaptım. Git ana depoyu yoksaymak için yapılan değişiklikler örneğin gerekli değildir. Git ile kolay bir şey yok.
Martin

İlgili: Git (yazılım) ve GitHub'da (web servisi) çekme isteklerinin nasıl farklı olduğuna dair bazı iyi ayrıntılar
RBT

Yanıtlar:


302

Temel olarak yeni bir şube oluşturmanız ve ona eklemek istediğiniz taahhütleri kiraz olarak seçmeniz gerekir.

Not: Ödeme / kiraz toplama komutlarından önce bunlara ihtiyacınız olabilir

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

Daha sonra, <new-branch-name>github'da şube göreceksiniz , ona geçeceksiniz ve çekme isteğini istediğiniz değişikliklerle gönderebilirsiniz.


32
Ben de git checkout -b yukarı akış yukarı / master çalıştırmadan önce git remote add upstream <git repository>ve gerekir git remote update.
plainjimbo

6
Bu işe yarar, ancak bunu yapmanız gerektiği gibi değildir, çünkü şimdi yukarı akış dalınız ve yukarı akış / masterınız farklıdır ve çekme isteğinizi birleştirmek yukarı akıştaki ilk şey değilse her zaman farklı olacaktır. Bu nedenle stackoverflow.com/a/5256304/1904815 yapmayı tercih etmelisiniz .
JonnyJD

2
Ayrıntılı olarak açıklamak gerekirse: Bu teknik bir sorun değil, mantıklı bir sorundur. Yukarı akış ile herhangi bir şey yapmak istediğinizde (oradan birleşmek gibi) bir dal "gerçek yukarı akış" eklemeniz veya yukarı akışınızı sıfırlamanız gerekir (ek değişiklikler için çekme isteğiniz için yerel bir dal bırakmaz).
JonnyJD

15
Neden sadece bir tek kod satırı için bir PR oluşturmak için ekstra bir şubeye ihtiyacım var ?! Github'da kimse bunu düşündü mü?
CodeManX

2
@JonHanna Hayır ... neden bir şubeyi birleştirmek zorundasın? Neden bir taahhüdü birleştiremiyorsun?
Kevin Krumwiede

57

En son işlemden başlayarak, aynı zamanda kaynak deposunda bulunan yeni bir şube oluşturun:

git branch new-branch origin/master
git checkout new-branch

Ardından git cherry-pick, çekme isteğini istediğiniz tek taahhüdü almak için kullanın . Bu taahhüdü bulunan şube çağrılırsa featureve istediğiniz taahhüt bu şubedeki en son taahhüt ise,

git cherry-pick feature

Bu yamanın çakışma olmadan geçerli olduğunu varsayarsak, artık çekme isteğinizi yapabileceğiniz bir şubeniz var.

İkinci bir adımda, şimdi şubenizle ne yapacağınıza karar vermeniz gerekiyor feature. Değişikliklerinizi bu dalda henüz yayınlamadıysanız, en iyi prosedür muhtemelen bu dalı yeni dalda yeniden temel almaktır (ve bu otomatik olarak yapılmazsa son taahhüdü kaldırmaktır git rebase).


Bu mesajı kiraz toplamasından sonra alıyorum. taahhüt için hiçbir şey eklenmedi ancak izlenmeyen dosyalar mevcut (izlemek için "git add" kullanın). Her şey efendimde, ama şubemi yukarıdan yapmam gerekiyor.
Kevin Hakanson

5
Eğer featurezaten taahhüt edilmişse, origin/mastersırasında hiçbir şey olmaz cherry-pick. Yeni şube upstream/master(yani Kevin Hakanson'un cevabı) olmalıdır
ohho

26

Sonunda bir çatal çatal ve orijinal projeye geri çekme isteği göndermek istedim.

Sahiptim:

  • orignal_project
  • forked_project (SHA'daki orijinal projeden oluşturuldu: 9685770)
  • my_fork (SHA'daki çatallı projeden oluşturuldu: 207e29b)
  • Çatalımda (SHA: b67627b) orijinal projeye geri göndermek istediğim bir taahhüt

Bunu yapmak için:

  1. SHA'dan orijinal projenin çatallandığı yeni bir şube oluşturdu
  2. hepsini orijinal projeden çekti
  3. kiraz çekme isteği olarak göndermek istediğim taahhüdü seçti
  4. hepsini github'a kadar itti

Git komutları şöyle bir şeydi:

  1. git şube benim özellik-istek 9685770
  2. git checkout benim özellik isteğim
  3. git pull https://github.com/original_project/original_project.git
  4. git kiraz toplama b67627b
  5. git push origin benim özellik-istek

Daha sonra orijinal projeye çekme isteğim için şube olarak özellik-özelliğini seçtim.


6

Bu neredeyse benim için çalıştı:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

Tek fark şuydu:

git push origin upstream:upstream

Git hattının GitHub repo'mdaki yukarı akış dalını yapması için bu son satırı değiştirmem gerekiyordu, böylece ondan PR yapabilirdim.


5

Mevcut şubeye geri çekme talebi olarak izole etmek istediğim taahhüdü zaten yapmıştım.

Bu yüzden yeni bir şubeye baktım

git checkout -b isolated-pull

Ve işte çözümüm @Kevin Hakanson'dan farklı , çünkü bu dalı tarihte farklılaşmak istediğim yere sıfırlamam gerekiyor

git reset --hard [sha-to-diff-by]

Ve izole bir çekme isteği oluşturmak istediğim taahhüdü kiraz seç

git cherry-pick [my-isolated-commit-sha]

Sonunda uzaktan kumandaya doğru itin

git push origin isolated-pull

Ve çekme isteği dat shi.


1

Yeni (geçici) bir dal oluşturma, kiraz toplama ve bu dal için çekme talebi oluşturma çözümü beni tatmin etmedi. Bir dizi taahhütte bulunmak için havuzumu değiştirmek istemedim, bu yüzden aşağıdaki alternatifi buldum:

Öncelikle tüm ilgili taahhütler için yama dosyaları oluşturun:

git format-patch -1 <sha>

Eğer ilgi taahhüdü sonuncusu ise HEADbunun yerine kullanabilirsiniz<sha> .

Şimdi, yamaları kaynak havuzun koruyucusuna gönderebilirsiniz; bunlar onları uygulayabilir:

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

Son olarak, bu geçici bir dal bir çekme isteği ile birleştirilmiş gibi görünmelidir, ancak çatal deposunda bu ek dal bulunmadan.


0

@ Kevin-hakanson'ın cevabına dayanarak, bu işlemi kolaylaştırmak için bu küçük bash senaryosunu yazdım. Önceden yoksa, yukarı akış repo'sunu ekler (sizden URL'yi ister), ardından hem yeni dalın adını hem de o dalda kiraz alma taahhüdünün etiketini / SHA'sını ister. Şu anda hangi şubede veya bağlılıkta olduğunuzu kontrol eder, ardından yeni şubeyi kontrol edebilmeniz için değişiklikleri saklar. Birleştirme stratejisi, kirazın seçtiği taahhütten gelen değişiklikleri tutar. Yeni şubeyi origin(uzak repo'nuzun adı olduğu varsayılarak) ittikten sonra , daha önce bulunduğunuz şube veya taahhüt tekrar kontrol edilir ve önceki değişiklikleriniz saklanır.

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

(Bu benim için birkaç basit testte işe yaradı, ama ben bir bash programcısı veya git uzmanı değilim, bu yüzden daha iyi otomatikleştirilebilecek özledim vakalar varsa bana bildirin!)

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.