ใน git ฉันจะสร้างแพตช์เดียวสำหรับการแก้ไข 2+ ครั้งล่าสุดได้อย่างไร

ฉันต้องการสร้างแพทช์สำหรับการแก้ไข 2 ครั้งล่าสุด

git format-patch -2

ให้ไฟล์แพทช์ 2 ไฟล์แก่ฉัน หนึ่งไฟล์สำหรับการแก้ไขแต่ละครั้ง

git format-patch HEAD~2..HEAD

ให้สิ่งเดียวกัน

git format-patch -1 HEAD~2..HEAD

ให้ไฟล์เดียว แต่มีเพียงการเปลี่ยนแปลงสำหรับการแก้ไขครั้งล่าสุด

มีวิธีใดที่จะทำเช่นนี้ในคอมไพล์?


person Matthew    schedule 07.02.2010    source แหล่งที่มา
comment
คุณช่วยบอกเราเพิ่มเติมเกี่ยวกับบริบทของสิ่งที่คุณต้องการทำได้ไหม คุณตระหนักถึงความสามารถในการสควอชคอมมิตร่วมกับรีเบสแบบโต้ตอบหรือไม่? ถ้าเป็นเช่นนั้น ทำไมคุณถึงอยากจะสควอชแพตช์ที่คุณส่งให้ผู้อื่น แต่ไม่ใช่คอมมิตที่เกี่ยวข้องในประวัติของคุณ?   -  person Greg Bacon    schedule 08.02.2010
comment
@gbacon: จริง ๆ แล้วฉันได้เรียนรู้เกี่ยวกับการรีเบสหลังจากโพสต์คำถามนี้ไม่นาน คุณพูดถูกว่ามันเป็นวิธีแก้ไขปัญหาของฉันที่ดีกว่า ถึงกระนั้น การรู้วิธีการทำเช่นนี้ก็ไม่เสียหายอะไร   -  person Matthew    schedule 08.02.2010
comment
@GregBacon: สิ่งหนึ่งที่ฉันทำบ่อยตอนนี้คือ: ทำงานในสาขาฟีเจอร์โดยมีคอมมิตเล็กๆ น้อยๆ มากมาย เมื่อถึงเวลาต้องดันกิ่งให้เป็นมาสเตอร์ ให้สควอชก่อน แต่ในระหว่างนี้ ฉันใช้ git diff master mybranch เพื่อส่งแพตช์เพื่อตรวจสอบ ในขณะที่ยังคงรักษาประวัติการคอมมิตเล็กๆ น้อยๆ ของฉันไว้ (เพื่อการใช้งานของฉันเอง)   -  person Matthew    schedule 21.08.2012
comment
เป็นไปได้ที่ซ้ำกันของ คุณสควอชคอมมิตอย่างไร เป็นแพตช์เดียวด้วย git format-patch?   -  person Damien    schedule 20.08.2013


คำตอบ (4)


git diff HEAD~2..HEAD > my-patch.diff

จะไม่มีข้อมูลเมตาต่อคอมมิตของ format-patch ใด ๆ

person Tobu    schedule 07.02.2010
comment
อย่างชัดเจน. ควรมีผู้เขียนคนไหนหากทั้งสองคอมมิตมีผู้เขียนต่างกัน? ข้อความคอมมิตสำหรับการเปลี่ยนแปลง 2 คอมมิตควรมีลักษณะอย่างไร ฯลฯ - person Jakub Narębski; 08.02.2010
comment
โปรดทราบว่าหากคุณใช้สาขาคุณลักษณะ คุณก็สามารถทำได้ git diff master mybranch > my-patch.diff เพื่อสร้างแพตช์สำหรับสาขานั้น - person Matthew; 21.08.2012

ใช้ตัวเลือก --stdout แล้ว cat ให้เป็นไฟล์

ชอบเช่นนั้น:

git format-patch HEAD~2..HEAD --stdout > changes.patch

สิ่งนี้จะเก็บข้อมูลเมตาต่อการกระทำ

person JC Brand    schedule 17.08.2012
comment
สิ่งที่คุณได้รับคือไฟล์ mbox (ไฟล์เมลที่ต่อกัน) ไม่ใช่ไฟล์แพตช์ คุณสามารถใช้กับ git am ได้ คุณจะไม่สามารถใช้เครื่องมือมาตรฐานสำหรับไฟล์แพทช์ได้ - person Tobu; 30.08.2012
comment
@Tobu: แต่บ่อยครั้งที่คุณต้องการใช้การคอมมิตกับ git am เนื่องจากสิ่งนั้นยังคงคอมมิตเหมือนเดิม แทนที่จะใช้โค้ดขนาดใหญ่เพียงหยดเดียว... - person Smar; 01.06.2016
comment
มีวิธีอ้างอิง HEAD ของต้นกำเนิดเป็นจุดเริ่มต้นของการอ้างอิงหรือไม่! นั่นคงจะน่าทึ่งมากเช่น git format-patch origin/HEAD..HEAD --stdout > changes.patch... โอ้พระเจ้า มันได้ผล - person Ray Foss; 12.06.2020
comment
วิธีแก้ปัญหานี้ดีกว่าวิธีข้างต้น - หากมีไฟล์ไบนารี่ (เช่น ไฟล์ลับ) ไฟล์เหล่านั้นจะไม่รวมอยู่ในวิธีแก้ปัญหาข้างต้น โซลูชันนี้ยังสร้างรายการคอมมิตทั้งหมดไว้ในไฟล์แพตช์ขนาดใหญ่ไฟล์เดียวซึ่งยอดเยี่ยมมาก หากคุณต้องการสควอช คุณสามารถใช้ git rebase -i ในภายหลังได้ - person John Basila; 19.10.2020

ด้วย Git 2.20 (ไตรมาสที่ 4 ปี 2018) และอีกมากมาย ตอนนี้คุณมี:

  • git format-patch --interdiff.
  • git format-patch --rangediff.

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

format-patch: อนุญาตให้ --interdiff / --rangediff ใช้กับแพทช์เดียว

เมื่อส่งแพตช์หรือซีรีส์เวอร์ชันแก้ไข อาจเป็นประโยชน์ (สำหรับผู้ตรวจสอบ) ที่จะรวมบทสรุปของการเปลี่ยนแปลงนับตั้งแต่ความพยายามครั้งก่อนในรูปแบบของ interdiff ซึ่งโดยทั่วไปจะอยู่ในจดหมายปะหน้า
อย่างไรก็ตาม มีประโยชน์ในบางครั้ง แม้ว่าจะทำให้เกิดการอ่านที่มีเสียงดังก็ตาม ในการแทรก interdiff หรือ rangediff ลงในส่วนความเห็นของแพตช์เดียวของซีรีส์ 1 แพตช์

ดู คอมมิต ee6cbf7, กระทำ 3fcc7a2, กระทำ 3b02641, กระทำ 5ac290f, กระทำ 126facf, กระทำ fa5b7ea (22 กรกฎาคม 2018) โดย Eric Sunshine (sunshineco)
(รวมโดย Junio ​​C Hamano -- gitster -- ใน กระทำ 688cb1c, 17 ก.ย. 2018)

ดังนั้น ให้ขยาย git format-patch --interdiff=<prev> เพื่อแทรกส่วนแทรกในส่วนความเห็นของแพตช์เดียว แทนที่จะต้องใช้จดหมายปะหน้า
ส่วนแทรกนั้นถูกเยื้องไว้เพื่อหลีกเลี่ยงไม่ให้ git-am และผู้อ่านที่เป็นมนุษย์สับสนในการพิจารณาว่าเป็นส่วนหนึ่งของแพตช์ที่เหมาะสม

ดู คอมมิต 40ce416, กระทำ 8631bf1, กระทำ 4ee9968, กระทำ 2e6fd71, กระทำ 31e2617, กระทำ 73a834e, กระทำ 2566865, กระทำ 87f1b2d (22 กรกฎาคม 2018) โดย Eric Sunshine (sunshineco).
(รวมโดย Junio ​​C Hamano -- gitster -- ใน กระทำ 881c019, 17 ก.ย. 2018)

ดังนั้น ให้ขยาย git format-patch --range-diff=<refspec> เพื่อแทรก range-diff ในส่วนความเห็นของแพตช์เดียว แทนที่จะต้องใช้จดหมายปะหน้า

person VonC    schedule 22.09.2018
comment
ดังนั้น git format-patch --range-diff=<commit hash> จึงสร้างแพตช์โดยมีเพียงการคอมมิตที่จำเป็น และไม่มีการเปลี่ยนแปลงตัวอักษร PATCH ในแต่ละไฟล์ใช่ไหม - person ZeroPhase; 08.05.2019
comment
@ZeroPhase ไม่มีจดหมายปะแก้เท่าที่ฉันรู้ (git-scm .com/docs/git-format-patch#Documentation/) - person VonC; 08.05.2019

คุณสามารถทำสิ่งที่ชอบ:

$ git checkout -b tmp
$ git reset HEAD~2
$ git commit -a

การคอมมิตต่อสาขา tmp จะเหมือนกับการคอมมิต 2 รายการ

person William Pursell    schedule 07.02.2010
comment
หรือ git rebase -i HEAD~2 และสควอช - person Tobu; 07.02.2010
comment
อืม โหวตคำตอบที่มีอายุมากกว่า 6 ปี! นั่นเป็นโบราณคดีที่ร้ายแรง ความคิดเห็นคงจะดีถ้าอธิบายเรื่องศพ - person William Pursell; 31.05.2016
comment
ฉันไม่ใช่ผู้ลงคะแนนเสียงลงคะแนน แต่ฉันคิดว่าเป็นเพราะมีวิธีที่ง่ายและปลอดภัยกว่าในการดำเนินการ git reset สามารถกำจัดสิ่งที่พิเศษออกไปได้ การรีบูตที่ให้ไว้ในความคิดเห็นจะปลอดภัยกว่าเล็กน้อย เนื่องจากอย่างน้อยก็จะบอกได้ว่าแผนผังงานสกปรกหรือไม่ ที่กล่าวว่าฉันคิดว่าคำตอบนี้มีคุณค่า - person Smar; 01.06.2016
comment
คำตอบนี้ช่วยฉันได้เนื่องจากฉันต้องจัดการกับการกระทำมากกว่า 20 รายการ ... - person Dror Cohen; 25.05.2017
comment
นี่เป็นวิธีที่อันตรายในการทำสิ่งต่าง ๆ หากคุณเพิ่มไฟล์ใหม่ / เปลี่ยนชื่อ - person sdevikar; 10.02.2018