ฉันมี 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
)HEAD
HEAD
(ตามที่กล่าวไว้ข้างต้น) A'
ส่งผลในการกระทำA
A'
สิ่งนี้สามารถทำได้โดยใช้ 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-commit
man 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 ใช้สำหรับการคอมมิชชันเก่า ๆ