เวิร์กโฟลว์ Github ที่ต้องการสำหรับการปรับปรุงคำขอดึงหลังจากการตรวจสอบรหัส


341

ฉันได้ส่งการเปลี่ยนแปลงไปยังโครงการโอเพ่นซอร์สบน Github และได้รับความคิดเห็นการตรวจสอบโค้ดจากหนึ่งในสมาชิกหลักของทีม

ฉันต้องการอัปเดตรหัสโดยคำนึงถึงความคิดเห็นการตรวจสอบและส่งอีกครั้ง เวิร์กโฟลว์ที่ดีที่สุดสำหรับการทำเช่นนี้คืออะไร? จากความรู้ที่ จำกัด ของฉันเกี่ยวกับ git / github ฉันสามารถทำสิ่งใดสิ่งหนึ่งต่อไปนี้:

  1. อัปเดตรหัสเป็นการคอมมิชชันใหม่และเพิ่มการคอมมิทเริ่มต้นและอัปเดตลงในคำขอดึงของฉัน

  2. ยังไงก็ตาม (??) ย้อนกลับการคอมมิชชันเก่าจากที่เก็บของฉันและสร้างการคอมมิทใหม่ที่มีทุกอย่างจากนั้นเพิ่มคำขอดึงสำหรับสิ่งนั้น?

  3. git commitมีคุณสมบัติที่แก้ไข แต่ฉันได้ยินมาว่าคุณไม่ควรใช้งานหลังจากที่คุณส่งการคอมมิทนอกพื้นที่เก็บข้อมูลในเครื่องของคุณ? ในกรณีนี้ฉันได้ทำการเปลี่ยนแปลงบนพีซีในพื้นที่ของฉันและผลักดันไปยังสาขา github ของโครงการ นี่จะใช้การ 'แก้ไข' ไหม

  4. อื่น ๆ อีก?

ดูเหมือนว่าตัวเลือก 2/3 จะดีเพราะโครงการโอเพนซอร์ซจะมีเพียงหนึ่งคอมมิชชันในประวัติศาสตร์ของพวกเขาซึ่งจะใช้งานทุกอย่าง แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

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

คำตอบ:


219

เพียงเพิ่มคอมมิตใหม่ไปยังสาขาที่ใช้ในคำขอดึงและดันสาขาไปที่ GitHub คำขอดึงจะถูกอัปเดตโดยอัตโนมัติเมื่อมีการส่งคำสั่งเพิ่มเติม

# 2 และ # 3 ไม่จำเป็น หากผู้คนต้องการเห็นเฉพาะที่สาขาของคุณถูกรวมใน (และไม่ใช่การกระทำเพิ่มเติม) พวกเขาสามารถใช้git log --first-parentเพื่อดูการกระทำที่ผสานในบันทึกเท่านั้น


7
masterเป็นสาขาเกินไปดังนั้นในทางเทคนิคมันไม่สำคัญ :)
โผล่

10
@OrionEdwards - ตามที่ poke กล่าวไว้ master เป็นสาขาดังนั้นการอัปเดตจะทำให้คำขอการดึงใด ๆ ที่ยึดตามนั้นได้รับการอัปเดตเช่นกัน (นี่เป็นเหตุผลที่ดีที่จะใช้สาขาแยกสำหรับทุกสิ่งที่คุณวางแผนที่จะส่งคำขอดึง)
แอมเบอร์

18
ตั้งแต่รหัสยังคงอยู่ในการตรวจสอบก็มักจะดีกว่าที่จะแก้ไขกระทำ (s) มากกว่าการแนะนำกระทำ fixup เพิ่มเติมว่าเพียงแค่ถ่วงประวัติศาสตร์ ...
mgalgs

4
@mgalgs นั่นเป็นเรื่องของการตั้งค่า
เหลืองอำพัน

4
ฉันไม่ชอบคำตอบนี้ด้วยเหตุผลอธิบายในโพสต์บล็อกที่ฉันเพิ่งเขียน ; ฉันเชื่อว่าคำตอบอื่นดีกว่ามาก
Adam Spires

225

เพื่ออัปเดตคำขอดึง

หากต้องการอัปเดตคำขอดึง (จุด # 1) สิ่งเดียวที่คุณต้องทำคือเช็คเอาต์สาขาเดียวกับคำขอดึงจากและกดไปอีกครั้ง:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

ทางเลือก - การล้างประวัติการคอมมิท

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

$ git remote add parent git@github.com:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

เป็นความคิดที่ดีที่จะรวมสิ่งต่าง ๆ เข้าด้วยกัน

$ git rebase -i parent/master 

นี่จะแจ้งให้คุณเลือกวิธีเขียนประวัติคำขอดึงของคุณต่อไปนี้จะอยู่ในเครื่องมือแก้ไขของคุณ:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

สำหรับการกระทำใด ๆ ที่คุณต้องการเป็นส่วนหนึ่งของการกระทำก่อนหน้านี้ - เปลี่ยนการเลือกเป็นสควอช:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

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

$ git log --oneline parent/master..master
9de3202 fixing actual problem

ผลักดันให้ส้อม:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To git@github.com:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

และคำขอการดึงของคุณจะมีการคอมมิชชันเดียวโดยรวมการเปลี่ยนแปลงทั้งหมดก่อนหน้านี้แบ่งออกเป็นหลายคอมมิท

การเปลี่ยนประวัติศาสตร์ของ repos สาธารณะเป็นสิ่งที่ไม่ดี

การเขียนประวัติใหม่และการใช้งานgit push -fในสาขาที่อาจมีคนอื่นที่ถูกโคลนอยู่แล้วเป็นสิ่งที่ไม่ดี - มันทำให้ประวัติของที่เก็บและการเช็คเอาต์แตกต่างกัน

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

หมายเหตุเกี่ยวกับสาขา

ในข้างต้นฉันแสดงคำขอดึงที่มาจากmasterสาขาของคุณไม่มีอะไรผิดปกติ แต่มันสร้างข้อ จำกัด บางอย่างเช่นถ้านี่เป็นเทคนิคมาตรฐานของคุณสามารถเปิด PR ได้หนึ่งครั้งต่อที่เก็บ . เป็นความคิดที่ดีกว่าที่จะสร้างสาขาสำหรับการเปลี่ยนแปลงแต่ละอย่างที่คุณต้องการเสนอ:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets

28
+1 สำหรับการกล่าวถึงวิธีล้างข้อมูลคอมมิทแทนที่จะส่งคอมมิทโปรแกรมแก้ไขเพิ่มเติม
mgalgs

3
ฉันพบปัญหาในการเลือก / การบีบและคำตอบนี้ช่วยฉันได้ นอกจากนี้ยังพบว่า Github git push -fลบออกสนทนาก่อนหน้านี้หลังจากที่ผมทำ มีความคิดเห็นไม่มาก แต่นั่นเป็นสิ่งที่ฉันไม่ได้คาดหวัง
Hitesh

5
เพียงเพื่อให้ชัดเจนเมื่อ rebasing มีประวัติที่สะอาดคุณกำลังเปลี่ยนความมุ่งมั่นสาธารณะของคุณคุณเพียงแค่สมมติว่าไม่มีใครสนใจเพราะมันเป็นทางแยก
brita_

2
การติดตามผล: แนวทางปฏิบัติที่ดีที่สุดเมื่ออาจารย์เปลี่ยนไประหว่างการประชาสัมพันธ์?
Kevin Suttle

1
พิจารณาว่าการเขียนประวัติการดึงคำขอที่ได้รับการตรวจสอบ (หรือโดยทั่วไปมีความคิดเห็นเกี่ยวกับ / รหัสอ้างอิง) อาจนำไปสู่ความสับสนเนื่องจากประวัติจะไม่ตรงกันอีกต่อไปสิ่งที่แสดงความคิดเห็นหมายถึง ไม่มีวิธีแก้ปัญหาที่ง่าย: ใครบางคนจะปิด PR และอ้างอิงมันในใหม่ (เพื่อไม่เขียนประวัติศาสตร์); ความคิดของฉันคือการสำรองข้อมูล SHA ล่าสุดที่ถูกรีเซ็ต / เขียนใหม่และอ้างถึงในความคิดเห็นของ PR หลังจากทำการบังคับแบบกด หาก pruneไม่ลบการคอมมิทที่แยกออกไปประวัติของมันจะยังคงตรงกับความคิดเห็นของ PR
Kamafeather
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.