วิธีการใช้คำขอดึงต้นน้ำที่ไม่ได้จมจากส้อมอื่น ๆ เข้ากับส้อมของฉันได้อย่างไร


465

โครงการบน GitHub ที่ฉันมีทางแยกมีคำขอดึงใหม่ที่ฉันต้องการดึงเข้าสู่ทางแยกของฉันที่ผู้เขียนยังไม่ได้ดึงเข้ามา

มีวิธีง่ายๆในการใช้คำขอดึงจากส้อมอื่น ๆ ในส้อมของฉัน? มีอะไรอีกบ้างไหมที่ฉันหายไป?


8
มีคำแนะนำคือ: gist.github.com/piscisaureus/3342247
Piotr Migdal

สิ่งนี้สะท้อนถึงกราฟเครือข่ายที่ GitHub หรือไม่หากคุณใช้คำสั่ง git เพื่อทำมัน
ADTC

อาจเป็นเรื่องที่น่าสนใจในการค้นหาสาขาทั้งหมดเช่น: stackoverflow.com/q/47798937/10245
Tim Abell

คำตอบ:


276

คุณสามารถทำได้ด้วยตนเองอย่างง่ายดาย:

  • เพิ่มอีกส้อมเป็นรีโมต repo ของคุณ:

    git remote add otherfork git://github.com/request-author/project.git
    
  • เรียกความมุ่งมั่นของ repo ของเขา

    git fetch otherfork
    
  • คุณมีสองตัวเลือกในการใช้คำขอดึง (ถ้าคุณไม่ต้องการเลือกรับ 1)

    1. หากคุณไม่สนใจเกี่ยวกับการใช้งานในที่สุดก็ยอมรับว่าได้เพิ่มระหว่างต้นทางและคำขอดึงคุณสามารถรีบูตสาขาที่เกิดคำขอดึงขึ้น

      git rebase master otherfork/pullrequest-branch
      
    2. หากคุณต้องการทำคอมมิชชันในคำขอดึงให้ระบุ SHA1 และทำ

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

166
ที่จริงแล้วคุณไม่ควรใช้ cherry-pick มันสร้างคอมมิทใหม่ ... ซึ่งจะทำให้เกิดความสับสนหากคุณส่งคำขอดึงขึ้นต้นน้ำ แต่คุณควรรวมเช่นเดียวกับคำขอดึงที่ขอให้ทำ คุณไม่จำเป็นต้องเพิ่มรีโมต git pull URL branchname
Tekkub

3
@Tekkub: เห็นด้วยมันอาจจะดีกว่าที่จะหลีกเลี่ยงความสับสนกับการกระทำที่สร้างขึ้นใหม่ การผสานนั้นมีความสง่างามน้อยกว่าในใจของฉันเนื่องจากคุณสามารถนำการเปลี่ยนแปลงอื่น ๆ จากสาขาที่คุณรวมเข้าด้วยกัน
CharlesB

8
ใช่ แต่ในกรณีนี้เขาถามวิธีดึงคำขอดึงลงในส้อมของเขาโดยเฉพาะ ดึง == ผสาน
Tekkub

1
@CharlesB เนื่องจาก GitHub เพิ่มการคอมมิตใหม่ในสาขาเดียวกันโดยอัตโนมัติเพื่อดึงคำขอไม่เป็นการยากที่จะได้รับ "การเปลี่ยนแปลงอื่น ๆ " (สมมติว่าผู้ร้องขอปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดและวางการเปลี่ยนแปลงในสาขาแยกต่างหากจากการพัฒนาอย่างต่อเนื่อง) ความมุ่งมั่นทั้งหมดนั้นมีความเกี่ยวข้อง) เว้นแต่ว่าคุณต้องการรับสิ่งใดเมื่อคุณต้องการเพียงส่วนหนึ่งของคำขอดึง
neverfox

4
สำหรับผู้ที่แบ่งปันความผิดพลาดทางจิตใจ "otherfork" ไม่ได้อ้างอิงถึง repo ดั้งเดิมมันอ้างอิงการกระทำจากทางแยกที่ออกคำขอ pull ไปยัง repo ดั้งเดิม ละเว้น repo ดั้งเดิมและไปที่ทางแยกที่ทำคำขอดึง คุณต้องการดึงการคอมมิตด้วยตนเองการอ้างอิงนั้นถูกผสานและผสานเข้ากับของคุณเอง
Michael Khalili

282

อัปเดต: ผ่านหน้าเว็บ

คุณสามารถทำได้ผ่านหน้าเว็บ GitHub

ฉันถือว่าคุณควรมี fork ( MyFork) ของ repo ทั่วไป ( BaseRepo) ซึ่งมีคำขอดึงที่รออนุมัติจาก fork ( OtherFork) ที่คุณสนใจ

  1. ไปที่ทางแยก ( OtherFork) ซึ่งเริ่มต้นคำขอดึงที่คุณต้องการเข้าสู่ทางแยกของคุณ ( MyFork)
  2. ไปที่หน้าคำขอการดึงของ OtherFork
  3. คลิกคำขอดึงใหม่
  4. ควรเสนอคำขอดึงที่รออนุมัติ อย่าลืมเลือกOtherForkสาขาที่เหมาะสมด้วย เลือกทางด้านซ้ายเป็นฐานแยกส้อมของคุณ ( MyFork) ( สำคัญ )
  5. ตอนนี้ตัวเลือกของควรเปลี่ยนView pull request Create pull requestคลิกที่นี่

ตอนนี้คุณควรมีคำขอดึงที่รอดำเนินการในทางแยกของคุณ ( MyFork) ซึ่งคุณสามารถยอมรับได้


6
ทำงานได้อย่างสวยงาม ง่ายกว่า cmd line มากและง่ายต่อการตรวจสอบการเปลี่ยนแปลง ขอบคุณ.
Alveoli

3
ฉันมีปัญหาในการหาวิธีไปที่ "OtherFork" บน UI หากต้องการไปที่นั่นอย่างง่ายดายเพียงแค่แก้ไข URL ด้วยชื่อผู้ใช้ GitHub ie github.com/userName/repoName
Charles

2
ฉันไม่สามารถดูคำขอดึงที่รอดำเนินการที่กล่าวถึงในขั้นตอนที่ 4 แทนฉันเลือกสาขาที่ตรงกับคำขอดึงที่ทำโดยOtherForkจากรายการแบบเลื่อนลง 'เปรียบเทียบ' ทางขวามือ จากนั้นฉันเลือกด้านซ้ายเป็นฐานแยกตามที่อธิบายไว้ข้างต้นเนื่องจากสามารถสร้างคำขอดึง
seddonym

ทำงานได้เว้นแต่ไม่มีทางแยก ตัวอย่างเช่น: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
คำที่แน่นอนจากไซต์ githubs อาจล้าสมัย แต่กระบวนการดังกล่าวเป็นที่ต้องการ ง่ายสุด ๆ - ขอบคุณ!
kevnk

73

อย่างที่ Tekkub เคยกล่าวไว้ก่อนหน้านี้คุณสามารถดึงสาขาได้โดยตรง เวลาส่วนใหญ่กับ GitHub สาขาเป็นเพียง "หลัก" ในการร้องขอทางแยกของผู้ใช้ของโครงการ

ตัวอย่าง: git pull https://github.com/USER/PROJECT/ BRANCH

และเป็นตัวอย่างในเชิงปฏิบัติ:

สมมติว่าคุณแยกโครงการ github ที่เรียกว่า safaribooks และมีคำขอดึงดังต่อไปนี้ในโครงการต้นทางที่คุณต้องการใส่ไว้ใน fork ของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นในโฟลเดอร์โปรเจ็กต์โคลนของคุณให้เรียกใช้:

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

20
ข้อเสียของเรื่องนี้คือสาขาอาจมีสิ่งอื่นนอกเหนือจากคำขอดึง นอกจากนี้คุณต้องค้นหา URL ที่ถูกต้องสำหรับส้อมของผู้เขียนคำขอดึง หากคุณต้องการใช้สายการบินเดียวควรใช้git pull https://github.com/{upstream/project} refs/pull/{id}/headแทนสายการบินที่ดีกว่า
jbyler

1
@jbyler หากสาขามีสิ่งอื่น ๆ อยู่ในนั้นฉันค่อนข้างแน่ใจว่า GitHub จะอัปเดตคำขอดึงกับพวกเขาต่อไป
ทิมมาโลน

22

คำขอดึงสำหรับโครงการอาจมาจากผู้เขียนหลายคน (ส้อม) และคุณอาจไม่ต้องการแยกระยะไกลสำหรับแต่ละส้อม นอกจากนี้คุณไม่ต้องการตั้งสมมติฐานใด ๆ เกี่ยวกับสาขาที่ผู้เขียนใช้เมื่อส่งคำขอการดึงหรืออะไรที่อาจอยู่ในสาขาหลักของผู้เขียน ดังนั้นจึงเป็นการดีกว่าที่จะอ้างอิงคำขอดึงที่ปรากฏในที่เก็บอัปสตรีมแทนที่จะเป็นตามที่ปรากฏในส้อมอื่น ๆ

ขั้นตอนที่ 1:

git remote add upstream <url>

คุณอาจทำตามขั้นตอนนี้แล้ว แต่ถ้าไม่คุณจะต้องกำหนดระยะไกลสำหรับโครงการต้นน้ำ URL คือ URL โคลนของโครงการที่คุณแยกไว้ ข้อมูลเพิ่มเติมได้ที่การกำหนดค่าระยะไกลสำหรับส้อมและซิงค์ส้อม upstreamเป็นชื่อที่คุณให้กับรีโมตและในขณะที่สามารถเป็นอะไรก็ได้ upstreamเป็นชื่อธรรมดา

ขั้นตอนที่ 2:

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

... {id}หมายเลขคำขอการดึงอยู่ที่ไหน upstreamเป็นชื่อของรีโมตที่จะดึงออกมาเช่นเพียงแค่ "อัปสตรีม" หากคุณทำตามขั้นตอนที่ 1 อย่างแน่นอน นอกจากนี้ยังอาจเป็น URL ซึ่งในกรณีนี้คุณสามารถข้ามขั้นตอนที่ 1

ขั้นตอนที่ 3:

พิมพ์ข้อความคอมมิทสำหรับการคอมมิทรวม คุณสามารถใช้ค่าเริ่มต้นได้แม้ว่าฉันจะแนะนำให้มีการสรุปหนึ่งบรรทัดที่ดีพร้อมกับหมายเลขคำขอดึงปัญหาที่แก้ไขและคำอธิบายสั้น ๆ :

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

ดูคำตอบที่เกี่ยวข้องกับชุดตัวเลือกที่สร้างสาขาในพื้นที่พร้อมคำขอดึง และตัวแปรสุดท้าย: คุณสามารถใช้git pull upstream refs/pull/{id}/headเพื่อรับคอมมิชชันใน repo ท้องถิ่นของคุณจากนั้นอ้างอิงพวกเขาเป็นFETCH_HEAD(เช่นgit log ..FETCH_HEADเพื่อดูว่ามีอะไรอยู่ในนั้นgit merge FETCH_HEAD)
jbyler

ฉันจะไปเกี่ยวกับการรีบูตได้อย่างไรดังนั้นคำขอการดึงจะอยู่ที่หัว & ฉันสามารถหลีกเลี่ยงการรวมฟองได้
Michael Johnston

1
นี่คือทางออกที่ฉันต้องการเพราะผู้เขียนคำขอดึงได้ลบ repo ของเขา
jswetzen

20

ข้อมูลรายละเอียดเพิ่มเติมที่เหมาะกับฉัน

ไฟล์. git / config ของฉันสำหรับ repo ที่มีการแยกมีลักษณะดังนี้:

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

จากนั้นเรียกใช้ "git fetch source" ซึ่งแสดงรายการคำขอดึงทั้งหมดจาก repo ที่มีการแยก

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

จากนั้นเมื่อต้องการรวมในคำขอดึงเฉพาะให้เรียกใช้ "git merge master origin / pr / 67"


1
ฉันแก้ไข. git / config และเพิ่มบรรทัด [source "remote"] แต่สำหรับโครงการที่ฉันสนใจและคำแนะนำทำงานได้อย่างไร้ที่ติ ฉันรักคำตอบนี้
philo vivero

3
คำแนะนำที่ดีเยี่ยมที่เกี่ยวข้องสามารถพบได้ที่news.ycombinator.com/item?id=9051220และhelp.github.com/articles/checking-out-pull-requests-locallyคำแนะนำนี้ (น่ากลัว) GitHub เฉพาะอ่านอย่างเดียวระยะไกลrefs/pull/namespace .
Philip Durbin

หากคุณใช้ Smartgit คุณจะเห็นคำขอดึง (และคำขอปิด) เหล่านี้ในกราฟบันทึกหากคุณเพิ่มsmartgit.branch.otherRefs=notes;pullใน smartgit.properties ตามsyntevo.com/doc/display/SG/System+Propertiesคุณสามารถรวมคำขอเหล่านั้นได้จากที่นั่น .
คนเจ้าเล่ห์ CAD

btw คุณสามารถลองบนบรรทัดคำสั่งด้วย git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

สิ่งที่ฉันจะทำมีดังต่อไปนี้

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

test_forkผมได้รวมในขณะนี้การเปลี่ยนแปลงลงในสาขาการทดสอบการตั้งชื่อ ดังนั้นการเปลี่ยนแปลงใด ๆ จะไม่ทำให้ต้นไม้ของฉันสกปรก

เป็นทางเลือกคุณสามารถใช้การเลือกเชอร์รี่ตามที่อธิบายไว้ข้างต้นเพื่อเลือกการส่งแบบเฉพาะเจาะจงหากเลือกได้มากกว่า

การเดินทางมีความสุข :)


0

ฉันใช้สคริปต์สำรวยที่มีประโยชน์สำหรับเรื่องนี้ ฉันรันสคริปต์โดยพิมพ์:

git prfetch upstream

และมันจะได้รับคำขอดึงทั้งหมดจากทางแยกต้นน้ำ

~/bin/git-prfetchเพื่อสร้างสคริปต์ทำให้ไฟล์

ไฟล์ควรมีสิ่งต่อไปนี้:

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

ตรวจสอบให้แน่ใจว่าเส้นทางของคุณมีสคริปต์โดยการตั้งค่า:

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

คุณสามารถเพิ่มไฟล์นี้~/.bashrcเพื่อทำการเปลี่ยนแปลงแบบถาวร

ตอนนี้ให้แน่ใจว่าคุณเพิ่มส้อมที่คุณต้องการได้รับคำขอดึงจาก:

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

และจากนั้น

git prfetch upstream
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.