Git: แก้ไขข้อความคอมมิทก่อนหน้านี้เท่านั้น


12

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

ฉันจะแก้ไขเฉพาะข้อความของการคอมมิชชันก่อนหน้าและ (ถ้าเป็นไปได้) ทำให้แผนผังการคอมมิท


10
ระวังการเปลี่ยนแปลงประวัติศาสตร์สาธารณะ!
D. Ben Knoble

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

ฉันจะใช้มันด้วยสาเหตุฉันมีกรณีที่ง่ายกว่าที่นี่ฉันเป็นคนเดียวที่ใช้ repo นี้
Tuyen Pham

3
ข้อมูล: นี่คือถามแล้ว (อาจจะหลายครั้ง) บนกองมากเกิน
user202729

คำตอบ:


20

ในการแก้ไขข้อความคอมมิทของชุดการคอมมิชชันฉันรัน

git rebase -i firstsha

ที่firstshaเป็นตัวระบุสำหรับการกระทำหลักของการกระทำแรกที่ฉันต้องการแก้ไข (คุณสามารถใช้การอ้างอิงที่ถูกต้องที่นี่ดังนั้นgit rebase -i HEAD~4จะแสดงคอมมิทสี่ครั้งล่าสุด)

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

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

หากต้องการแก้ไขเฉพาะการส่งครั้งล่าสุดอย่างรวดเร็วให้เรียกใช้

git commit --amend

(แต่ระวังสิ่งที่ฉากไว้สำหรับการกระทำแม้ว่า)


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

3
มันจะไม่สร้าง "บรรทัด" ใหม่ในแผนผังการส่งข้อมูลของคุณ แต่จะเปลี่ยนการกระทำทั้งหมด หากประวัติของคุณเป็นแบบเส้นตรงประวัติของคุณจะเป็นแบบเส้นตรง
Stephen Kitt

มันขึ้นอยู่กับ. คุณกำลังใช้งานด้วยตัวเองและไม่ไปที่เซิร์ฟเวอร์หรือไม่? จากนั้นไม่เพียงหนึ่ง "บรรทัด" แต่อย่างอื่นอาจมีสองและตามคำตอบของคุณกับสองคนแรกเราสามารถช่วยคุณกำจัด "บรรทัด" เก่า
Captain Man

1
Rebase จะมีธงสำหรับจัดการการรวม (ฉันคิดว่ามันpreserve-merges)
D. Ben Knoble

6

git rebaseสิ่งที่คุณกำลังมองหาอยู่

หากคุณต้องการเปลี่ยนgit commitข้อความก่อนหน้านี้เท่านั้นคุณจำเป็นต้องใช้ข้อความต่อไปนี้:

git commit --amend

และทำการเปลี่ยนแปลงที่คุณต้องการกระทำก่อนหน้านี้แล้วบันทึกการแก้ไข

rebaseแต่ถ้าคุณต้องเปลี่ยนการกระทำเก่าที่คุณจำเป็นต้องใช้

git rebase -i HEAD~N 

เมื่อ N เท่ากับจำนวนการคอมมิทที่คุณต้องการกลับไปเช่น 2 หรือ 12 หรือ 6 เป็นต้น

ที่นี่คุณควรได้รับโปรแกรมแก้ไขข้อความที่มีความมุ่งมั่นของคุณ เปลี่ยนตัวเลือกจากpickเป็นrewordเป็นข้อความ

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

git push --force

และคุณควรรักษาประวัติของคอมไพล์ของคุณแม้ว่าจะมีค่าแฮชต่างกันเพราะคุณได้ทำการเปลี่ยนแปลงที่จำเป็นตามที่คุณต้องการ นี่คือลิงค์เพิ่มเติมบางส่วนที่คุณควรตรวจสอบ:

7.6 เครื่องมือ Git - ประวัติการเขียน
ซ้ำวิธีใช้ GitHub - การเปลี่ยนข้อความ Commit
StackOverflow - คำถามเกี่ยวกับการเปลี่ยนข้อความยืนยันเก่า


หากคุณ“ reword” คุณไม่จำเป็นต้อง“ commit --amend” เว้นแต่ว่าคุณจะทำสิ่งที่ผิดพลาด
Stephen Kitt

ขอขอบคุณที่นี่ขั้นตอนที่ฉันจะทำตามความเข้าใจของผมจากการโพสต์ของคุณ: 1. ทำgit rebase -i firstshaว่าfirstshaเป็นผู้ปกครองกระทำกัญชาของการกระทำที่ฉันต้องการที่จะเปลี่ยนข้อความจากนั้นในการแก้ไขเปลี่ยนแปลงpickไปreword, enterข้อความใหม่แล้วปัญหาgit rebase --continueและทำgit push --forceอย่างไร
Tuyen Pham

@StephenKitt ฉันเพิ่งสังเกตเห็นคำตอบของคุณฉันทำของฉันตามที่คุณส่งของคุณ ฉันจะทำตามคำแนะนำของคุณและมองหาการแก้ไขเหล่านั้น ถ้ามันเหมาะสมกว่าฉันสามารถรวมคำตอบของฉันเข้ากับคุณโดยเพิ่มลิงค์ไปยังของคุณถ้าคุณรู้สึกว่ามันจะเหมาะกับคำถามนี้ดีกว่ามีคำตอบที่คล้ายกันหลายอย่าง
kemotep

@TuyenPham คุณเพียง แต่ต้องทำgit rebase -i HEAD~Nโดย N เป็นจำนวนการตอบกลับที่คุณต้องการจะไป เปลี่ยนทุกตัวเลือกกระทำที่คุณต้องการแก้ไขข้อความจากpickเป็นrewordบันทึกไฟล์นี้ทำการเปลี่ยนแปลงไฟล์กระทำแต่ละรายการและบันทึก git push --force [Name of git branch you are were working on]เมื่อคุณมีความมั่นใจที่คุณทำคุณจะต้อง คุณสามารถย้อนกลับไปทำสิ่งนี้อีกครั้งหรือทำมันเป็นระยะ ๆ
kemotep
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.