มีวิธีแก้ไขข้อความส่งหลังจากกระทำและส่งไปยัง GitHub หรือไม่ ฉันเห็นว่ามี 'เพิ่มบันทึกย่อ' รวมถึงความคิดเห็นแบบอินไลน์ แต่ไม่มีการแก้ไขข้อความกระทำจริง นอกจากนี้ยังมี 'แก้ไขการกระทำ' ในส่วนขยาย git แต่ไม่ได้แก้ไขข้อความที่มีอยู่
มีวิธีแก้ไขข้อความส่งหลังจากกระทำและส่งไปยัง GitHub หรือไม่ ฉันเห็นว่ามี 'เพิ่มบันทึกย่อ' รวมถึงความคิดเห็นแบบอินไลน์ แต่ไม่มีการแก้ไขข้อความกระทำจริง นอกจากนี้ยังมี 'แก้ไขการกระทำ' ในส่วนขยาย git แต่ไม่ได้แก้ไขข้อความที่มีอยู่
คำตอบ:
git rebase -i <commit hash you want to change>^
สิ่งนี้จะเปิดตัวแก้ไขเริ่มต้นของคุณ (โดยปกติคือvi ) พร้อมรายการการกระทำและการกระทำสำหรับแต่ละรายการ pick
โดยค่าเริ่มต้นการกระทำที่เป็น
สำหรับท่านใดกระทำคุณต้องการที่จะเปลี่ยนข้อความเปลี่ยนไปpick
reword
บันทึกและเลิก (ใน vi: :wq
)
สำหรับการกระทำแต่ละครั้งคุณจะได้รับโปรแกรมแก้ไขเพื่อแก้ไขข้อความการส่งข้อความ เปลี่ยนตามที่เห็นสมควรให้บันทึกและออก
เมื่อคุณแก้ไขข้อความกระทำทั้งหมดเสร็จแล้วคุณจะกลับสู่พรอมต์คำสั่งและมีแผนผังใหม่พร้อมข้อความที่อัปเดต
ขณะนี้คุณสามารถอัปโหลดไปยัง GitHub git push origin --force
โดยใช้
หากคุณเพียงแค่ต้องแก้ไขกระทำของคุณที่ผ่านมาคุณสามารถเปลี่ยนขั้นตอนที่ 1-4 git commit --amend
กับ
^
อยู่ที่นั่น - ฉันแนะนำให้ทำการรีบูทบนพาเรนต์ของการคอมมิทที่คุณต้องการเปลี่ยน
^^
เพื่อจบคำสั่งด้วยตัวอักษร^
เช่น: git rebase -i 2c747b32^^
ใน Intellij Idea คุณสามารถทำได้ง่าย
git push origin --force
ตามที่แนะนำในคำตอบของ @ Mureinik
ถ้า git-graph ของคุณดูเหมือน ...
O target-commit that you want to change its message [df9c192]
|
O parent-commit [b7ec061]
|
O
( df9c192
และb7ec061
เป็นแฮชการกระทำของการกำหนดเป้าหมายและพาเรนต์การกระทำแยกต่างหาก)
คุณสามารถพิมพ์คำแนะนำต่อไปนี้ ...
git reset --soft b7ec061
git commit -m "your_new_description"
git push -f
git reset --soft b7ec061
จะเก็บการเปลี่ยนแปลงของไฟล์และรีเซ็ตเป็น parent-commit (เช่น b7ec061)git commit -m "..."
จะสร้างการมอบหมายใหม่ในเครื่องgit push -f
จะผลักดันคอมมิชชันใหม่ของคุณไปยังเซิร์ฟเวอร์และแทนที่อันเก่า (เช่น df9c192)อีกตัวเลือกหนึ่งคือการสร้าง "errata commit" เพิ่มเติม (และพุช) ซึ่งอ้างอิงถึงวัตถุกระทำที่มีข้อผิดพลาด - errata กระทำใหม่ยังให้การแก้ไข คหบดีกระทำเป็นกระทำโดยไม่มีการเปลี่ยนแปลงรหัสสำคัญ แต่ที่สำคัญการกระทำข้อความ - ตัวอย่างเช่นเพิ่มตัวอักษรพื้นที่หนึ่งไปยังแฟ้ม readme --allow-empty
ของคุณและกระทำการเปลี่ยนแปลงว่ามีการกระทำที่สำคัญข้อความหรือใช้ตัวเลือกคอมไพล์ แน่นอนว่าง่ายกว่าและปลอดภัยกว่าการรีบูตมันไม่ได้แก้ไขประวัติจริงและทำให้ต้นไม้สาขาสะอาด (ใช้amend
เป็นตัวเลือกที่ดีถ้าคุณแก้ไขการคอมมิชชันล่าสุด แต่การคอมมิชชันแบบ errata อาจเป็นทางเลือกที่ดีสำหรับการคอมมิทรุ่นเก่า) ประเภทของสิ่งนี้เกิดขึ้นน้อยมากที่การบันทึกความผิดพลาดนั้นดีพอ ในอนาคตหากคุณต้องการค้นหาผ่านบันทึกการใช้คอมไพล์สำหรับคำหลักคุณลักษณะการกระทำ (ผิดพลาด) ดั้งเดิมอาจไม่ปรากฏเนื่องจากมีการใช้คำหลักผิดในการส่งต้นฉบับ (พิมพ์ต้นฉบับ) - อย่างไรก็ตามคำหลักจะปรากฏขึ้น ใน errata commit ซึ่งจะนำคุณไปยังการคอมมิทดั้งเดิมที่มีการพิมพ์ผิด นี่คือตัวอย่าง:
บันทึก $ git กระทำ 0c28141c68adae276840f17ccd4766542c33cf1d ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 15:55:52 2018 -0600 ข้อผิดพลาด Errata: การกระทำนี้ไม่มีการเปลี่ยนแปลงรหัสที่สำคัญ การกระทำนี้ให้ไว้เพื่อบันทึกการแก้ไขข้อความการส่งก่อนหน้าเท่านั้น ที่เกี่ยวข้องกับการกระทำวัตถุ e083a7abd8deb5776cb304fa13731a4182a24be1 ข้อความคอมมิชชันเดิมไม่ถูกต้อง: เปลี่ยนสีพื้นหลังเป็นสีแดง การแก้ไข (* เน้นการเปลี่ยนแปลง *): เปลี่ยนสีพื้นหลังเป็น * blue * ส่งมอบ 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4 ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 15:43:16 2018 -0600 ข้อความการส่งระหว่างกาลบางข้อความ ส่ง e083a7abd8deb5776cb304fa13731a4182a24be1 ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 13:31:32 2018 -0600 เปลี่ยนสีพื้นหลังเป็นสีแดง
คำตอบของ @Mureinikนั้นเป็นสิ่งที่ดี แต่ไม่สามารถเข้าใจได้โดยมือใหม่
วิธีแรก:
git commit --amend
คุณจะเห็น:<your existing commit mesage foo bar>
# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
# modified: foo.py
#
pick
นี่เป็นหน้าแก้ไขแล้วและคุณสามารถแก้ไขข้อความด้านบนโดยตรงและบันทึก & ออกเช่น:<your new correction commit message>
# Please enter the commit message for your changes. Lines starting
....
git push -u origin master --force
สำคัญนี่คือ<how you push normally> --force
--force
วิธีที่สอง:
คุณสามารถเห็นคอมมิชชันการแฮชโดยgit log
หรือแยกจาก url ที่เก็บตัวอย่างในกรณีของฉันคือ881129d771219cfa29e6f6c2205851a2994a8835
จากนั้นคุณสามารถทำgit rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835
หรือgit rebase -i HEAD^
(ถ้าล่าสุด)
คุณจะเห็น:
pick <commit hash> <your current commit message>
# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
noop
แล้วคุณอาจพิมพ์ผิดเช่นถ้าคุณgit rebase -i 881129d771219cfa29e6f6c2205851a2994a88
ขาดสิ่งใด^
ในตอนท้ายคุณควรออกจากตัวแก้ไขโดยไม่บันทึกและหาเหตุผล:noop
# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
noop
ปัญหาก็เพียงเปลี่ยนคำpick
เป็นreword
อื่น ๆ ก็ยังคงอยู่ (คุณไม่แก้ไขข้อความกระทำ ณ จุดนี้) เช่น:reword <commit hash> <your current commit message>
# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
# p, pick = use commit
...
<your existing commit mesage foo bar>
# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
# reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
# modified: foo.py
#
<your new correction commit message>
# Please enter the commit message for your changes. Lines starting
....
git push -u origin master --force
สำคัญนี่คือ<how you push normally> --force
--force