ส่งคำขอดึงบน GitHub สำหรับการส่งล่าสุดเท่านั้น


280

ฉันแยกโครงการบน GitHub และประสบความสำเร็จในการเปลี่ยนแปลงเจ้านายท้องถิ่นของฉันและผลักดันให้เกิดที่ GitHub ฉันต้องการส่งคำขอดึง แต่ต้องการรวมการส่งมอบครั้งล่าสุดเท่านั้น UI คำขอดึงข้อมูลบน github.com แสดงการคอมมิท 9 ครั้งล่าสุดและฉันไม่รู้วิธีการกรอง

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

ฉันพยายามทำให้แนวคิดถูกต้องและค้นหาบรรทัดคำสั่งที่ถูกต้องเพื่อทำสิ่งที่ฉันต้องการ


และจะเกิดอะไรขึ้นถ้าคุณทำคำขอดึงกับการกระทำอื่น ๆ ทั้งหมด? ฉันคิดว่าคอมไพล์ฉลาดพอที่จะเพิกเฉยต่อ (หรือผ่าน) สิ่งที่ทำไปแล้วหรือยัง?
jayarjo

3
สันนิษฐานว่าต้นน้ำยังไม่ได้รับการยอมรับหรือไม่ต้องการกระทำการแทรกแซง
Michael Scott Cuthbert

@jayarjo ตัวอย่างเช่นฉันทำการเปลี่ยนแปลงอื่น ๆ ฉันไม่ต้องการส่งอัปสตรีม การเปลี่ยนแปลงในคอมไพล์ละเว้นพื้นที่เก็บข้อมูลหลักไม่จำเป็น ไม่มีอะไรง่ายกับคอมไพล์
Martin

ที่เกี่ยวข้อง: รายละเอียดที่ดีเกี่ยวกับวิธีการร้องขอการดึงนั้นแตกต่างกันใน Git (ซอฟต์แวร์) และ GitHub (บริการบนเว็บ)
RBT

คำตอบ:


302

คุณต้องสร้างสาขาใหม่ & เลือกเชอร์รี่ที่คุณต้องการเพิ่ม

หมายเหตุ: คุณอาจต้องใช้สิ่งเหล่านี้ก่อนที่คำสั่งเช็คเอาต์ / cherry-pick

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>

หลังจากนั้นคุณจะเห็น<new-branch-name>สาขาบน GitHub สลับไปที่มันและสามารถส่งคำขอดึงที่มีการเปลี่ยนแปลงที่คุณต้องการ


32
ฉันยังต้องgit remote add upstream <git repository>และgit remote updateก่อนใช้ git checkout -b upstream upstream / master
plainjimbo

6
วิธีนี้ใช้งานได้ แต่ไม่ใช่วิธีที่คุณควรทำเพราะตอนนี้สาขาอัปสตรีมและอัปสตรีม / มาสเตอร์ของคุณแตกต่างกันและจะแตกต่างกันเสมอหากการรวมคำขอดึงของคุณไม่ใช่สิ่งแรกที่อัปสตรีมทำ สำหรับเหตุผลที่คุณควรจะชอบทำstackoverflow.com/a/5256304/1904815
JonnyJD

2
หากต้องการอธิบายอย่างละเอียด: นี่ไม่ใช่ปัญหาทางเทคนิค แต่เป็นเหตุผลเชิงตรรกะ เมื่อคุณต้องการทำอะไรกับอัปสตรีม (เช่นการรวมจากที่นั่น) คุณต้องเพิ่มสาขา "เรียลสตรีม" หรือรีเซ็ตอัพสตรีมของคุณ (ไม่ปล่อยให้สาขาท้องถิ่นสำหรับคำขอการดึงของคุณสำหรับการเปลี่ยนแปลงเพิ่มเติม)
JonnyJD

15
เหตุใดฉันจึงต้องมีสาขาเพิ่มเติมเพียงเพื่อสร้าง PR สำหรับรหัสบรรทัดที่เปลี่ยนไปเพียงสายเดียว! มีใครบ้างที่คิดแบบนี้?
CodeManX

2
@ จอนฮันนาไม่ ... ทำไมคุณต้องรวมสาขาด้วย? ทำไมคุณไม่สามารถรวมการกระทำได้?
Kevin Krumwiede

57

สร้างสาขาใหม่ที่เริ่มต้นจากการคอมมิชชันล่าสุดซึ่งอยู่ในที่เก็บต้นฉบับด้วย:

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

จากนั้นใช้git cherry-pickเพื่อรับค่าคอมมิทที่คุณต้องการให้ดึงคำขอ ถ้าสาขาที่มีการคอมมิชชันนี้ถูกเรียกfeatureและการคอมมิชชันที่คุณต้องการคือคอมมิชชันล่าสุดในสาขานี้ก็จะเป็นเช่นนั้น

git cherry-pick feature

สมมติว่าแพทช์นี้ใช้โดยไม่มีข้อขัดแย้งตอนนี้คุณได้เป็นสาขาที่คุณสามารถทำคำขอดึงของคุณ

ในขั้นตอนที่สองตอนนี้คุณต้องตัดสินใจว่าจะทำอย่างไรกับfeatureสาขาของคุณ หากคุณไม่ได้รับการตีพิมพ์การเปลี่ยนแปลงของคุณในสาขานี้เลยขั้นตอนที่ดีที่สุดน่าจะเป็น rebasing สาขานี้เมื่อใหม่สาขา (และลบสุดท้ายกระทำถ้านี้ไม่ได้ทำโดยอัตโนมัติgit rebase)


ฉันได้รับข้อความนี้หลังจากเชอร์รี่เลือก ไม่มีการเพิ่มอะไรในการคอมมิต แต่ยังไม่ได้ติดตามไฟล์ที่มีอยู่ (ใช้ "git add" เพื่อติดตาม) ทุกอย่างอยู่ในระดับปริญญาโทของฉัน แต่ฉันต้องทำให้สาขาของฉันจากต้นน้ำ
Kevin Hakanson

5
หากfeatureมีการยืนยันแล้วorigin/masterไม่มีอะไรเกิดขึ้นในระหว่างcherry-pickนี้ สาขาใหม่ควรมาจากupstream/master(เช่นคำตอบของ Kevin Hakanson)
ohho

26

ฉันลงเอยด้วยสถานการณ์ที่แยกส้อมและต้องการส่งคำขอดึงกลับไปที่โครงการดั้งเดิม

ฉันมี:

  • orignal_project
  • forked_project (สร้างจากโครงการดั้งเดิมที่ SHA: 9685770)
  • my_fork (สร้างจากโครงการแยกที่ SHA: 207e29b)
  • คอมมิชชันในส้อมของฉัน (SHA: b67627b) ที่ฉันต้องการส่งกลับไปที่โครงการดั้งเดิม

เมื่อต้องการทำสิ่งนี้ฉัน:

  1. สร้างสาขาใหม่จาก SHA ที่มีการแยกโครงการดั้งเดิม
  2. ดึงทั้งหมดจากโครงการเดิม
  3. เชอร์รี่เลือกความมุ่งมั่นที่ฉันต้องการส่งเป็นคำขอดึง
  4. ผลักมันทั้งหมดขึ้นไปถึง GitHub

คำสั่ง git มีลักษณะดังนี้:

  1. git branch my-Feature-request 9685770
  2. git ชำระเงินคุณสมบัติของฉันคำขอ
  3. git pull https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. git push มาจากคุณสมบัติของฉัน - ขอ

จากนั้นฉันเลือกคำขอคุณสมบัติของฉันเป็นสาขาสำหรับคำขอดึงของฉันไปที่โครงการเดิม


6

เกือบจะได้ผลกับฉัน:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

ข้อแตกต่างอย่างเดียวคือ:

git push origin upstream:upstream

ฉันต้องเปลี่ยนบรรทัดสุดท้ายเพื่อให้ git push สร้างสาขาต้นน้ำใน repo GitHub ของฉันเพื่อที่ฉันจะได้ประชาสัมพันธ์จากมัน


5

ฉันได้กระทำไปแล้วซึ่งฉันต้องการแยกเป็นคำขอดึงกลับสู่สาขาปัจจุบัน

ฉันเลยไปเช็คสาขาใหม่

git checkout -b isolated-pull

และนี่คือจุดที่โซลูชันของฉันแตกต่างจาก @Kevin Hakansonเนื่องจากฉันต้องรีเซ็ตสาขานี้เป็นสถานที่ในประวัติศาสตร์ที่ฉันต้องการแตกต่างจาก

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

และเชอร์รี่เลือกความมุ่งมั่นที่ฉันต้องการสร้างคำขอดึงแบบแยก

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

ในที่สุดก็ดันขึ้นไปจนถึงรีโมท

git push origin isolated-pull

และดึงคำขอ dat shi


1

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

ขั้นแรกสร้างไฟล์ปะแก้สำหรับสิ่งที่คุณสนใจ:

git format-patch -1 <sha>

หากความผูกพันเกิดขึ้นเป็นสิ่งสุดท้ายคุณสามารถใช้HEADแทน<sha>ได้

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

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

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


0

จากคำตอบของ @ kevin-hakanson ฉันได้เขียนสคริปต์ทุบตีเล็ก ๆ น้อย ๆ เพื่อให้กระบวนการนี้ง่ายขึ้น มันจะเพิ่ม repo อัปสตรีมหากยังไม่มี (พร้อมท์ให้คุณใส่ URL) จากนั้นแจ้งให้ทั้งชื่อของสาขาใหม่เพื่อสร้างและแท็ก / SHA ของการส่งมอบเชอร์รี่ไปยังสาขานั้น มันจะตรวจสอบว่าสาขาใดหรือคุณกำลังอยู่ในขณะนั้นหยุดการเปลี่ยนแปลงใด ๆ เพื่อให้คุณสามารถชำระเงินสาขาใหม่ กลยุทธ์การผสานช่วยให้การเปลี่ยนแปลงจากการกระทำที่เชอร์รี่เลือก หลังจากผลักสาขาใหม่ไปที่origin(สันนิษฐานว่าเป็นชื่อ repo ระยะไกลของคุณ) สาขาหรือการกระทำที่คุณทำก่อนหน้าจะถูกเช็คเอาต์อีกครั้งและการเปลี่ยนแปลงก่อนหน้าของคุณเกิดขึ้นจากที่เก็บ

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

(สิ่งนี้ได้ผลกับฉันในการทดสอบง่ายๆสองสามอย่าง แต่ฉันไม่ใช่ผู้เชี่ยวชาญด้านโปรแกรมเมอร์หรือ git ดังนั้นขอให้ฉันรู้ว่ามีบางกรณีที่ฉันพลาดซึ่งอาจเป็นแบบอัตโนมัติที่ดีกว่า!)

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