Diğer çatallardan birleştirilmemiş yukarı akım çekme isteklerini çatalıma nasıl uygularım?


466

GitHub'da bir çatalı olduğum bir projede, yazarın henüz çekmediği çatalıma çekmek istediğim yeni bir çekme isteği var.

Çatalıma diğer çatallardan çekme isteği uygulamanın basit bir yolu var mı? Burada özlediğim başka bir şey var mı?



Bunu yapmak için git komutlarını kullanırsanız, GitHub'daki ağ grafiğine yansır mı?
ADTC

Ayrıca tüm dalları bulmak da ilginç olabilir: stackoverflow.com/q/47798937/10245
Tim Abell

Yanıtlar:


276

Manuel olarak kolayca yapabilirsiniz:

  • diğer çatalı deponuzun uzaktan kumandası olarak ekleyin:

    git remote add otherfork git://github.com/request-author/project.git
    
  • repo taahhütlerini getir

    git fetch otherfork
    
  • Daha sonra çekme isteğini uygulamak için iki seçeneğiniz vardır (seçim 1'i seçmek istemiyorsanız).

    1. Kökeni ve çekme isteği arasında eklenen nihai taahhütleri de uygulamak umursamıyorsanız, çekme talebinin oluşturulduğu şubeyi yeniden temellendirebilirsiniz.

      git rebase master otherfork/pullrequest-branch
      
    2. Taahhütleri yalnızca çekme isteğinde istiyorsanız, SHA1'lerini belirleyin ve

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
Aslında, kiraz toplama kullanmamalısınız, yeni taahhütler yaratır ... bu da yukarı yönde bir çekme isteği gönderirseniz karışıklığa neden olur. Bunun yerine, çekme isteğinin yapmasını istediği gibi birleşmelisiniz. Uzaktan kumanda eklemenize de gerek yok. git pull URL branchname
Tekkub

3
@Tekkub: Katılıyorum, yeni oluşturulan taahhütlerle karışıklığı önlemek daha iyi olabilir. Birleştirme yaptığınız şubeden başka değişiklikler getirebildiğiniz için birleştirme aklımda daha az zarif
CharlesB

8
Evet, ama bu durumda özellikle çekme talebini çatalına nasıl çekeceğini sordu. == birleştirme.
Tekkub

1
@CharlesB, GitHub aynı dalda otomatik olarak bir çekme isteğine yeni taahhütler eklediğinden, "başka değişiklikler" almak zor olmaz (istekte bulunanın en iyi uygulamaları izlediğini ve değişiklikleri sürekli geliştirmeden ayrı bir şubeye koyduğunu varsayarak, tüm taahhütlerin alakalı olması), bir çekme talebinin yalnızca bir kısmını istemediğinizde elde ettiğiniz şey nedir?
neverfox

4
Benim zihinsel bir aksaklık paylaşan olanlar için, "otherfork" orijinal repo başvurmuyor, çataldan taahhüt referans oluyor yayınlanan orijinal repo çekme isteğini. Orijinal repoyu dikkate almayın ve doğrudan çekme talebini yapan çatala gidin. Çekmenin referans aldığı taahhüdü manuel olarak çekmek ve kendinizle birleştirmek istiyorsunuz.
Michael Khalili

282

Güncelleme: Web Sayfası ile

Bunu github web sayfası üzerinden de yapabilirsiniz.

Zaten ilgilendiğiniz bir çataldan ( ) bekleyen çekme isteğine sahip MyForkortak repo ( BaseRepo) çatalına ( ) sahip olduğunuzu varsayalım OtherFork.

  1. Çatalı OtherForkalmak istediğiniz çekme isteğini başlatan çatala ( ) gidin ( MyFork)
  2. Sayfasının çekme istekleri sayfasına gidin OtherFork
  3. Yeni çekme isteğine tıklayın
  4. Bekleyen çekme istek (ler) i sunulmalıdır. Uygun OtherForkdalı da seçmeyi unutmayın . Sol tarafta çatalınızı ( MyFork) ( ÖNEMLİ ) olarak sol taraftan seçin .
  5. Şimdi seçeneği olarak View pull requestdeğişmelidir Create pull request. Buna tıkla.

Şimdi çatalınızda ( MyFork) beklemede olan bir çekme isteğiniz olmalıdır .


6
Güzel çalışıyor. Cmd hattından çok daha basit ve değişiklikleri gözden geçirmek kolaydır. Teşekkür ederim.
Alveoli

3
Nasıl UI "OtherFork" almak için sorun vardı. Oraya kolayca ulaşmak için URL'yi github kullanıcı adıyla değiştirin. ie github.com/userName/repoName
Charles

2
4. adımda belirtilen bekleyen çekme isteklerini göremedim. Bunun yerine, OtherForksağdaki 'karşılaştırma' açılır listesinden yapılan çekme isteğine karşılık gelen dalı seçtim . Daha sonra, çekme isteğini oluşturabildiği gibi sol tarafı yukarıda açıklandığı gibi temel çatal olarak seçtim.
seddonym

Çatal olmadığı sürece çalışır. Örneğin: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Githubs sitesinden tam kelimeler güncel olmayabilir, ancak süreç yerinde. Süper basit - teşekkürler!
kevnk

73

Tekkub'un daha önce söylediği gibi, şubeyi doğrudan çekebilirsiniz. GitHub ile çoğu zaman, şube, projenin talep eden Kullanıcı çatalında "usta" olur.

Misal: git pull https://github.com/USER/PROJECT/ BRANCH

Pratik bir örnek olarak:

Diyelim ki safaribooks adında bir github projesi çatalladınız ve kaynak projede çatalınıza koymak istediğiniz aşağıdaki çekme isteği var:

resim açıklamasını buraya girin

Ardından, çatalınızın klonlanmış proje klasöründe şunu çalıştırın:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
Bunun dezavantajı, dalın çekme talebinin yanında başka şeylere sahip olabilmesidir. Ayrıca, çekme isteği yazarının çatalı için uygun URL'yi aramanız gerekir. Bir astar kullanmak istiyorsanız, git pull https://github.com/{upstream/project} refs/pull/{id}/headbunun yerine kullanmak daha iyidir .
jbyler

1
@jbyler Şube içinde başka şeyler varsa, GitHub'ın çekme isteğini yine de onlarla güncelleyeceğinden eminim.
Tim Malone

22

Proje için çekme istekleri birçok farklı yazardan (çatal) gelebilir ve muhtemelen her çatal için ayrı bir uzaktan kumanda istemezsiniz. Ayrıca, yazarın çekme isteği gönderirken kullandığı dal veya yazarın ana dalında başka neler olabileceği hakkında varsayımlar yapmak istemezsiniz. Bu nedenle, çekme çatalını, diğer çatallarda göründüğü gibi, yukarı akış deposunda göründüğü gibi belirtmek daha iyidir.

Aşama 1:

git remote add upstream <url>

Muhtemelen bu adımı zaten yapmışsınızdır, ancak değilse, yukarı akış projesi için tanımlanmış bir uzaktan kumanda isteyeceksiniz. URL, çatalladığınız projenin klon URL'sidir. Daha fazla bilgi için Uzaktan kumandayı çatal için yapılandırma ve çatal senkronizasyonu . upstreamuzaktan kumandaya verdiğiniz addır ve herhangi bir şey olsa upstreamda geleneksel addır.

Adım 2:

git pull upstream refs/pull/{id}/head

... {id}çekme talebi numarası nerede . upstreamuzaktan kumandanın adıdır, yani sadece 1. adımı tam olarak izlediyseniz "yukarı akış" tır. Ayrıca bir URL olabilir, bu durumda 1. adımı atlayabilirsiniz.

Aşama 3:

Birleştirme taahhüdü için bir taahhüt iletisi yazın. Çekme isteği numarası, giderdiği sorun ve kısa bir açıklama ile güzel bir tek satırlık özet vermenizi öneririm, ancak varsayılanı koruyabilirsiniz:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

Ayrıca , içinde çekme isteği olan yerel bir dal oluşturan bir varyantla ilgili bir yanıta bakın . Ve son bir varyant: kullanabilirsiniz git pull upstream refs/pull/{id}/headArdından, yerel repo içine kaydedilmesini almak için onları referans FETCH_HEAD(örn git log ..FETCH_HEADsonra, içinde ne olduğunu görmek için git merge FETCH_HEAD)
jbyler

nasıl yeniden basma hakkında gitmek istiyorum, bu yüzden çekme isteği başında & bir birleştirme kabarcık önlemek miyim?
Michael Johnston

1
İhtiyacım olan çözüm buydu, çünkü çekme talebi yazarı repo'yu kaldırmıştı.
jswetzen

20

Benim için çalışan daha ayrıntılı bilgiler.

Çatallı repo için .git / config dosyam şöyle görünüyor:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Daha sonra çatallı depodaki tüm çekme isteklerini listeleyen "git fetch source" komutunu çalıştırın.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

Ve sonra belirli bir çekme isteğinde birleştirmek için "git merge master origin / pr / 67" komutunu çalıştırın


1
.Git / config'imi düzenledim ve [uzak "kaynak"] satırlarını ekledim, ancak ilgilendiğim proje için talimatlar kusursuz bir şekilde çalıştı. Bu cevabı seviyorum.
philo vivero

3
Mükemmel ilgili tavsiyeler news.ycombinator.com/item?id=9051220 ve help.github.com/articles/checking-out-pull-requests-loally GitHub'a özgü salt okunur uzak refs/pull/ad alanında ipuçları içerir. .
Philip Durbin

Eğer SmartGit kullanırsanız eklerseniz günlük grafikte bu çekme isteklerini (ve kapalı olanları) görebilirsiniz smartgit.branch.otherRefs=notes;pullgereğince smartgit.properties için syntevo.com/doc/display/SG/System+Properties - Ayrıca onları birleştirebilir orada .
CAD bloke

ref / uzaktan kumanda / memba / * + ref / çekme / * / kafa: Btw, ayrıca getirme git ile komut satırında kaynak + ref / kafaları / * deneyebilirsiniz ref / uzaktan kumanda / köken / pr / *
lib

9

Yapacağım şey şu;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Şimdi değişiklikleri adlı bir test dalında birleştirdim test_fork. Böylece herhangi bir değişiklik ağacımı kirletmez.

İsteğe bağlı olarak, daha tercih edilirse belirli bir taahhüdü seçmek için yukarıda açıklandığı gibi kiraz toplama kullanabilirsiniz.

Mutlu yolculuklar :)


0

Bunun için kullanışlı bir züppe komut dosyası kullanıyorum. Ben komut dosyasını yazarak çalıştırın:

git prfetch upstream

ve tüm çekme taleplerini yukarı akış çatalından alır.

Komut dosyası oluşturmak için bir dosya oluşturun ~/bin/git-prfetch.

Dosya aşağıdakileri içermelidir:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Aşağıdakileri ayarlayarak yolunuzun komut dosyasını içerdiğinden emin olun:

export PATH="$HOME/bin:$PATH"

~/.bashrcDeğişikliği kalıcı yapmak için bu dosyayı ekleyebilirsiniz .

Şimdi, çekme isteklerini almak istediğiniz çatalı eklediğinizden emin olun:

git remote add upstream https://github.com/user/repo.git

Ve sonra

git prfetch upstream
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.