ฉันมี 2 คอมมิชชัน A และ B พร้อมที่จะถูกผลัก ฉันรู้ว่าฉันลืมเพิ่มบางสิ่งใน A
ฉันจะเพิ่มการเปลี่ยนแปลงนี้ใน A โดยใช้ Magit ได้อย่างไร ฉันไม่รู้ด้วยซ้ำว่าฉันควรจะดูเอกสารส่วนใดของ Git
ฉันมี 2 คอมมิชชัน A และ B พร้อมที่จะถูกผลัก ฉันรู้ว่าฉันลืมเพิ่มบางสิ่งใน A
ฉันจะเพิ่มการเปลี่ยนแปลงนี้ใน A โดยใช้ Magit ได้อย่างไร ฉันไม่รู้ด้วยซ้ำว่าฉันควรจะดูเอกสารส่วนใดของ Git
คำตอบ:
มาทำเป็นช่วงเวลาที่คุณต้องการเพิ่มบางอย่างในHEADการคอมมิทนั่นคือ "การคอมมิทที่สองการบี" ในตัวอย่างของคุณ
กระทำป๊อปอัพในcลักษณะผูกพัน " aแก้ไข" การกดปุ่มนั้นจะ "แก้ไข" การเปลี่ยนแปลงตามขั้นตอนของHEADการส่ง เนื่องจากคอมมิทไม่สามารถเปลี่ยนแปลงได้ใน Git สิ่งนี้จะแทนที่การคอมมิชชันเก่าด้วยการคอมมิทใหม่ บัฟเฟอร์ที่มีข้อความการส่งข้อความเก่าจะปรากฏขึ้นเพื่อให้คุณสามารถแก้ไขได้ในกรณีที่การเปลี่ยนแปลงที่เพิ่มเข้ามานั้นต้องการให้คุณปรับข้อความด้วย เช่นเคยกดC-c C-cเมื่อคุณแก้ไขข้อความเสร็จแล้ว นี่เทียบเท่ากับการรันgit commit --amendบนบรรทัดคำสั่ง
HEADและแก้ไขข้อความคอมมิชชันเนื่องจากมันมักจะเกิดขึ้นที่คุณเพียงแค่ต้องปรับเปลี่ยนการเปลี่ยนแปลงหรือข้อความ Magit มีสองรูปแบบเพิ่มเติม:
HEADโดยไม่ต้องแก้ไขข้อความยืนยันHEADโดยไม่เพิ่มการเปลี่ยนแปลงแบบ stagedเมื่อคุณต้องการแก้ไขการคอมมิชชันที่ไม่ได้HEADดำเนินการด้านบนจะไม่ทำงาน คำสั่งเหล่านี้มักจะ "แก้ไข" (เช่นแทนที่) การHEADกระทำ Git ไม่ได้ให้คำสั่งเดียวสำหรับการแก้ไขการคอมมิชชันอื่นนอกจากHEADนี้จะเกี่ยวข้องกับอีกเล็กน้อย
Magit ไม่ให้คำสั่งดังกล่าว แต่เนื่องจากมีสถานการณ์ที่มันเป็นที่นิยมในการทำเช่นนี้ในหลายขั้นตอนเราจะหารือว่าครั้งแรก
การแก้ไขการคอมมิตอื่น ๆHEADสามารถแบ่งออกเป็นสามขั้นตอน:
A)HEADHEAD(ตามที่กล่าวไว้ข้างต้น) A'ส่งผลในการกระทำAA'สิ่งนี้สามารถทำได้โดยใช้ rebase แบบโต้ตอบ พิมพ์rเพื่อแสดงป๊อปอัป rebase จากนั้นพิมพ์mเพื่อเรียกใช้ตัวเลือกการรีบูต "แก้ไขการกระทำ" บัฟเฟอร์ที่มีการกระทำล่าสุดปรากฏขึ้น ย้ายไปที่รายการที่คุณต้องการแก้ไขและพิมพ์C-c C-cเพื่อเลือก จากนั้น Git จะย้อนประวัติไปยังการยืนยันและแสดงข้อมูลเกี่ยวกับการรีบูตอย่างต่อเนื่องในบัฟเฟอร์สถานะ
แก้ไขHEADตามที่อธิบายไว้ข้างต้น แล้วบอก Git r rที่คุณจะทำโดยการพิมพ์ หากA'และBข้อขัดแย้งการปฏิเสธจะหยุดที่Bและคุณต้องแก้ไขข้อขัดแย้ง หลังจากเสร็จแล้วกดr rเพื่อดำเนินการต่อ
หากคุณรู้ว่าการเปลี่ยนแปลงของคุณAจะส่งผลให้เกิดข้อขัดแย้งBให้ดำเนินการตามที่อธิบายไว้ข้างต้นหรือใช้วิธีการต่อไปนี้
Git ช่วยให้การสร้าง "กระทำ fixup" git commit --fixup Aโดยใช้ สิ่งนี้จะสร้างคอมมิชชันใหม่ซึ่งบันทึกการเปลี่ยนแปลงที่ "ควรทำในการคอมมิชชันอื่น" HEADที่กระทำจะกลายเป็นใหม่ นอกจากนี้ยังมี--squashตัวแปร สำหรับข้อมูลเกี่ยวกับความแตกต่างให้ดูที่git-commitหน้าคน
เมื่อต้องการรวมการคอมมิชชันAและการคอมมิชชันใหม่A'จากนั้นนำมาใช้ใหม่นอกเหนือBจากนั้นคุณต้องใช้การรีบูท Magit r fมีคำสั่งที่สะดวกสำหรับการทำเช่นนั้นใน
ความแตกต่างที่สำคัญกับวิธีการข้างต้นคือที่นี่เราสร้างคำสั่งใหม่ก่อนแล้วจึงรีบูตเพื่อรวมเข้ากับ "เป้าหมาย" และนำBไปใช้ใหม่ ด้านบนเราเริ่มต้นด้วยการรีบูตแทนที่จะกระทำ
ใน Magit ทั้งสอง--fixupและ--squashตัวแปรมีให้เลือกจากป๊อปอัป commit, on fและs. แต่ Magit นอกจากนี้ยังมี "ทันที" สายพันธุ์ของ fixup และสควอชคำสั่งบนและF Sตัวแปรเหล่านี้สร้างคอมมิทใหม่เช่นชุด "ไม่ใช่ทันใจ" แต่จากนั้นจะรวมคอมมิต fixup คอมมิวนิตี้กับการคอมมิชชันเป้าหมายโดยใช้ rebase โดยที่คุณไม่ต้องเรียกใช้คำสั่งอื่นอีก
"ทันที fixup" ( c F) เป็นหลักเป็นสิ่งเดียวกับ "ขยายHEAD" ( c e) ยกเว้นว่าการทำงานสำหรับการใด ๆ HEADกระทำไม่ได้เป็นเพียง
อ่านเพิ่มเติม:
git-commit(1)git-rebase(1)git-commitman page เปลี่ยนเส้นทางไปgit-rebase(1)ที่มีบรรทัดเหล่านี้: ข้อความคอมมิชชันที่แนะนำสำหรับการคอมมิทแบบ folded คือการรวมข้อความคอมมิทของการคอมมิทครั้งแรกและคอมมิทด้วยคำสั่ง "squash" แต่จะไม่คอมมิทข้อความคอมมิท คำสั่ง IOW ใช้fixupหากคุณต้องการแก้ไขโค้ดในการคอมมิชชันก่อนหน้าใช้สควอชหากคุณต้องการแก้ไขข้อความคอมมิชชัน
git commit --amend –C HEADเป็นคำสั่ง Git คุณต้องการที่จะมองหาและคุณสามารถทำชดใช้ใน Magit C-c C-aกับ
C-c C-aมาจากรุ่นเก่ากว่า (ฉันคิดว่า) นอกจากนี้ฉันไม่เห็นร่องรอยของ "การแก้ไข" ในบัฟเฟอร์ความช่วยเหลือ ( ?)
ดังนั้นหนึ่งเวิร์กโฟลว์คือ:
แล้วก็
Autosquash จะทำการย้ายโดยอัตโนมัติ! fixup ส่งไปยังตำแหน่งที่ถูกต้องและตั้งค่าให้ถูกบีบบนฐานอีกครั้ง
i Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.ยกเว้นว่าฉันไม่มีการเปลี่ยนแปลงใด ๆ : /
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort. พยายามบอกฉันหรือไม่ว่าการแก้ไขของฉันอาจเซ่อการผสานที่กำลังจะมาถึง?
merge in rebaseดู BUGS git help rebaseภายใต้ ฉันแนะนำให้ทำการ fixup ก่อนดึง upstream
สำหรับการทำลายการคอมมิชชันสุดท้ายมันคือ "c a" Fixup ใช้สำหรับการคอมมิชชันเก่า ๆ