Bagaimana cara menerapkan permintaan tarikan hulu yang tidak dihapus dari garpu lain ke garpu saya?


466

Sebuah proyek di GitHub yang saya punya garpu memiliki permintaan tarik baru yang ingin saya tarik ke garpu saya bahwa penulis belum menariknya.

Apakah ada cara sederhana untuk menerapkan permintaan tarik dari garpu lain ke garpu saya? Apakah ada sesuatu yang hilang di sini?



Apakah ini mencerminkan grafik jaringan di GitHub jika Anda menggunakan perintah git untuk melakukannya?
ADTC

Mungkin juga menarik untuk menemukan semua cabang juga: stackoverflow.com/q/47798937/10245
Tim Abell

Jawaban:


276

Anda dapat melakukannya secara manual dengan mudah:

  • tambahkan garpu lain sebagai remote dari repo Anda:

    git remote add otherfork git://github.com/request-author/project.git
    
  • ambil komitmen repo-nya

    git fetch otherfork
    
  • Anda memiliki dua opsi untuk menerapkan permintaan tarik (jika Anda tidak ingin memilih pilih 1.)

    1. Jika Anda tidak peduli tentang penerapan juga komitmen akhirnya yang telah ditambahkan antara asal dan permintaan tarik, Anda bisa rebase cabang di mana permintaan tarik dibentuk

      git rebase master otherfork/pullrequest-branch
      
    2. Jika Anda hanya ingin komit dalam permintaan tarik, identifikasi SHA1 mereka dan lakukan

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

166
Sebenarnya, Anda tidak boleh menggunakan cherry-pick, itu menciptakan komit baru ... yang pada gilirannya akan menyebabkan kebingungan jika Anda mengirim permintaan tarik ke hulu. Alih-alih, Anda harus menggabungkan seperti yang diminta permintaan tarik. Anda tidak perlu menambahkan remote juga. git pull URL branchname
Tekkub

3
@Tekkub: setuju, mungkin lebih baik untuk menghindari kebingungan dengan komitmen yang baru dibuat. Penggabungan kurang elegan di pikiran saya karena Anda dapat membawa perubahan lain dari cabang tempat Anda bergabung
CharlesB

8
Aye, tetapi dalam kasus ini dia secara khusus bertanya bagaimana menarik permintaan tarik ke garpunya. Tarik == bergabung.
Tekkub

1
@CharlesB, karena GitHub secara otomatis menambahkan komit baru pada cabang yang sama ke permintaan tarik, bukankah akan sulit untuk mendapatkan "perubahan lain" (dengan asumsi pemohon mengikuti praktik terbaik dan menempatkan perubahan pada cabang terpisah dari pengembangan yang berkelanjutan maka bahwa semua komitmen itu relevan), kecuali apa yang Anda maksudkan adalah ketika Anda hanya menginginkan sebagian dari permintaan tarik?
neverfox

4
Bagi mereka yang berbagi kesalahan mental saya, "orang lain" tidak merujuk repo asli, itu merujuk komit dari garpu yang mengeluarkan permintaan tarikan ke repo asli. Abaikan repo asli dan langsung ke garpu yang membuat permintaan tarik. Anda ingin menarik komit secara manual, tarikan itu merujuk dan menggabungkannya dengan milik Anda.
Michael Khalili

282

Pembaruan: Via Webpage

Anda juga dapat melakukan ini melalui halaman web github.

Saya berasumsi, Anda seharusnya sudah memiliki fork ( MyFork) dari repo umum ( BaseRepo) yang memiliki permintaan tarik tertunda dari fork ( OtherFork) yang Anda minati.

  1. Arahkan ke fork ( OtherFork) yang telah memulai permintaan tarik yang ingin Anda masuki ke fork Anda ( MyFork)
  2. Buka halaman tarik permintaan OtherFork
  3. Klik permintaan tarik baru
  4. Permintaan tarikan yang tertunda harus ditawarkan. Ingatlah untuk memilih OtherForkcabang yang tepat juga. Pilih di sisi kiri sebagai garpu dasar garpu Anda ( MyFork) ( PENTING ).
  5. Sekarang opsi View pull requestharus berubah menjadi Create pull request. Klik ini.

Sekarang Anda harus memiliki permintaan tarik tertunda di fork Anda ( MyFork), yang bisa Anda terima.


6
Bekerja dengan indah. Jauh lebih sederhana daripada cmd line, dan mudah ditinjau perubahannya. Terima kasih.
Alveoli

3
Saya kesulitan menemukan cara membuka "OtherFork" di UI. Untuk sampai ke sana cukup modifikasi url dengan nama pengguna github. yaitu github.com/userName/repoName
Charles

2
Saya tidak dapat melihat permintaan tarik tertunda yang disebutkan di langkah 4. Sebaliknya, saya memilih cabang yang sesuai dengan permintaan tarik yang dibuat oleh OtherFork, dari dropdown 'bandingkan' sebelah kanan. Saya kemudian memilih sisi kiri sebagai garpu dasar seperti yang dijelaskan di atas karena mampu membuat permintaan tarik.
seddonym

Bekerja kecuali tidak ada garpu. Misalnya: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Kata-kata yang tepat dari situs githubs mungkin kedaluwarsa, tetapi prosesnya tepat. Sangat sederhana - terima kasih!
kevnk

73

Seperti yang dikatakan Tekkub sebelumnya, Anda bisa langsung menarik cabangnya. Sebagian besar waktu dengan GitHub, cabang hanyalah "master" pada garpu proyek yang diminta Pengguna.

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

Dan sebagai contoh praktis:

Katakanlah Anda memotong proyek github yang disebut safaribooks dan ada permintaan tarik berikut, dalam proyek asal, yang ingin Anda masukkan ke garpu:

masukkan deskripsi gambar di sini

Kemudian, di folder proyek cloning fork Anda, jalankan:

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

20
Kelemahan dari ini adalah bahwa cabang mungkin memiliki hal-hal lain di dalamnya selain permintaan tarik. Juga, Anda harus mencari URL yang tepat untuk garpu permintaan penulis tarik. Jika Anda ingin menggunakan one-liner, lebih baik gunakan git pull https://github.com/{upstream/project} refs/pull/{id}/headsaja.
jbyler

1
@jbyler Jika cabang memiliki hal-hal lain di dalamnya, saya cukup yakin GitHub akan memperbarui permintaan tarik dengan mereka.
Tim Malone

22

Permintaan tarik untuk proyek mungkin berasal dari banyak penulis (fork) yang berbeda, dan Anda mungkin tidak ingin remote yang terpisah untuk setiap fork. Selain itu, Anda tidak ingin membuat asumsi apa pun tentang cabang yang digunakan penulis saat mengajukan permintaan tarik, atau apa pun yang mungkin ada di cabang utama penulis. Jadi lebih baik untuk merujuk permintaan tarik seperti yang muncul di repositori hulu, daripada seperti yang muncul di garpu lain.

Langkah 1:

git remote add upstream <url>

Anda mungkin sudah melakukan langkah ini, tetapi jika tidak, Anda ingin remote yang ditentukan untuk proyek hulu. URL adalah URL klon dari proyek yang Anda buat bercabang dua. Info selengkapnya di Mengkonfigurasi remote untuk garpu dan Menyinkronkan garpu . upstreamadalah nama yang Anda berikan ke remote, dan meskipun bisa berupa apa saja, upstreamadalah nama konvensional.

Langkah 2:

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

... di mana {id}nomor permintaan tarik. upstreamadalah nama remote untuk menarik, yaitu hanya "hulu" jika Anda mengikuti langkah 1 dengan tepat. Ini juga bisa berupa URL, dalam hal ini Anda dapat melewati langkah 1.

Langkah 3:

Ketikkan pesan komit untuk gabungan komit. Anda dapat mempertahankan defaultnya, meskipun saya sarankan memberikan ringkasan satu baris yang bagus dengan nomor permintaan tarik, masalah yang diperbaiki, dan deskripsi singkat:

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

Lihat juga jawaban terkait dengan varian yang membuat cabang lokal dengan permintaan tarik di dalamnya. Dan varian terakhir: Anda dapat menggunakan git pull upstream refs/pull/{id}/headuntuk memasukkan komit ke dalam repo lokal Anda , kemudian FETCH_HEADgit log ..FETCH_HEADgit merge FETCH_HEAD
merujuknya

bagaimana saya bisa melakukan rebasing, jadi permintaan tarikan ada di kepala & saya bisa menghindari penggabungan gelembung?
Michael Johnston

1
Ini adalah solusi yang saya butuhkan, karena penulis permintaan tarik telah menghapus repo-nya.
jswetzen

20

Beberapa info lebih rinci yang berfungsi untuk saya.

File .git / config saya untuk repo bercabang tampak seperti ini:

[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/*

Kemudian jalankan "git fetch source", yang kemudian mencantumkan semua permintaan tarik dari repo bercabang dua.

 * [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

Dan kemudian untuk menggabungkan permintaan tarik tertentu jalankan "git merge master origin / pr / 67"


1
Saya mengedit .git / config saya dan menambahkan baris [sumber "] jarak jauh tetapi untuk proyek saya tertarik, dan instruksi bekerja dengan sempurna. Saya suka jawaban ini.
philo vivero

3
Nasihat terkait yang sangat baik dapat ditemukan di news.ycombinator.com/item?id=9051220 dan help.github.com/articles/checking-out-pull-requests- petunjuk umum tentangrefs/pull/ namespace jarak jauh khusus khusus baca GitHub khusus ini (luar biasa) khusus GitHub. .
Philip Durbin

Jika Anda menggunakan Smartgit, Anda dapat melihat permintaan tarik ini (dan yang tertutup) dalam grafik log jika Anda menambahkan smartgit.branch.otherRefs=notes;pullke smartgit.properties sesuai dengan syntevo.com/doc/display/SG/System+Properties - Anda juga dapat menggabungkannya dari sana .
CAD

btw, Anda juga dapat mencobanya di baris perintah dengan git fetch source + refs / head / *: refs / remote / hulu / * + refs / pull / * / head: refs / remote / origin / pr / *
lib

9

Apa yang akan saya lakukan adalah sebagai berikut;

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

Saya sekarang telah menggabungkan perubahan menjadi cabang uji, bernama test_fork. Sehingga setiap perubahan tidak akan mengotori pohon saya.

Secara opsional, Anda dapat menggunakan cherry-pick seperti dijelaskan di atas untuk memilih komit tertentu jika itu lebih disukai.

Selamat jalan :)


0

Saya menggunakan skrip keren untuk ini. Saya menjalankan skrip dengan mengetik:

git prfetch upstream

dan itu mendapatkan semua permintaan tarik dari garpu hulu.

Untuk membuat skrip buat file ~/bin/git-prfetch.

File tersebut harus berisi yang berikut:

#!/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/\*

Pastikan jalur Anda menyertakan skrip dengan menetapkan:

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

Anda dapat menambahkan file ini ~/.bashrcuntuk membuat perubahan itu permanen.

Sekarang, pastikan Anda menambahkan garpu yang Anda inginkan untuk mendapatkan permintaan tarik dari:

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

Lalu

git prfetch upstream
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.