โครงการบน GitHub ที่ฉันมีทางแยกมีคำขอดึงใหม่ที่ฉันต้องการดึงเข้าสู่ทางแยกของฉันที่ผู้เขียนยังไม่ได้ดึงเข้ามา
มีวิธีง่ายๆในการใช้คำขอดึงจากส้อมอื่น ๆ ในส้อมของฉัน? มีอะไรอีกบ้างไหมที่ฉันหายไป?
โครงการบน GitHub ที่ฉันมีทางแยกมีคำขอดึงใหม่ที่ฉันต้องการดึงเข้าสู่ทางแยกของฉันที่ผู้เขียนยังไม่ได้ดึงเข้ามา
มีวิธีง่ายๆในการใช้คำขอดึงจากส้อมอื่น ๆ ในส้อมของฉัน? มีอะไรอีกบ้างไหมที่ฉันหายไป?
คำตอบ:
คุณสามารถทำได้ด้วยตนเองอย่างง่ายดาย:
เพิ่มอีกส้อมเป็นรีโมต repo ของคุณ:
git remote add otherfork git://github.com/request-author/project.git
เรียกความมุ่งมั่นของ repo ของเขา
git fetch otherfork
คุณมีสองตัวเลือกในการใช้คำขอดึง (ถ้าคุณไม่ต้องการเลือกรับ 1)
หากคุณไม่สนใจเกี่ยวกับการใช้งานในที่สุดก็ยอมรับว่าได้เพิ่มระหว่างต้นทางและคำขอดึงคุณสามารถรีบูตสาขาที่เกิดคำขอดึงขึ้น
git rebase master otherfork/pullrequest-branch
หากคุณต้องการทำคอมมิชชันในคำขอดึงให้ระบุ SHA1 และทำ
git cherry-pick <first-SHA1> <second-SHA1> <etc.>
git pull URL branchname
คุณสามารถทำได้ผ่านหน้าเว็บ GitHub
ฉันถือว่าคุณควรมี fork ( MyFork
) ของ repo ทั่วไป ( BaseRepo
) ซึ่งมีคำขอดึงที่รออนุมัติจาก fork ( OtherFork
) ที่คุณสนใจ
OtherFork
) ซึ่งเริ่มต้นคำขอดึงที่คุณต้องการเข้าสู่ทางแยกของคุณ ( MyFork
)OtherFork
OtherFork
สาขาที่เหมาะสมด้วย เลือกทางด้านซ้ายเป็นฐานแยกส้อมของคุณ ( MyFork
) ( สำคัญ )View pull request
Create pull request
คลิกที่นี่ตอนนี้คุณควรมีคำขอดึงที่รอดำเนินการในทางแยกของคุณ ( MyFork
) ซึ่งคุณสามารถยอมรับได้
OtherFork
จากรายการแบบเลื่อนลง 'เปรียบเทียบ' ทางขวามือ จากนั้นฉันเลือกด้านซ้ายเป็นฐานแยกตามที่อธิบายไว้ข้างต้นเนื่องจากสามารถสร้างคำขอดึง
อย่างที่ Tekkub เคยกล่าวไว้ก่อนหน้านี้คุณสามารถดึงสาขาได้โดยตรง เวลาส่วนใหญ่กับ GitHub สาขาเป็นเพียง "หลัก" ในการร้องขอทางแยกของผู้ใช้ของโครงการ
ตัวอย่าง: git pull https://github.com/USER/PROJECT/ BRANCH
และเป็นตัวอย่างในเชิงปฏิบัติ:
สมมติว่าคุณแยกโครงการ github ที่เรียกว่า safaribooks และมีคำขอดึงดังต่อไปนี้ในโครงการต้นทางที่คุณต้องการใส่ไว้ใน fork ของคุณ:
จากนั้นในโฟลเดอร์โปรเจ็กต์โคลนของคุณให้เรียกใช้:
git pull https://github.com/fermionic/safaribooks.git fix-str-decode
git pull https://github.com/{upstream/project} refs/pull/{id}/head
แทนสายการบินที่ดีกว่า
คำขอดึงสำหรับโครงการอาจมาจากผู้เขียนหลายคน (ส้อม) และคุณอาจไม่ต้องการแยกระยะไกลสำหรับแต่ละส้อม นอกจากนี้คุณไม่ต้องการตั้งสมมติฐานใด ๆ เกี่ยวกับสาขาที่ผู้เขียนใช้เมื่อส่งคำขอการดึงหรืออะไรที่อาจอยู่ในสาขาหลักของผู้เขียน ดังนั้นจึงเป็นการดีกว่าที่จะอ้างอิงคำขอดึงที่ปรากฏในที่เก็บอัปสตรีมแทนที่จะเป็นตามที่ปรากฏในส้อมอื่น ๆ
ขั้นตอนที่ 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
)
ข้อมูลรายละเอียดเพิ่มเติมที่เหมาะกับฉัน
ไฟล์. 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"
refs/pull/
namespace .
smartgit.branch.otherRefs=notes;pull
ใน smartgit.properties ตามsyntevo.com/doc/display/SG/System+Propertiesคุณสามารถรวมคำขอเหล่านั้นได้จากที่นั่น .
สิ่งที่ฉันจะทำมีดังต่อไปนี้
git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#
test_fork
ผมได้รวมในขณะนี้การเปลี่ยนแปลงลงในสาขาการทดสอบการตั้งชื่อ ดังนั้นการเปลี่ยนแปลงใด ๆ จะไม่ทำให้ต้นไม้ของฉันสกปรก
เป็นทางเลือกคุณสามารถใช้การเลือกเชอร์รี่ตามที่อธิบายไว้ข้างต้นเพื่อเลือกการส่งแบบเฉพาะเจาะจงหากเลือกได้มากกว่า
การเดินทางมีความสุข :)
ฉันใช้สคริปต์สำรวยที่มีประโยชน์สำหรับเรื่องนี้ ฉันรันสคริปต์โดยพิมพ์:
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