Git: จะใช้ซ้ำ / เก็บข้อความคอมมิตหลังจาก 'git reset' ได้อย่างไร?


104

ในฐานะที่เป็นผู้ใช้ Git ฉันมักจะเจอสถานการณ์นี้ฉันจึงจำเป็นต้องทำการคอมมิตใหม่อย่างน้อยหนึ่งครั้งในลักษณะที่ไม่เข้ากับ--amendหรือrebase -iกับการแก้ไข โดยปกติฉันจะทำอะไรบางอย่างเช่น

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

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

มีวิธีที่ดีกว่าในการจัดการกับสิ่งนี้หรือไม่? และจะเป็นอย่างไรถ้าฉันประกอบด้วยมากกว่าหนึ่งการกระทำ?

แก้ไข:หลังจากคิดเกี่ยวกับสิ่งนี้เล็กน้อยฉันคิดว่าสิ่งที่ฉันกำลังมองหาคือฟังก์ชันการทำงานที่เหมือนgit stash -like สำหรับส่งข้อความที่แก้ไข / แก้ไขคอมมิชชันไม่เหมาะสม


2
ถ้าคุณทำทั้งหมดgit reset head~1ข้อความคอมมิตเก่าของคุณจะไม่เป็นเพียงรายการที่ 2 ในreflog?

ใช่ - แต่ฉันจะสามารถนำข้อความกลับมาใช้ใหม่โดยไม่ต้องคัดลอกและวางได้อย่างไร (ซึ่งโดยปกติจะต้องมีการยกเลิกการเยื้องด้วยตนเอง)
Bentolor

ทุกวันนี้เพิ่งมีgitkเปิด ด้วยวิธีนี้คุณจะไม่ต้องใช้ reflog หรือใช้rev-parse <branch>เพื่อรับแฮชของคุณก่อนการรีเซ็ตและใช้คำตอบโดย ibizaman
cst1992

คำตอบ:


144

หลังจากนั้นgit resetซับเดียวนี้สามารถทำได้:

git commit --reuse-message=HEAD@{1}

หรือสั้นกว่านั้น:

git commit -C HEAD@{1}

คุณสามารถใช้ตัวเลือกอื่น ๆ ที่ได้รับจาก@ user2718704


6
สั้นกว่า:git commit -C@@{1}
ภูเงิน

2
นี่เป็นการใช้ reflog ที่ยอดเยี่ยม
David Mann

24
หลังจากรีเซ็ต ORIG_HEAD จะถูกตั้งค่า ฉันคิดว่าgit commit --reuse-message=ORIG_HEADจะชัดเจนที่สุด
Scott Jacobsen

45

เมื่อเรียกใช้คำสั่ง "คอมมิต" คุณต้องตรวจสอบตัวเลือกต่อไปนี้

เพื่อใช้ซ้ำ

--reuse-message=<commit>

หากต้องการแก้ไขเกี่ยวกับการใช้ซ้ำ

--reedit-message=<commit>

ในการเปลี่ยนผู้แต่ง

--reset-author

1
ทำเครื่องหมายว่านี่เป็นโซลูชันใหม่เนื่องจากเป็นคำตอบที่ครอบคลุมที่สุด แม้ว่าวิธีนี้จะยังไม่สามารถแก้ปัญหา 'การดึงข้อมูล' ของฉันได้อย่างเต็มที่
Bentolor

9

ทำไมต้องรีเซ็ตถ้าคุณสามารถแฮ็กแก้ไขแฮ็คแล้วเรียกใช้ git commit --amend --no-edit ; ดังนั้นการรักษาข้อความยืนยันเดิมของคุณ

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


2
เมื่อทำ rebase แบบโต้ตอบคุณสามารถใช้fixupคำสั่งเพื่อประกาศว่าการกระทำในภายหลังคือการแก้ไขการกระทำก่อนหน้านี้และจะใช้ข้อความการกระทำโดยอัตโนมัติจากข้อความเดิมที่ทิ้งข้อความจากการแก้ไขการแก้ไข
qqx

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

@BenTebulin ดี rebase แบบโต้ตอบช่วยให้คุณแก้ไขการกระทำใด ๆ ในช่วงของการกระทำที่ระบุ การกระทำ HEAD ไม่เคร่งครัดที่ต้องแก้ไข
mart1n

@ mart1n ขอบคุณสำหรับการออกมาด่าแก้ไขrebase -iใน ไม่เคยใช้ในบริบทนั้น สำหรับกรณีที่เหลือเช่นการรวมคำตอบอีกครั้งนั้นเหมาะสมกับคำถามของฉันมากกว่าฉันจึงทำเครื่องหมายข้อนั้นเป็นคำตอบ
bentolor

Intellij มีขอบเขตที่ดำเนินการกับไฟล์ที่ยังไม่ได้รับการยืนยันเท่านั้น มีประโยชน์ในการรีเซ็ตไฟล์เป็น uncommitted เพื่อให้ intellij สามารถสั่งให้ทับไฟล์ได้ตัวอย่างเช่นจากนั้นคอมมิตไฟล์เหล่านั้นอีกครั้งด้วยข้อความเดียวกัน แก้ไขไม่ได้ผลเนื่องจากข้อ จำกัด ของขอบเขตของ intellij
David Mann

5

คุณสามารถพิจารณาgit commit --reset-author -c <commit>นำข้อความคอมมิตกลับมาใช้ใหม่พร้อมการแก้ไขและเวลาปัจจุบัน


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