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

ในฐานะผู้ใช้ Git ฉันมักจะเจอสถานการณ์นี้เป็นประจำ โดยฉันต้องแก้ไขการคอมมิตอย่างน้อย 1 รายการในลักษณะที่ไม่เหมาะกับ --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 สำหรับข้อความคอมมิตที่การแก้ไข/แก้ไขคอมมิตไม่เหมาะสม


person bentolor    schedule 31.05.2013    source แหล่งที่มา
comment
ถ้าสิ่งที่คุณทำคือ git reset head~1 ข้อความยืนยันเก่าของคุณจะไม่เป็นเพียงรายการที่สองใน reflog หรือไม่   -  person    schedule 31.05.2013
comment
ใช่ - แต่ฉันจะใช้ข้อความซ้ำได้อย่างไรโดยไม่ต้องคัดลอกและวาง (ซึ่งโดยทั่วไปต้องใช้การยกเลิกการเยื้องด้วยตนเอง)   -  person bentolor    schedule 02.06.2013
comment
ทุกวันนี้แค่มี gitk เปิด ด้วยวิธีนี้คุณจะไม่ต้องใช้ reflog ด้วยซ้ำ หรือใช้ rev-parse <branch> เพื่อรับแฮชของคุณก่อนทำการรีเซ็ต และใช้คำตอบของ ibizaman   -  person cst1992    schedule 18.11.2016


คำตอบ (4)


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

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

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

git commit -C HEAD@{1}

คุณสามารถใช้ตัวเลือกอื่นๆ ที่กำหนดโดย @user2718704

person ibizaman    schedule 19.09.2014
comment
สั้นกว่า: git commit -C@@{1} - person Phu Ngo; 24.07.2018
comment
นี่เป็นการใช้งาน reflog ที่ยอดเยี่ยม - person David Mann; 11.09.2018
comment
หลังจากรีเซ็ต ORIG_HEAD จะถูกตั้งค่า ฉันพบว่า git commit --reuse-message=ORIG_HEAD มีความชัดเจนที่สุด - person Scott Jacobsen; 11.04.2019

เมื่อรันคำสั่ง "git commit" คุณจะต้องตรวจสอบตัวเลือกต่อไปนี้

เพื่อนำกลับมาใช้ใหม่

--reuse-message=<commit>

หากต้องการแก้ไขการใช้ซ้ำ

--reedit-message=<commit>

หากต้องการเปลี่ยนผู้เขียน

--reset-author
person user2718704    schedule 26.08.2013
comment
ทำเครื่องหมายว่านี่เป็นโซลูชันใหม่ เนื่องจากนี่เป็นคำตอบที่ครอบคลุมที่สุด แม้ว่าโซลูชันนี้จะยังไม่สามารถแก้ไขปัญหา 'การดึงข้อมูล' ของฉันได้อย่างสมบูรณ์ - person bentolor; 27.08.2013

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

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

person mart1n    schedule 31.05.2013
comment
เมื่อทำการรีบูตแบบโต้ตอบ คุณสามารถใช้คำสั่ง fixup เพื่อประกาศว่าการคอมมิตในภายหลังคือการแก้ไขการคอมมิตก่อนหน้า และจะใช้ข้อความคอมมิตจากต้นฉบับโดยอัตโนมัติ โดยละทิ้งข้อความจากการคอมมิตการแก้ไข - person qqx; 31.05.2013
comment
ตัวอย่างเช่น หากฉันต้องการรวมคำขอดึงที่อัปเดตแบบบังคับอีกครั้ง หรือถ้าการคอมมิตไม่ใช่อันสุดท้ายและไม่สามารถแก้ไขได้ง่าย ๆ ตาม HEAD และทำซ้ำได้ง่ายกว่า - person bentolor; 02.06.2013
comment
@BenTebulin การรีเบสแบบโต้ตอบช่วยให้คุณแก้ไขการคอมมิตใด ๆ ในช่วงของการคอมมิตที่ระบุ ไม่จำเป็นต้องแก้ไข HEAD อย่างเคร่งครัด - person mart1n; 02.06.2013
comment
@ mart1n ขอขอบคุณที่เน้น แก้ไข ใน rebase -i ไม่เคยใช้ในบริบทนั้น สำหรับกรณีที่เหลือ เช่น การรวมใหม่ คำตอบอื่นจะเหมาะสมกับคำถามของฉันมากกว่า ดังนั้นฉันจึงทำเครื่องหมายคำตอบนั้นเป็นคำตอบ - person bentolor; 02.06.2013
comment
Intellij มีขอบเขตที่ทำงานเฉพาะกับไฟล์ที่ยังไม่ได้คอมมิตเท่านั้น การรีเซ็ตไฟล์เป็นแบบไม่มีข้อผูกมัดมีประโยชน์มาก เพื่อให้สามารถสั่งให้ Intellij lint ไฟล์ได้ เป็นต้น จากนั้นส่งไฟล์เหล่านั้นอีกครั้งด้วยข้อความเดียวกัน การแก้ไขจะไม่ได้ผลเนื่องจากข้อ จำกัด ของขอบเขตของ Intellij - person David Mann; 11.09.2018

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

person Joe    schedule 02.06.2013
comment
ขอบคุณ - มันค่อนข้างใกล้เคียงกับสิ่งที่ฉันกำลังมองหา - person bentolor; 02.06.2013