การมีส่วนร่วมในโครงการบน github วิธี "สร้างคำขอดึงข้อมูลใหม่บนต้นแบบ"


98

โอเคฉันมีส่วนร่วมในโปรเจ็กต์บน github โครงการบน github คือupstreamrepo ที่แยกของฉันบน github คือoriginและlocalrepo ของฉันบนคอมพิวเตอร์ของฉัน

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

จากนั้นฉันก็ส่งคำขอดึง

git push origin master

คำขอดึงจะได้รับการตรวจสอบและจำเป็นต้องทำการเปลี่ยนแปลงที่ไม่เกี่ยวข้อง บุคคลอื่นทำการกระทำและรวมเข้าด้วยกันupstream/master

ตอนนี้ฉันถูกขอโดยผู้upstreamดูแลให้"rebase my pull request on top of master"

นี่คือเรื่องราวของฉัน (ใส่เอฟเฟกต์เสียง Law and Order) .....

ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ กับคำขอดึงข้อมูลและยังคงยืนยันเหมือนเดิมในคุณสมบัติสาขา

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

ฉันไม่เข้าใจ. วิธีนี้เป็นไปได้เมื่อฉันรู้ว่าคนที่มุ่งมั่นและรวมupstream/masterหลังจากที่ผมผลักดึงคำขอของฉันไปorigin/feature?

ใครช่วยบอกฉันหน่อยได้ไหมว่าขั้นตอนที่ถูกต้องควรเป็นอย่างไรในสถานการณ์นี้?

คำตอบ:


110

คุณแสดงเฉพาะการดึงข้อมูลใน repo ต้นน้ำ นั่นไม่ได้อัปเดตสาขาในพื้นที่ของคุณจริงๆ มันเพียง upstreamแต่ปรับปรุงความรู้ของ คุณต้องตรวจสอบให้แน่ใจว่าupstream/masterได้รวมเข้ากับของคุณอย่างสมบูรณ์masterเช่นกับ a git pullก่อนที่จะทำการรีmasterเบตใหม่หรือมากกว่านั้นเพียงแค่ตั้งฐานupstream/masterใหม่

ได้แก่ :

git checkout master
git pull upstream master
git checkout feature
git rebase master

หรือ

git checkout feature
git rebase upstream/master

อัปเดต:

หลังจากแก้ไขfeatureสาขาในพื้นที่ของคุณแล้วคุณจะต้องส่งกลับไปoriginเพื่ออัปเดตคำขอดึงข้อมูลให้เสร็จสิ้น เนื่องจากคุณได้ผลักดันfeatureไปแล้วครั้งหนึ่งคุณจะไม่สามารถทำได้pushอีกต่อไปเพราะ rebase เปลี่ยนประวัติศาสตร์และไม่ต้องกรอไปข้างหน้านาน โดยปกติเมื่อการกดล้มเหลวด้วย "ไม่กรอไปข้างหน้า" คุณจะแก้ไขได้โดยการดึง แต่การดึงจะเป็นการรวมประวัติที่แตกต่างกันสองอย่างเข้าด้วยกันซึ่งไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน นั่นหมายความว่าfeatureสาขาเก่าของคุณ (pre rebase) จะรวมกับสาขา (post rebase) ใหม่ คุณต้องการเขียนทับ origin/featureด้วยสถานะของfeatureสาขาใหม่โดยทิ้งบันทึกใด ๆ ของสาขาเก่า git push -f origin featureนั่นหมายความว่าคุณจะต้องการที่จะบังคับให้การผลักดันให้เกิดขึ้นแม้ว่าจะไม่ได้เป็นไปอย่างรวดเร็วไปข้างหน้าโดยใช้ บันทึก:อันตรายและคุณอาจสูญเสียการกระทำกับมัน ใช้เฉพาะในกรณีที่คุณแน่ใจจริงๆว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่เช่นที่นี่ซึ่งคุณตั้งใจจะละทิ้งการกระทำแบบเก่าที่ไร้ประโยชน์ในfeatureสาขาก่อนการปรับฐาน


1
ตกลงฉันเข้าใจแล้วขอบคุณสำหรับคำชี้แจง ฉันเห็นว่าฉันควรจะดึงแทนที่จะดึง ตอนนี้ฉันมีปัญหาอื่นเมื่อฉันgit push origin featureได้รับข้อผิดพลาดที่ไม่ใช่การกรอไปข้างหน้าไม่สามารถพุช ฯลฯ .. git pull --rebase จะแก้ไขข้อผิดพลาดนี้และส่งไปยังสาขาคุณลักษณะของฉันหรือไม่หรือจะทำให้เกิดปัญหากับผู้ดูแลและอื่น ๆ
fontno

1
อัปเดตคำตอบของฉันเพื่อให้ครอบคลุมการผลักดัน
Ryan Stewart

ในกรณีของฉันฉันเพิ่ม repo ต้นน้ำเป็นรีโมต แต่ลืมดึงข้อมูลจากมัน git fetch upstreamที่ดาวน์โหลดการเปลี่ยนแปลงล่าสุดแล้วในที่สุดก็git rebase upstream/developทำงาน
Alberto Chiusole

10

ตอนนี้ผู้ดูแลต้นน้ำขอให้ฉัน "rebase my pull request on top of master"

โปรดทราบว่าตั้งแต่เดือนกันยายน 2016 ผู้ดูแลระบบสามารถเรียกใช้ rebase ได้ด้วยตัวเอง

ดู " Rebase และรวมคำขอดึง "

เมื่อคุณเลือกตัวเลือก "Rebase and merge" ใหม่การคอมมิตจากสาขาของคำขอดึงจะถูก rebased ที่ปลายของกิ่งพื้นฐานจากนั้นกิ่งพื้นฐานเองจะถูกส่งต่อไปยังส่วนหัวที่ปรับใหม่นี้อย่างรวดเร็ว Rebases จะตั้งค่าคอมมิทเตอร์ของการคอมมิตใหม่ให้กับผู้ใช้ปัจจุบันโดยอัตโนมัติในขณะที่ยังคงรักษาข้อมูลการเขียนไว้ให้เหมือนเดิม สาขาของคำขอดึงจะไม่ถูกแก้ไขโดยการดำเนินการนี้

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

https://cloud.githubusercontent.com/assets/2195/18671961/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif

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