เพิ่มการเปลี่ยนแปลงให้กับการคอมมิชชันก่อนหน้าด้วย Magit


42

ฉันมี 2 คอมมิชชัน A และ B พร้อมที่จะถูกผลัก ฉันรู้ว่าฉันลืมเพิ่มบางสิ่งใน A

ฉันจะเพิ่มการเปลี่ยนแปลงนี้ใน A โดยใช้ Magit ได้อย่างไร ฉันไม่รู้ด้วยซ้ำว่าฉันควรจะดูเอกสารส่วนใดของ Git

คำตอบ:


67

มาทำเป็นช่วงเวลาที่คุณต้องการเพิ่มบางอย่างในHEADการคอมมิทนั่นคือ "การคอมมิทที่สองการบี" ในตัวอย่างของคุณ

กระทำป๊อปอัพในcลักษณะผูกพัน " aแก้ไข" การกดปุ่มนั้นจะ "แก้ไข" การเปลี่ยนแปลงตามขั้นตอนของHEADการส่ง เนื่องจากคอมมิทไม่สามารถเปลี่ยนแปลงได้ใน Git สิ่งนี้จะแทนที่การคอมมิชชันเก่าด้วยการคอมมิทใหม่ บัฟเฟอร์ที่มีข้อความการส่งข้อความเก่าจะปรากฏขึ้นเพื่อให้คุณสามารถแก้ไขได้ในกรณีที่การเปลี่ยนแปลงที่เพิ่มเข้ามานั้นต้องการให้คุณปรับข้อความด้วย เช่นเคยกดC-c C-cเมื่อคุณแก้ไขข้อความเสร็จแล้ว นี่เทียบเท่ากับการรันgit commit --amendบนบรรทัดคำสั่ง

  • a แก้ไข - เพิ่มการเปลี่ยนแปลงตามขั้นตอนHEADและแก้ไขข้อความคอมมิชชัน

เนื่องจากมันมักจะเกิดขึ้นที่คุณเพียงแค่ต้องปรับเปลี่ยนการเปลี่ยนแปลงหรือข้อความ Magit มีสองรูปแบบเพิ่มเติม:

  • e ขยาย - เพิ่มการเปลี่ยนแปลงตามขั้นตอนเป็นHEADโดยไม่ต้องแก้ไขข้อความยืนยัน
  • w Reword - เปลี่ยนข้อความHEADโดยไม่เพิ่มการเปลี่ยนแปลงแบบ staged

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

Magit ไม่ให้คำสั่งดังกล่าว แต่เนื่องจากมีสถานการณ์ที่มันเป็นที่นิยมในการทำเช่นนี้ในหลายขั้นตอนเราจะหารือว่าครั้งแรก

การแก้ไขการคอมมิตอื่น ๆHEADสามารถแบ่งออกเป็นสามขั้นตอน:

  1. ชั่วคราวให้ที่อื่น ๆ ที่กระทำ ( A)HEAD
  2. ปรับเปลี่ยนHEAD(ตามที่กล่าวไว้ข้างต้น) A'ส่งผลในการกระทำ
  3. บอก Git นำไปใช้ใหม่กระทำที่เกิดขึ้นตามแต่ด้านบนของ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กระทำไม่ได้เป็นเพียง


อ่านเพิ่มเติม:


ใส! ขอบคุณแพคเกจสุดเจ๋ง BTW
Mathieu Marques

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

ขอบคุณสำหรับคำตอบนี้ทาร์เซียสมันใช้ได้กับฉันจริงๆ
anquegi

ความชัดเจนของครึ่งแรกของคำอธิบายนี้ทำให้การอ่านครึ่งหลังซึ่งยากต่อการติดตามค่อนข้างน่าผิดหวัง!
Lyn Headley

git-commitman page เปลี่ยนเส้นทางไปgit-rebase(1)ที่มีบรรทัดเหล่านี้: ข้อความคอมมิชชันที่แนะนำสำหรับการคอมมิทแบบ folded คือการรวมข้อความคอมมิทของการคอมมิทครั้งแรกและคอมมิทด้วยคำสั่ง "squash" แต่จะไม่คอมมิทข้อความคอมมิท คำสั่ง IOW ใช้fixupหากคุณต้องการแก้ไขโค้ดในการคอมมิชชันก่อนหน้าใช้สควอชหากคุณต้องการแก้ไขข้อความคอมมิชชัน
Yasushi Shoji

3

git commit --amend –C HEADเป็นคำสั่ง Git คุณต้องการที่จะมองหาและคุณสามารถทำชดใช้ใน Magit C-c C-aกับ


ฉันใช้ Magit รุ่นล่าสุดC-c C-aมาจากรุ่นเก่ากว่า (ฉันคิดว่า) นอกจากนี้ฉันไม่เห็นร่องรอยของ "การแก้ไข" ในบัฟเฟอร์ความช่วยเหลือ ( ?)
Mathieu Marques

ดูคำตอบของRémiสำหรับ magit 2.x ที่เทียบเท่า
npostavs

3

ดังนั้นหนึ่งเวิร์กโฟลว์คือ:

  • ทำการเปลี่ยนแปลงของคุณ
  • c (ส่งมอบ) f (แก้ไข - เลือกส่งซ่อมของคุณ)

แล้วก็

  • r (rebase) -a (autosquash สามารถเป็นค่าเริ่มต้น) i (แบบโต้ตอบ)

Autosquash จะทำการย้ายโดยอัตโนมัติ! fixup ส่งไปยังตำแหน่งที่ถูกต้องและตั้งค่าให้ถูกบีบบนฐานอีกครั้ง


สิ่งเดียวที่ฉันทำในสิ่งที่คุณไม่ได้พูดคือการแสดงระหว่างกระสุนนัดแรกของคุณกับกระสุนนัดที่สอง กดปุ่มอัตราผลตอบแทนฉันi Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.ยกเว้นว่าฉันไม่มีการเปลี่ยนแปลงใด ๆ : /
Mathieu Marques

พยายามอีกครั้งหลังจากดึง, Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort. พยายามบอกฉันหรือไม่ว่าการแก้ไขของฉันอาจเซ่อการผสานที่กำลังจะมาถึง?
Mathieu Marques

@MathieuMarques: "ยกเว้นฉันไม่มีการเปลี่ยนแปลงใด ๆ ที่ไม่มีข้อผูกมัด" - git คิดว่าคุณทำ หมายเหตุข้อความแนะนำการเปลี่ยนแปลงแบบ staged ไม่ใช่แบบ unstaged Re: merge in rebaseดู BUGS git help rebaseภายใต้ ฉันแนะนำให้ทำการ fixup ก่อนดึง upstream
npostavs

1

สำหรับการทำลายการคอมมิชชันสุดท้ายมันคือ "c a" Fixup ใช้สำหรับการคอมมิชชันเก่า ๆ


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