github: การเพิ่มคอมมิตในคำขอดึงที่มีอยู่


89

ฉันเปิดคำขอดึงเพื่อติดตาม repo บน github โดยใช้Fork & Edit this file file

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

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

วิธีนี้ใช้งานได้ดี แต่ดูเหมือนว่าเป็นขั้นตอนการทำงานที่ค่อนข้างซับซ้อน บางทีฉันอาจจะผิดอะไรบางอย่างที่นี่?

คำถามของฉันคือฉันกำลังทำวิธีนี้ถูกต้องหรือไม่? ถ้าไม่เช่นนั้นวิธีที่เหมาะสมในการทำคืออะไร?


4
บางคนมาที่นี่อาจพบว่าสิ่งนี้เหมาะกับสถานการณ์ของพวกเขามากกว่า: stackoverflow.com/questions/9790448/…
AaronLS

4
ฉันยังพบคำถาม / คำตอบรุ่นนี้ชัดเจนขึ้น: stackoverflow.com/questions/7947322/…
Ben Wheeler

คำตอบ:


64

เนื่องจากคุณใช้เครื่องมือของ GitHub และเปลี่ยนไฟล์เพียงไฟล์เดียวคุณยังสามารถเรียกดูไฟล์บน GitHub เลือกสาขาที่เหมาะสมจากมุมบนซ้ายใต้เมนูแบบเลื่อนลง "ต้นไม้:" ( patch-3ในกรณีของคุณ) จากนั้นเลือก "แก้ไข ไฟล์นี้ ". ตอนนี้การเปลี่ยนแปลงของคุณจะถูกผูกมัดกับสาขานี้และจะปรากฏในคำขอดึงของคุณ


โปรดทราบว่าจะใช้ไม่ได้หากสาขาได้รับการป้องกันปุ่มแก้ไขจะเป็นสีเทา
Louis Maddox

10

ฉันเพิ่งเขียนบล็อกเมื่อไม่นานมานี้ในหัวข้อนี้:

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

นั่นเป็นเหตุผลที่เราต้องทำการ rebase แทนการรวม:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

ทั้งตัวเลือก rebase และคำสั่ง rebase ไปยัง git จะทำให้ทรีของคุณสะอาดและหลีกเลี่ยงการรวมคอมมิต แต่โปรดทราบว่าสิ่งเหล่านี้เป็นการกระทำครั้งแรกของคุณ (ซึ่งคุณได้ออกคำขอดึงครั้งแรกของคุณ) ที่กำลังถูกปรับใหม่และตอนนี้มีการคอมมิตใหม่ซึ่งแตกต่างจากแฮชเดิมที่ยังอยู่ในสาขา repo github ระยะไกลของคุณ .

ตอนนี้การส่งการอัปเดตเหล่านั้นออกไปยังสาขาคุณลักษณะ GitHub ส่วนบุคคลของคุณจะล้มเหลวในที่นี้เนื่องจากทั้งสองสาขาแตกต่างกัน: แผนผังสาขาในพื้นที่และแผนผังสาขาระยะไกล "ไม่ตรงกัน" เนื่องจากการแฮชคอมมิตที่แตกต่างกัน Git จะบอกคุณก่อนgit pull --rebaseแล้วจึงกดอีกครั้ง แต่นี่จะไม่ใช่การกดไปข้างหน้าแบบง่ายๆเนื่องจากประวัติของคุณถูกเขียนใหม่ อย่าทำอย่างนั้น!

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

AFAIK ไม่มีวิธีแก้ปัญหานี้โดยสิ้นเชิง ทางออกที่ดีที่สุดที่ฉันพบคือบังคับให้ส่งสาขาในพื้นที่ของคุณไปยังสาขา GitHub ของคุณ (บังคับให้อัปเดตแบบไม่กรอไปข้างหน้า):

ตาม git-push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

ดังนั้นอย่าดึงเพียงแค่ออกแรงผลักดังนี้:

git push svg +user-non-unique

หรือ:

git push svg user-non-unique --force

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

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


5

คุณยังสามารถสร้างคำขอดึงใหม่ซึ่งผูกไว้masterแทนไฟล์abc1234แก้ไข

ด้วยวิธีนี้การกระทำ / พุชใหม่ใด ๆ ไปยังที่เก็บของคุณจะถูกเพิ่มไปยังคำขอดึง


3

ใช่คุณทำงานมากกว่าที่คุณต้องการ เพียงแค่ทำการคอมมิตเพิ่มเติมแล้วบังคับดัน คุณจะเห็นคอมมิตเดิมรวมถึงคอมมิตใหม่เมื่อคุณรีเฟรช github ในเบราว์เซอร์ของคุณ

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

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